链表数据结构的定义:由于链表一方面需要在节点中存储数据,另一方面还需要存储"线索",因此,通常采用结构体定义链表节点数据类型。
1 struct Node;
2 typedef struct Node *PtrToNode;
3 typedef PtrToNode List;
4 typedef PtrToNode Position;
5 typedef int ElementType;
6 struct Node
7 {
8 ElementType Element;
9 Position Next;
10 };
基本操作:
1 //创建链表
2 List CreateList();
3 //遍历链表
4 void TraverseList(List L);
5 //清空链表
6 List MakeEmpty(List L);
7 //判断给定列表是否为空
8 int IsEmpty(List L);
9 //判断节点在给定链表中是否为空
10 int IsLast(Position P, List L);
11 //在指定的链表中查找给定元素。
12 //存在则返回其第一次出现的位置,不存在则返回NULL
13 Position Find(ElementType X, List L);
14 //删除链表中的某个元素
15 void Delete(ElementType X, List L);
16 //在指定链表中查找给定元素的前驱节点
17 Position FindPrevious(ElementType X, List L);
18 //在链表给定位置的后面插入元素
19 void Insert(ElementType X, List L, Position P);
20 //删除链表
21 void DeleteList(List L);
22 //返回链表的头结点
23 Position Header(List L);
24 //返回链表第一个数据元素节点
25 Position First(List L);
26 //返回当前位置的下一个位置
27 Position Advance(Position P);
28 //获取当前位置元素的值
29 ElementType Retrive(Position P);
实现:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 struct Node;
5 typedef struct Node *PtrToNode;
6 typedef PtrToNode List;
7 typedef PtrToNode Position;
8 typedef int ElementType;
9 struct Node
10 {
11 ElementType Element;
12 Position Next;
13 };
14
15 //创建链表
16 List CreateList();
17 //遍历链表
18 void TraverseList(List L);
19 //清空链表
20 List MakeEmpty(List L);
21 //判断给定列表是否为空
22 int IsEmpty(List L);
23 //判断节点在给定链表中是否为空
24 int IsLast(Position P, List L);
25 //在指定的链表中查找给定元素。
26 //存在则返回其第一次出现的位置,不存在则返回NULL
27 Position Find(ElementType X, List L);
28 //删除链表中的某个元素
29 void Delete(ElementType X, List L);
30 //在指定链表中查找给定元素的前驱节点
31 Position FindPrevious(ElementType X, List L);
32 //在链表给定位置的后面插入元素
33 void Insert(ElementType X, List L, Position P);
34 //删除链表
35 void DeleteList(List L);
36 //返回链表的头结点
37 Position Header(List L);
38 //返回链表第一个数据元素节点
39 Position First(List L);
40 //返回当前位置的下一个位置
41 Position Advance(Position P);
42 //获取当前位置元素的值
43 ElementType Retrive(Position P);
44
45 int IsEmpty(List L)
46 {
47
48 return L->Next == NULL;
49 }
50
51 int IsLast(Position P, List L)
52 {
53 return P->Next == NULL;
54 }
55
56 Position Find(ElementType X, List L)
57 {
58 Position P = L->Next;
59 while(P != NULL && P->Element != X)
60 {
61 P = P->Next;
62 }
63 return P;
64 }
65
66 void Delete(ElementType X, List L)
67 {
68 Position P,TmpCell;
69 P = FindPrevious(X,L);
70 if(!IsLast(P,L))
71 {
72 TmpCell = P->Next;
73 P->Next = TmpCell->Next;
74 free(TmpCell);
75 }
76 }
77
78 Position FindPrevious(ElementType X, List L)
79 {
80 Position P = L;
81 while(P->Next != NULL && P->Next->Element != X)
82 {
83 P = P->Next;
84 }
85 return P;
86 }
87
88 void Insert(ElementType X, List L, Position P)
89 {
90 Position TmpCell;
91 TmpCell = malloc(sizeof(struct Node));
92 if(TmpCell == NULL)
93 {
94 printf("Out of space!
");
95 return;
96 }
97 TmpCell->Element = X;
98 TmpCell->Next = P->Next;
99 P->Next = TmpCell;
100 }
101
102 void DeleteList(List L)
103 {
104 Position P,Tmp;
105 P = L->Next;
106 L->Next = NULL;
107 while(P != NULL)
108 {
109 Tmp = P->Next;
110 free(P);
111 P = Tmp;
112 }
113 }
114
115 Position Header(List L)
116 {
117 return L;
118 }
119
120 Position First(List L)
121 {
122 return L->Next;
123 }
124
125 Position Advance(Position P)
126 {
127 return P->Next;
128 }
129
130 ElementType Retrive(Position P)
131 {
132 return P->Element;
133 }
134
135 List CreateList()
136 {
137 int i;
138 Position P,Tmp;
139 List L = malloc(sizeof(struct Node));
140 P = L;
141 for(i = 0; i < 5; i++)
142 {
143 Tmp = malloc(sizeof(struct Node));
144 Tmp->Element = i;
145 P->Next = Tmp;
146 P = Tmp;
147 }
148 P->Next = NULL;
149 return L;
150 }
151
152 void TraverseList(List L)
153 {
154 Position P;
155 P = L->Next;
156 while(P != NULL)
157 {
158 printf("%d
",P->Element);
159 P = P->Next;
160 }
161 }
162
163 int main(void)
164 {
165 //创建链表
166 List L = CreateList();
167 //查找元素1在链表中的位置
168 Position P = Find(1,L);
169 //在元素1后面插入元素8
170 Insert(8,L,P);
171 //查找元素8前驱结点
172 P = FindPrevious(8,L);
173 //遍历链表
174 TraverseList(L);
175 return 0;
176 }