《数据结构与算法分析:C语言描述》读书笔记------List的C语言实现

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 }

 

转载于:https://www.cnblogs.com/wzm-xu/p/4259589.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值