数据结构之双向链表
Posted 山里的小勇子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之双向链表相关的知识,希望对你有一定的参考价值。
所谓双向链表,就是链表可以从两个方向进行遍历,有了对单向链表的了解,想要创建一个双向链表就是相对容易很多。来看看《数据结构与算法分析--C语言描述》这本书上咋说的。原文:有时候以倒叙的方式扫描链表很有用,标准的实现方法(单向链表)对此无能为力,然而解决方法却很简单,只要在数据结构上附加一个域,使它包含指向前一个单元的指针即可。其开销是一个附加的链,它增加了空间的需求,同时也使得插入和删除的操作的开销增加一倍,因为有更多的指针需要定位。另一方面,它简化了删除的操作,因为你不再被迫使用一个指向前驱单元的指针来访问这个关键字,这个信息是现成的。来看看在单向链表中删除一个元素的操作,首先需要找到被删除元素的前面一个节点,然后使这个节点指向被删除节点的后面一个节点,然后再删除这个节点。
看一下使用AutoCAD画出的双向链表的结构图。
一个对称的完整的结构!
下面是我其实现程序。
1 #ifndef DLIST_H_ 2 #define DLIST_H_ 3 4 typedef int ElementType; 5 typedef struct Node* PtrToNode; 6 typedef PtrToNode Dlist; 7 typedef PtrToNode Position; 8 9 Dlist CreateDlist(); 10 int IsEmpty(); 11 void Insert(ElementType X,Dlist L,Position P); 12 void Delete(ElementType X,Dlist L); 13 Position Find(ElementType X,Dlist L); 14 void MakeEmpty(Dlist L); 15 void PrintDlist(Dlist L); 16 void PrintDlist(Dlist L);//just for pratice 17 #endif
#include<stdlib.h> #include"doublelist.h" struct Node { ElementType data; Position Forward; Position Next; }; Dlist CreateDlist() { Dlist L = malloc(sizeof(struct Node));//create header L->Forward = NULL; L->Next = NULL; return L; } int IsEmpty(Dlist L) { return L->Next == NULL; } Position Find(ElementType X, Dlist L) { Position P ; P = L->Next; while(P != NULL && P->data != X) P = P->Next; return P; } void Delete(ElementType X, Dlist L) { Position P = Find(X,L); if( P != NULL) { P->Forward->Next = P->Next; P->Next->Forward = P->Forward; free(P); } } void MakeEmpty(Dlist L) { Position P,Tmp; P = L->Next; while(P != NULL) { Tmp = P->Next; free(P); P = Tmp->Next; } } void PrintDlist(Dlist L) { Position P; P = L->Next; while(P != NULL) { printf("%d ",P->data); P = P->Next; } } void PrintDlistReve(Dlist L) // just for prarice { Position P; P = L->Next; while(P->Next != NULL) { P = P->Next; } while(P->Forward != NULL) { printf("%d ",P->data); P = P->Forward; } } void Insert(ElementType X,Dlist L,Position P) { Position Tmp = malloc(sizeof(struct Node)); Tmp->data = X; if(P->Next != NULL) { Tmp->Next = P->Next; P->Next->Forward = Tmp; P->Next = Tmp; Tmp->Forward = P; } else { P->Next = Tmp; Tmp->Forward = P; Tmp->Next = NULL; } }
下面是简单的测试:
#include<stdio.h> #include"doublelist.h" int main() { Dlist L = CreateDlist(); printf("Is List empty? %d\\n",IsEmpty(L)); int i; for( i = 0;i<10;i++) Insert(i,L,L); printf("After Insert 0-9,is it empty? %d\\n",IsEmpty(L)); printf("List contains: \\n"); PrintDlist(L); printf("\\nPrint double list inverse:\\n"); PrintDlistReve(L); return 0; }
上面就是测试结果,感觉有点栈的意思了。
以上是关于数据结构之双向链表的主要内容,如果未能解决你的问题,请参考以下文章