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

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

空的双向链表:

数据结构学习笔记-双向链表(C语言实现)_第1张图片

非空的双向链表:

数据结构学习笔记-双向链表(C语言实现)_第2张图片

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

数据结构学习笔记-双向链表(C语言实现)_第3张图片

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

s->prior=p;

s->next=p->next;

p->next->prior=s;

p->next=s;

***插入顺序不能乱。

删除操作如下:

数据结构学习笔记-双向链表(C语言实现)_第4张图片

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);
}

你可能感兴趣的:(数据结构)