List的简单实现。在GCC下测试通过。
list.h
1 #ifndef _List_H 2 3 /*List数据结构的简单实现*/ 4 5 struct Node; 6 typedef struct Node Node; 7 typedef struct Node * List; 8 typedef struct Node * Position; 9 typedef double ElementType; 10 11 /* 12 下面的这些操作可以看做是对List ADT操作的描述。这些操作的描述可以认为和具体的编程语言无关。 13 */ 14 List MakeEmpty(); 15 int IsEmpty(List L); 16 int IsLast(Position P , List L); 17 Position Find(ElementType X, List L); 18 void Delete(ElementType X,List L); 19 Position FindPrevious(ElementType X, List L); 20 void Insert(ElementType X,List L,Position P); 21 void InsertToFront(ElementType X,List L); 22 void InsertToBack(ElementType X,List L); 23 void DeleteList(List L); 24 Position Header(List L); 25 Position First(List L); 26 Position Tail(List L); 27 Position Advance(Position P); 28 ElementType Retrive(Position P); 29 void PrintList(List L); 30 31 32 #endif
list.c
1 #include "list.h" 2 #include <stdlib.h> 3 #include <stdio.h> 4 5 struct Node 6 { 7 ElementType Element;/*数据*/ 8 Position Next;/*指向下一个节点的指针*/ 9 }; 10 11 /*初始化一个List,这里的实现是采用了一个“表头节点”,表头节点的存在只是为了方便一些List操作实现上的方便*/ 12 List MakeEmpty() 13 { 14 Node * PtrToHeader = (Node *)malloc(sizeof(Node));/*给头结点分配一定的内存空间,PtrToNode是指向这部分空间的指针*/ 15 PtrToHeader -> Next = NULL; /*将头结点的指向下一个节点的指针置为NULL*/ 16 return PtrToHeader;/*返回指向头结点的指针*/ 17 } 18 /*判断一个List是否为空*/ 19 int IsEmpty(List L) 20 { 21 return L->Next == NULL ; 22 } 23 /*判断P指向的是不是List中的最后一个元素,参数L在实现中没有用到*/ 24 int IsLast(Position P , List L) 25 { 26 return P->Next == NULL; 27 } 28 /*找到并返回指定元素的位置,如果找不到,就返回空指针*/ 29 Position Find(ElementType X, List L) 30 { 31 Position P = L->Next; 32 while(P != NULL) 33 { 34 if(P->Element == X) 35 return P; 36 P = P->Next; 37 } 38 return NULL; 39 } 40 /*删除指定的元素*/ 41 void Delete(ElementType X,List L) 42 { 43 Position P = FindPrevious(X,L); 44 if(P != NULL) 45 { 46 Position temp = P->Next; 47 P->Next = temp->Next; 48 free(temp); 49 } 50 } 51 /*返回指定元素的前一个位置,如果List中没有该元素,那么返回NULL*/ 52 Position FindPrevious(ElementType X, List L) 53 { 54 Position P = L; 55 while(P->Next != NULL) 56 { 57 if(P->Next->Element == X) 58 return P; 59 P = P->Next; 60 } 61 return NULL; 62 } 63 /*在Position指向的节点的后面插入一个节点*/ 64 void Insert(ElementType X,List L,Position P) 65 { 66 Node * PtrToNewNode = (Node *)malloc(sizeof(Node)); 67 PtrToNewNode->Element = X; 68 PtrToNewNode->Next = P->Next; 69 P->Next = PtrToNewNode; 70 } 71 /*在List前面插入X*/ 72 void InsertToFront(ElementType X,List L) 73 { 74 Position P = Header(L); 75 Insert(X,L,P); 76 } 77 /*在List最后插入X*/ 78 void InsertToBack(ElementType X,List L) 79 { 80 Position P = Tail(L); 81 Insert(X,L,P); 82 } 83 /*删除List*/ 84 void DeleteList(List L) 85 { 86 Position P ,temp ; 87 P = L->Next; 88 L->Next = NULL; 89 while(P != NULL) 90 { 91 temp = P->Next; 92 free(P); 93 P = temp; 94 } 95 } 96 /*取出P位置上的节点的值*/ 97 ElementType Retrive(Position P) 98 { 99 if(P!=NULL) 100 return P->Element; 101 } 102 /*打印一个List*/ 103 void PrintList(List L) 104 { 105 Position P = L->Next; 106 while(P != NULL) 107 { 108 printf("%f ",P->Element); 109 P = P->Next; 110 } 111 printf("\n"); 112 } 113 /*获得头结点的位置*/ 114 Position Header(List L) 115 { 116 return L; 117 } 118 /*获得第一个节点的位置*/ 119 Position First(List L) 120 { 121 return L->Next;/*注意,如果第一个节点不存在那么有可能会返回NULL*/ 122 } 123 /*获得最后一个节点的位置*/ 124 Position Tail(List L) 125 { 126 if(IsEmpty(L)) 127 return NULL; 128 else 129 { 130 Position P = L->Next; 131 while(P->Next != NULL) 132 P = P->Next; 133 return P; 134 } 135 } 136 137 /*获得P的下一个位置*/ 138 Position Advance(Position P) 139 { 140 return P->Next;/*注意,如果P已经是最后一个位置那么有可能会返回NULL*/ 141 }
listTest.c
1 #include "list.h" 2 #include <stdio.h> 3 int main() 4 { 5 //生成一个只包含头结点的list 6 List list = MakeEmpty(); 7 //判断list是否为空 8 if(IsEmpty(list)) 9 printf("Empty List..."); 10 PrintList(list); 11 //获得头结点位置(即指向头结点的指针) 12 Position P = Header(list); 13 //在头结点之后插入一些数据 14 Insert(1.0,list,P); 15 Insert(5.0,list,P); 16 Insert(6.0,list,P); 17 PrintList(list); 18 //获得头结点之后、第一个真正节点的位置 19 Position Q = First(list); 20 //在第一个节点之后插入一些数据 21 Insert(2.0,list,Q); 22 Insert(3.0,list,Q); 23 Insert(4.0,list,Q); 24 PrintList(list); 25 //删除一些数据 26 Delete(1.0,list); 27 Delete(6.0,list); 28 Delete(3.0,list); 29 PrintList(list); 30 //将头结点之后的数据都清空 31 DeleteList(list); 32 //在最前面(也就是头结点之后、第一个数据之前)插入数据 33 InsertToFront(2.0,list); 34 InsertToFront(1.0,list); 35 //在list的最后插入数据 36 InsertToBack(3.0,list); 37 InsertToBack(4.0,list); 38 PrintList(list); 39 //遍历list的方法 40 Position R = First(list); 41 while(R!=NULL) 42 { 43 printf("%f ", Retrive(R)); 44 //获得R之后的位置 45 R = Advance(R); 46 } 47 printf("\n"); 48 49 printf("Try to find 3.0...\n"); 50 //查找一个数据 51 Position S = Find(3.0,list); 52 if(S!=NULL) printf("%f is finded...\n",Retrive(S)); 53 else printf("Not exists in the list!"); 54 //查找一个数据,然后在该数据之后插入一个数据 55 Position T = Find(3.0,list); 56 if(T!=NULL) 57 Insert(10000,list,T); 58 PrintList(list); 59 }