喜羊羊系列之数据结构双向链表

博客:http://blog.csdn.net/muyang_ren

关于双向链表的原理很多都有说明,我这只是与前面的内核链表作个对比,同样实现数据的增删差改。

截图:

1、main.c

#include "doublelist.h"

int main(void)
{
    int num, i;
    double_plist list;

    doublelist_init(&list);              //初始化双向链表

    printf("\n请输入链表长度:");
    scanf("%d",&num);

    //增
    printf("---------------- ① ----------------\n");
    printf("----------------增加----------------\n");
    for(i=1;i<=num;i++){
        printf(">>> 增加 %d\n", i);
        doublelist_addnum(list,i);   //加入数据到双向链表
    }

    //查
    printf("---------------- ②  ----------------\n");
    printf("-----------------显示----------------\n");
    doublelist_show(list);             //显示双向链表内数据

    //删
    printf("---------------- ③  ----------------\n");
    printf("----------------删除----------------\n");
    printf("请输入要删除的数据\n");
    scanf("%d",&num);
    doublelist_del(list,num);

    //再查
    printf("----------------显示----------------\n");
    doublelist_show(list);             //显示双向链表内数据

    //修改
    printf("\n---------------- ④  ----------------\n");
    printf("----------------增加----------------\n");
    printf(">>>: n m ,则将 n 修改为 m\n");
    scanf("%d %d", &i, &num);
    doublelist_revise(list, i, num);             //显示双向链表内数据

    //再再查
    printf("----------------显示----------------\n");
    doublelist_show(list);             //显示双向链表内数据

    return 0;
}

2、头文件

doublelist.h

#ifndef __doubleLIST_H__
#define __doubleLIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int datatype;
typedef struct doublelist{
    datatype data;
    struct doublelist *next, *prior;
}double_list,*double_plist;

extern void doublelist_new(double_plist * L); //增
extern void doublelist_init(double_plist * L);//初始化表头
extern void doublelist_show(double_plist l);//查
extern void doublelist_addnum(double_plist, int);
extern void doublelist_del(double_plist ,int);//删
extern void doublelist_revise(double_plist ,int , int );//改
#endif

3、双向链表实现函数

doublelist.c

#include "doublelist.h"

//开辟新的节点空间
void doublelist_new(double_plist *list){
    *list=(double_plist)malloc(sizeof(double_list));
    if(NULL == *list){
        perror("malloc\n");
        exit(-1);
    }
}

//双向链表初始化
void doublelist_init(double_plist *list){
    *list=(double_plist)malloc(sizeof(double_list));
    if(NULL == *list){
        perror("malloc\n");
        exit(-1);
    }
    (*list)->next=(*list)->prior=(*list);
}
//在双向链表表头添加节点并赋值
void doublelist_addnum(double_plist list,int num)
{
    double_plist new;

    doublelist_new(&new); //开辟新的空间给new
    new->data = num;

    new->prior=list->prior;
    new->prior->next=new;
    new->next=list;
    list->prior=new;
}

//查
//显示双向链表内数据
void doublelist_show(double_plist list)
{
    int i=1;
    double_plist p;
    for(p=list->next; p!=list; p=p->next){
        while(i++%6==0){
            printf("\n");
        }
        printf("%d\t",p->data);
    }
    printf("\n");
}

//删
void doublelist_del(double_plist list,int num)
{
    int flag=0;   //flag  找到删除点的标志位
    double_plist p;
    for(p=list->next; p!=list; p=p->next){
        //如果找到了链表对应的值
        if(num == p->data){
            p->prior->next=p->next;
            p->next->prior=p->next;
            flag=1;          //标志位置1;
            free(p);
       }
    }
    //如果没找到链表对应的值
    if(flag==0){
        printf("***在链表中没有找到对应的值***\n");
    }

}

//修改
void doublelist_revise(double_plist list,int old_num, int new_num)
{
    int flag=0;   //flag  找到删除点的标志位
    double_plist p;
    for(p=list->next; p!=list; p=p->next){
        //如果找到了链表对应的值
        if(old_num == p->data){
            p->data = new_num;
            flag=1;          //标志位置1;
        }
    }
    //如果没修改链表对应的值
    if(flag==0){
        printf("***在链表中没有找到对应的值***\n");
    }

}
时间: 2024-10-29 04:21:14

喜羊羊系列之数据结构双向链表的相关文章

喜羊羊系列之数据结构栈链

博客地址:http://blog.csdn.net/muyang_ren 栈链数据链接示意图 top为指向最后的节点的指针,栈头为一个NULL空地址 1.头文件 head.h #ifndef __linkstack_H__ #define __linkstack_H__ #include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node{ datatype data; struct nod

喜羊羊系列之数据结构内核链表

博客地址:http://blog.csdn.net/muyang_ren 内核链表示意图 关于内核链表与简单的双向连表,是否有过疑惑 内核链表定义: struct list_head{ struct list_head *next,*prev; }; struct doublelist{ datatype data; struct list_head list; }double_list; 简单的双向链表定义: struct doublelist{ datatype data; struct d

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的

[考研系列之数据结构]数据结构概述

1.脑图 2.数据结构 2.1 抽象数据类型 表示法: (D,S,P) D:数据对象 S:D上的关系集 P:对D的基本操作集 ADT格式 ADT 抽象数据类型名{ 数据对象:<数据对象定义> 数据关系:<数据对象的定义> 基本操作:<基本操作的定义> }ADT 抽象数据类型名 基本操作的格式: 基本操作名(参数表) 初始条件:<初始条件描述> 操作结构:<操作结果描述> 2.2 分类 2.2.1 按值的不同特性 原子类型的值是不能分解的,如C中基

喜羊羊系列之【项目一】:c基础+数据结构+线程+冒泡实现《航班查询系统》

博客:http://blog.csdn.net/muyang_ren 1.实现功能: 1)信息录入 2)信息显示(按照起飞时间先后顺序显示) 3)信息查询(可根据不同的关键字进行查询) 4)信息删除 2.  要求: 1)使用链表对录入的信息进行存储 2)对录入的信息进行排序(可按起飞时间进行排序) 3)Make管理项目 3.结构体: struct flydate{ int ID; //航班号 char staddress[18]; //起点站 char arraddress[18]; //终点站