c语言双向链表结构图,数据结构学习笔记-双向链表(C语言实现)

像前边写过的链表都是单向的,每一个节点只包含数据和下一个节点的指针,双向链表则是每个节点包含数据、上一个节点的指针以及下一个节点的指针。双向链表也可以是循环链表。如下图:

空的双向链表:

488a5dd6dda98a553d8021cd2383024f.png

非空的双向链表:

a1c0821e7d0bfe983036ef5e35574048.png

使用双向链表时,初始化方法和插入、删除方法都需要在单链表基础上做一些改变,单链表的增删只改变一个指针变量,而双向链表需要改变两个指针变量。插入操作如下:

16acdebec9bd46473fe62f317af8fd47.png

定义双向链表两个指针分别为:next、prior

s->prior=p;

s->next=p->next;

p->next->prior=s;

p->next=s;

***插入顺序不能乱。

删除操作如下:

82058b45c3830d1f5234d47b04c9007a.png

p->prior->next=p->next;

p->next->prior=p->prior;

free(p);

双向链表部分代码:

#include #include typedef int Eletype;

typedef struct Node{

Eletype data;

struct Node *next;

struct Node *prior;

}Node;

typedef Node *linkList;

void initD(linkList *l){

*l=(linkList)malloc(sizeof(Node));

(*l)->next=*l;

(*l)->prior=*l;

linkList s;

for(int i=0;i<5;i++){

s=(linkList)malloc(sizeof(Node));

s->data=rand()%100+1;

s->next=(*l)->next;

s->prior=(*l)->prior;

(*l)->next=s;

(*l)->prior=s;

}

}

void getDELE(linkList l,int index,Eletype *e){

int i=1;

//因为头节点无数据所以p指向l->next

linkList p=l->next;

while(p&&inext;

i++;

}

*e=p->data;

}

void insertDELE(linkList *l,int index,Eletype e){

int i=1;

linkList p=*l;

while(p&&inext;

i++;

}

linkList s;

s=(linkList)malloc(sizeof(Node));

s->data=e;

s->prior=p;

s->next=p->next;

p->next->prior=s;

p->next=s;

}

void deleteDELE(linkList *l,int index){

int i=1;

linkList p=*l;

while(p&&inext;

i++;

}

linkList r=p->next;

r->prior->next=r->next;

r->next->prior=r->prior;

free(r);

}

void displayDLinklist(linkList l){

Eletype e;

for(int i=1;i<=5;i++){

getDELE(l,i,&e);

printf("%d ",e);

}

printf("\n");

}

void main(){

linkList s;

initD(&s);

displayDLinklist(s);

insertDELE(&s,4,100);

displayDLinklist(s);

deleteDELE(&s,4);

displayDLinklist(s);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值