版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z498596750/article/details/79351934
像前边写过的链表都是单向的,每一个节点只包含数据和下一个节点的指针,双向链表则是每个节点包含数据、上一个节点的指针以及下一个节点的指针。双向链表也可以是循环链表。如下图:
空的双向链表:
非空的双向链表:
使用双向链表时,初始化方法和插入、删除方法都需要在单链表基础上做一些改变,单链表的增删只改变一个指针变量,而双向链表需要改变两个指针变量。插入操作如下:
定义双向链表两个指针分别为:next、prior
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
***插入顺序不能乱。
删除操作如下:
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
双向链表部分代码:
#include <stdio.h>
#include <stdlib.h>
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&&i<index){
p=p->next;
i++;
}
*e=p->data;
}
void insertDELE(linkList *l,int index,Eletype e){
int i=1;
linkList p=*l;
while(p&&i<index){
p=p->next;
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&&i<index){
p=p->next;
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);
}