這幾天在寢室專門寫鏈表,其實(shí)鏈表的操作和線性表相比有區(qū)別。
1、數(shù)據(jù)結(jié)構(gòu):
采用的結(jié)構(gòu)體:數(shù)據(jù)域和指針域。
2、在插入,刪除和銷毀時(shí),主要都是指針的指向發(fā)生變化,所以在寫代碼時(shí)務(wù)必校驗(yàn),指針是否為空,否則容易造成程序的崩潰。。。
具體代碼如下:若有問題,希望大家及時(shí)指正,共同探討。。。

1 //鏈表的基本操作(無(wú)表頭)
2 3 4 5 #include <stdio.h>
6 #include <stdlib.h>
7
8 typedef int ElemType;
9
10 typedef struct node
11 {
12 ElemType data;
13 struct node *next;
14 }LNode, *LinkList;
15
16
17 //尾插法創(chuàng)建鏈表
18 LinkList CreateLinkList(int nNodeCount)
19 {
20 LinkList head = NULL, p = NULL, r = NULL;
21 int i;
22
23 for (i = 0; i < nNodeCount; i++)
24 {
25 p = (LinkList)malloc(sizeof(LNode));
26 if (NULL == p)
27 {
28 printf("分配內(nèi)存失敗\n");
29 free(p);
30 exit(0);
31 }
32
33 printf("為p->data賦值:");
34 scanf("%d", &p->data);
35 p->next = NULL; //動(dòng)態(tài)創(chuàng)建一個(gè)節(jié)點(diǎn)時(shí),在初始狀態(tài)下,令next域?yàn)榭?/span>
36
37 if (NULL == head)
38 {
39 head = p;
40 }
41 else
42 {
43 r->next = p;
44 }
45 r = p;
46 }
47
48 return head;
49 }
50
51 //輸出鏈表
52 void PrintLinkList(LinkList L)
53 {
54 LinkList p = NULL;
55 if (NULL == L)
56 {
57 printf("鏈表為空\(chéng)n");
58 exit(0);
59 }
60
61 p = L;
62 while (NULL != p)
63 {
64 printf("%d\t", p->data);
65 p = p->next;
66 }
67 printf("\n");
68 }
69
70 //插入 (關(guān)鍵點(diǎn):0, 1, 2)
71 void InsertLinkList(LinkList &L, int nInsertPoint, ElemType nInsertValue)
72 {
73 LinkList p = NULL, r = NULL;
74 int i = 1;
75
76 if (NULL == L) //鏈表校驗(yàn)
77 {
78 printf("鏈表為空\(chéng)n");
79 exit(0);
80 }
81
82 r = (LinkList)malloc(sizeof(LNode)); //創(chuàng)建節(jié)點(diǎn)校驗(yàn)
83 if (NULL == r)
84 {
85 printf("內(nèi)存分配失敗\n");
86 free(r);
87 exit(0);
88 }
89 r->data = nInsertValue;
90 r->next = NULL;
91
92 p = L;
93 while ((NULL != p) && (i < nInsertPoint - 1)) //合法插入點(diǎn),指針移動(dòng)
94 {
95 p = p->next;
96 i++;
97 }
98
99 if (1 == nInsertPoint) //插入點(diǎn)為1
100 {
101 r->next = p;
102 L = r;
103 }
104 else
105 {
106 while ((NULL == p) || (i > nInsertPoint - 1)) //判斷非法插入點(diǎn)。前者判斷是否越界,后者判斷是否 <=0;
107 {
108 printf("非法插入點(diǎn),請(qǐng)檢查參數(shù)\n");
109 exit(0);
110 }
111
112 //合法插入點(diǎn)
113 r->next = p->next;
114 p->next = r;
115 }
116 }
117
118 //刪除
119 void DeleteLinkList(LinkList &L, int nDeletePoint)
120 {
121 LinkList p = NULL, r = NULL;
122 int i = 1;
123
124 if (NULL == L)
125 {
126 printf("鏈表為空,無(wú)法刪除\n");
127 exit(0);
128 }
129
130 p = L;
131 while ((NULL != p) && (i < nDeletePoint - 1))
132 {
133 p = p->next;
134 i++;
135 }
136
137 if (1 == nDeletePoint)
138 {
139 L = p->next;
140 r = p;
141 }
142 else
143 {
144 while ((NULL == p) || (i > nDeletePoint - 1))
145 {
146 printf("非法刪除點(diǎn), 請(qǐng)檢查參數(shù)\n");
147 exit(0);
148 }
149
150 //合法刪除點(diǎn)
151 r = p->next;
152 p->next = r->next;
153 }
154
155 free(r); //釋放刪除節(jié)點(diǎn)
156 }
157
158 //銷毀
159 void DestroyLinkList(LinkList &L)
160 {
161 LinkList p = NULL, r = NULL;
162
163 if (NULL == L)
164 {
165 printf("鏈表為空\(chéng)n");
166 exit(0);
167 }
168
169 p = L;
170 while (NULL != p)
171 {
172 r = p;
173 p = p->next;
174 free(r);
175 }
176 printf("成功銷毀\n");
177 }
178
179 //查找元素
180 ElemType FindLinkList(LinkList L, int nFindPoint)
181 {
182 LinkList p = NULL;
183 int i = 1;
184
185 if (NULL == L)
186 {
187 printf("鏈表為空\(chéng)n");
188 exit(0);
189 }
190
191 p = L;
192 while ((NULL != L) && (i < nFindPoint - 1))
193 {
194 p = p->next;
195 i++;
196 }
197
198 if (1 == nFindPoint)
199 {
200 return p->data;
201 }
202 else
203 {
204 while ((NULL == p) || (i > nFindPoint - 1))
205 {
206 printf("非法查找點(diǎn)\n");
207 exit(0);
208 }
209
210 return p->next->data;
211 }
212 }
213
214 //修改元素
215 void ModifyLinkList(LinkList &L, int nModifyPoint, ElemType nModifyValue)
216 {
217 LinkList p = NULL;
218 int i = 1;
219
220 if (NULL == L)
221 {
222 printf("鏈表為空\(chéng)n");
223 exit(0);
224 }
225
226 p = L;
227 while ((NULL != L) && (i < nModifyPoint - 1))
228 {
229 p = p->next;
230 i++;
231 }
232
233 if (1 == nModifyPoint)
234 {
235 p->data = nModifyValue;
236 }
237 else
238 {
239 while ((NULL == p) || (i > nModifyPoint - 1))
240 {
241 printf("非法修改點(diǎn)\n");
242 exit(0);
243 }
244
245 p->next->data = nModifyValue;
246 }
247
248 }
249
250 int main()
251 {
252 LinkList La = NULL;
253
254 La = CreateLinkList(4);
255
256 /*測(cè)試插入
257 printf("插入前鏈表:\n");
258 PrintLinkList(La);
259
260 InsertLinkList(La, -1, 4);
261
262 printf("插入后鏈表:\n");
263 PrintLinkList(La);
264 //*/
265
266 /*測(cè)試刪除
267 printf("刪除前鏈表:\n");
268 PrintLinkList(La);
269
270 DeleteLinkList(La, 2);
271
272 printf("刪除后鏈表:\n");
273 PrintLinkList(La);
274 //*/
275
276 /*測(cè)試查找
277 PrintLinkList(La);
278 int x = FindLinkList(La, 2);
279 printf("%d\n", x);
280 //*/
281
282 /*測(cè)試修改
283 PrintLinkList(La);
284 ModifyLinkList(La, -1, 4);
285 PrintLinkList(La);
286 //*/
287
288 DestroyLinkList(La); //銷毀鏈表
289
290 return 0;
291 }

|