①基本定义
双链表的许多操作与单链表类似,有关单链表的内容可以点此查看。
与单链表不同的是,双链表中的每个结点既包含一个指向后继结点的指针,还包含一个指向前驱结点的指针。
②存储方式与结构
和单链表类似,只是每个结点都有可以访问前驱结点的指针,因此和单链表相比,双链表在访问前驱结点时会更方便。
③实现
#include <iostream> #include <cstdlib> using namespace std; typedef int ElemType; typedef struct DNode { ElemType data; struct DNode * prior; //指向前驱结点 struct DNode * next; //指向后继结点 }DLinkNode; //双链表结点类型 /*****建立双链表*****/ /***头插法***/ void CreateListF(DLinkNode * &L,ElemType a[],int n) { DLinkNode *s; L=(DLinkNode *)malloc(sizeof(DLinkNode)); //创建头结点 L->prior=L->next=NULL; //前后指针域置于NULL for(int i=0;i<n;i++) //循环建立数据结点 { s=(DLinkNode *)malloc(sizeof(DLinkNode)); s->data=a[i]; s->next=L->next; //将s结点插入到头结点后 if(L->next != NULL) //若L存在数据结点,修改L->next的前驱指针 L->next->prior=s; L->next=s; s->prior=L; } } /*****尾插法*****/ void CreateListR(DLinkNode * &L,ElemType a[],int n) { DLinkNode *s,*r; L=(DLinkNode *)malloc(sizeof(DLinkNode)); //创建头结点 r=L; //r始终指向尾结点,开始时指向头结点 for(int i;i<n;i++) { s=(DLinkNode *)malloc(sizeof(DLinkNode)); s->data=a[i]; r->next=s; s->prior=r; //将s结点插入到r结点之后 r=s; } r->next=NULL; } /*****双链表中,大多数运算和单链表中的操作是相同的,但插入和删除结点是不同于单链表的*****/ /*****插入*****/ bool ListInsert(DLinkNode * &L,int i,ElemType e) { int j=0; DLinkNode *p=L,*s; //p指向头结点,j设置为0 if(i<=0) return false; while(j<i-1 && p!=NULL) //查找第i-1个结点 { j++; p=p->next; } if(p==NULL) //未找到第i-1个结点返回false return false; else { s=(DLinkNode *)malloc(sizeof(DLinkNode)); s->data=e; //创建新结点s s->next=p->next; //在p结点之后插入s结点 if(p->next != NULL) //若p结点之后存在后继结点,修改其前驱指针 p->next->prior=s; s->prior=p; p->next=s; return true; } } /*****删除*****/ bool ListDelete(DLinkNode * &L,int i,ElemType &e) { int j=0; DLinkNode *p=L,*q; //p指向头结点,j设为0 if(i<=0) return false; while(j<i-1 && p!=NULL) //查找第i-1个结点 { j++; p=p->next; } if(p==NULL) return false; else { q=p->next; //q指向第i个结点 if(q==NULL) return false; e=q->data; p->next=q->next; //删除结点q if(p->next !=NULL) //若p结点存在后继结点,修改其前驱指针 p->next->prior=p; free(q); return true; } } int main() { DLinkNode *L; int n,a[100]; cin >> n; for(int i=0;i<n;i++) cin >> a[i]; CreateListF(L,a,n); return 0; }---代码和部分内容参考自《数据结构教程》