这篇文章主要是根据《数据结构与算法分析--C语言描述》一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现。在学习的过程中将练习的代码记录在文章中,并添加了一些在测试中需要的函数,因此可能看起来会有点乱。。。
首先,链表作为一种简单的线性数据结构,主要特征就是“节点”,每个节点包含两个信息,一个是数据域,另外一个是指针域。数据是我们在程序中需要用到的数据,数据类型可以变化,根据需要设定即可,但是指针域就是一个指针,主要作用是指向下一个节点,就是依靠这些指针才将一个一个的节点串起来,就像串辣椒一样,只要提起一串辣椒的头部,那么这一串辣椒中的每一个就都可以按照顺序找到。理解链表的最好的方式就是用图形的方式,其实大部分数据结构教材都是利用图形的方法来讲解大部分数据结构的,人的大脑对图形的理解明显比文字要更好一些。啥都不说了,打开AUTOCAD,画个图。
上图就是一个链表结构,其中A1到A5 是我们要用到的数据,Ptr是指针的名字,箭头指向被指针指向的节点。最左边有一个被称之为头节点的节点,这是一个没有数据,只有指向第一个真正存储数据的节点的节点,有的人在链表中不使用头节点。
下面看看链表的一些操作,首先分析一下,链表需要 一个创建程序,就是创建一个链表,可以叫做CreateList(),还需要判断链表是否为空的,叫做IsEmpty(),还有需要向链表中插入元素,可以叫做Insert(),同样需要删除元素 Delete()。这是最主要的几个操作。
上面提到的书的作者给出了几种方法:
1 #ifndef _LIST_H_ 2 #define _LIST_H_ 3 4 typedef int ElementType; 5 struct Node; 6 typedef struct Node *PtrToNode; 7 typedef PtrToNode List; 8 typedef PtrToNode Position; 9 10 List CreateList(); 11 List Makeempty(List L); 12 13 int IsEmpty(List L); 14 int IsLast(Position P, List L); 15 Position Find(ElementType X,List L); 16 void Delete(ElementType X,List L); 17 Position FindPrevious(ElementType X,List L); 18 void Insert(ElementType X,List L,Position P); 19 void DeleteList(List L); 20 Position Header(List L); 21 Position First(List L); 22 Position Advance(Position P); 23 ElementType Retrieve(Position P); 24 25 #endif
比较多,但是都比较简单,来看看作者的实现
1 #include"linkedlist.h" 2 #include<stdlib.h> 3 4 typedef int ElementType; 5 struct Node 6 { 7 ElementType Element; 8 Position Next; 9 }; 10 11 void PrintList(List L) 12 { 13 Position P; 14 P = L->Next; 15 while(P != NULL) 16 { 17 printf("%d ",P->Element); 18 P = P->Next; 19 } 20 } 21 22 List CreateList() 23 { 24 List L ; 25 L = malloc(sizeof(struct Node)); 26 L->Next = NULL; 27 return L; 28 } 29 30 31 32 List MakeEmpty(List L) 33 { 34 Position P,Tmp; 35 P = L->Next; 36 L->Next = NULL; 37 while(P != NULL) 38 { 39 Tmp = P->Next; 40 free(P); 41 P = Tmp; 42 } 43 return L; 44 } 45 void Printlist(List L) 46 { 47 Position P; 48 P = L->Next; 49 while(P != NULL) 50 { 51 printf("%d",P->Element); 52 P = P->Next; 53 } 54 } 55 56 int IsEmpty(List L) 57 { 58 return L->Next == NULL; 59 } 60 61 int IsLast(Position P,List L) 62 { 63 return P->Next == NULL; 64 } 65 66 Position Find(ElementType X,List L) 67 { 68 Position P; 69 P = L->Next; 70 while(P != NULL && P->Element != X) 71 P = P->Next; 72 return P; 73 } 74 75 void Delete(ElementType X,List L) 76 { 77 Position P, TemCell; 78 P = FindPrevious(X,L); 79 if(!IsLast(P,L)) 80 { 81 TemCell = P->Next; 82 P->Next = TemCell->Next; 83 free(TemCell); 84 } 85 } 86 87 Position FindPrevious(ElementType X,List L) 88 { 89 Position P; 90 P = L; 91 while(P->Next != NULL && P->Next->Element != X) 92 P = P->Next; 93 return P; 94 } 95 96 97 void Insert(ElementType X ,List L,Position P) 98 { 99 Position TmpCell ; 100 TmpCell = malloc (sizeof(struct Node)); 101 102 TmpCell->Element = X; 103 TmpCell->Next = P->Next; 104 P->Next = TmpCell; 105 }
时间: 2024-10-27 13:32:58