初始化:
typedef struct DNode { int data; struct DNode *prior,*next; }DNode, *DLinkList; //初始化双链表 bool InitDLinkList(DLinklist &L) { L = (DNode *)malloc(sizeof(DNode)); //分配一个头结点 if (L == NULL) //内存不足,分配失败 return fatse; L->prior = NULL; //头结点之后暂时还没有节点 L->next = NULL; //头结点的 prior 永远指向 NULL return true; } //判断双链表是否为空(带头结点) bool Empty(DLink list L) { if (L->next == NULL) return true; else return false; }
后插操作:
//在p结点之后插入s结点 bool InsertNextDNode(DNode *p, DNode *s) { if (p == NULL Il s == NULL) //非法参数 return false; s->next = p->next; if (p->next != NULL) //如果p结点有后继结点 p->next->prior = s; s->prior = p; p->next = s; return true; }
有了后插操作,类似的按位序插入与前插操作也是很容易实现
删除与销毁:
//删除p结点的后继结点 bool DelLeteNextbNode(DNode *p) if (p == NULL) return false; DNode *q = p->next; //找到p的后继结点q if (q == NULL) return false; //p没有后继 p->next = q->next; if(q->next!=NULL) //q结点不是最后一个结点 q->next->prior=p; free(q); //释放结点空间 return true; } //销毁双链表L void DestoryList(DLinklist &L){ //循环释放各个数据结点 while (L->next != NULL) DeleteNextDNode(L); free(L); //释放头结点 L=NULL; //头指针指向NULL }
遍历:
//后向遍历 while (p != NULL) { // 对 结点 p 做相应处理,如打印 p = p->next; } //前向遍历 while (p != NULL) { // 对结点 p 做相应处理 p = p->prior; } //前向遍历(跳过头结点) while (p->prior != NULL) { // 对结点 p 做相应处理 p= p->prior; }
双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方式实现