没什么新的内容,把自己写的练习代码贴出来,供大家批判。
1 /*
2 本程序用来测试非线性存储结构:双链表
3 */
4
5
6 #include <stdio.h>
7 #include <stdlib.h>
8
9
10 //**************************************************0
11 // 定义双链表数据结构
12 struct dbllink
13 {
14 char data;
15 struct dbllink* preNode;
16 struct dbllink* postNode;
17 };
18
19 typedef struct dbllink DBLLINK;
20 typedef DBLLINK* PDBLLINK;
21 //**************************************************1
22
23
24
25 //**************************************************0
26 // 定义BOOL数据类型
27 typedef enum {FALSE,TRUE} BOOL ;
28 //**************************************************1
29
30
31
32 //**************************************************0
33 // 定义申请存储空间宏
34 #define MALLOC(pNode,type,size) if(NULL==\
35 (pNode=(type *)malloc(size*sizeof(type))))\
36 {\
37 return FALSE;\
38 }
39 //**************************************************1
40
41
42
43 //**************************************************0
44 // 定义申请表头宏
45 #define MALLOCH(pNode,type,size) if(NULL==\
46 (pNode=(type *)malloc(size*sizeof(type))))\
47 {\
48 return NULL;\
49 }else\
50 {\
51 pNode->data='\0';\
52 pNode->preNode=NULL;\
53 pNode->postNode=NULL;\
54 return pNode;\
55 }
56 //**************************************************1
57
58
59
60
61 PDBLLINK CreateDblLink(void);
62 BOOL InitDblLink(PDBLLINK head,char element[]);
63 void EchoDblLink(PDBLLINK head);
64 PDBLLINK GetDblLinkEnd(PDBLLINK head);
65 PDBLLINK GetDblLinkEnd(PDBLLINK head);
66 BOOL AppendDblLink(PDBLLINK head,char element);
67 PDBLLINK SearchDblLink(PDBLLINK head,char element);
68 BOOL DenodeDblLink(PDBLLINK head,char element);
69 BOOL InsertDblLink(PDBLLINK head,char elePos,char element);
70
71 int main(int argc,char* argv[])
72 {
73 PDBLLINK head;
74
75 head=CreateDblLink();
76 if(head)
77 puts("Yes.");
78
79 if(InitDblLink(head,"hello world"))
80 EchoDblLink(head);
81 AppendDblLink(head,'A');
82 EchoDblLink(head);
83
84 if(SearchDblLink(head,'A'))
85 puts("Yes");
86 else
87 puts("No");
88
89 if(DenodeDblLink(head,'l'))
90 EchoDblLink(head);
91
92 if(InsertDblLink(head,'l','l'))
93 EchoDblLink(head);
94
95 getchar();
96 getchar();
97 return 0;
98 }
99
100
101
102
103 //**************************************************0
104 /*
105 函数功能:
106 创建双链表表头
107 函数原型
108 PDBLLINK CreateDblLink(void)
109 函数参数:
110 无
111 返回值:
112 创建成功返回表头指针,否则返回NULL
113 异常
114 无
115 */
116 PDBLLINK CreateDblLink(void)
117 {
118 PDBLLINK head;
119
120 MALLOCH(head,DBLLINK,1);
121 }
122 //**************************************************1
123
124
125
126
127 //**************************************************0
128 /*
129 函数功能:
130 初始化双链表
131 函数原型:
132 BOOL InitDblLink(PDBLLINK head,char element[])
133 函数参数:
134 PDBLLINK head: 链表头指针
135 char element[]:初始化字符串
136 返回值:
137 如果初始化成功,返回TRUE,否则返回FALSE
138 异常:
139 无
140 */
141 BOOL InitDblLink(PDBLLINK head,char element[])
142 {
143 PDBLLINK temp,
144 end;
145 int i;
146
147 if(!head)
148 {
149 return FALSE;
150 }
151
152 end=head;
153 for(i=0;element[i]!=0;i++)
154 {
155 MALLOC(temp,DBLLINK,1);
156
157 temp->data='\0';
158 temp->postNode =NULL;
159 temp->preNode=end;
160
161 end->data=element[i];
162 end->postNode =temp;
163 end=end->postNode ;
164 }
165 return TRUE;
166 }
167
168 //**************************************************1
169
170
171
172
173
174 //**************************************************0
175 /*
176 函数功能:
177 打印链表
178 函数原型:
179 void EchoDblLink(PDBLLINK head)
180 函数参数:
181 PDBLLINK head:链表头指针
182 返回值:
183 无
184 异常:
185 无
186 */
187 void EchoDblLink(PDBLLINK head)
188 {
189 PDBLLINK temp;
190
191 if(temp=head)
192 {
193 while(temp->postNode)
194 {
195 printf("%c",temp->data );
196 temp=temp->postNode ;
197 }
198 putchar('\n');
199 return ;
200 }
201 else
202 {
203 return ;
204 }
205 }
206 //**************************************************1
207
208
209
210
211 //**************************************************0
212 /*
213 函数功能:
214 获取最后的节点
215 函数原型:
216 PDBLLINK GetDblLinkEnd(PDBLLINK head)
217 函数参数:
218 PDBLLINK head:链表头指针
219 返回值:
220 如果获取成功,则返回链表尾节点指针,否则返回NULL
221 异常:
222 无
223 */
224 PDBLLINK GetDblLinkEnd(PDBLLINK head)
225 {
226 PDBLLINK temp;
227 if(!head)
228 {
229 return NULL;
230 }
231
232 if(head->postNode)
233 {
234 temp=head;
235 while(temp->postNode)
236 {
237 temp=temp->postNode;
238 }
239 return temp;
240 }
241 else
242 {
243 //仅有头指针
244 return head;
245 }
246 }
247 //**************************************************1
248
249
250
251
252
253 //**************************************************0
254 /*
255 函数功能:
256 在链表尾增加节点
257 函数原型:
258 BOOL AppendDblLink(PDBLLINK head,char element)
259 函数参数:
260 PDBLLINK head:链表头指针
261 char element: 要插入的字符
262 返回值:
263 如果增加成功,返回TRUE;否则返回FALSE
264 异常:
265 无
266 */
267 BOOL AppendDblLink(PDBLLINK head,char element)
268 {
269 PDBLLINK end,
270 NewNode;
271
272 if(head)
273 {
274 end=GetDblLinkEnd(head);
275
276 MALLOC(NewNode,DBLLINK,1);
277
278 NewNode->data='\0';
279 NewNode->postNode=NULL;
280 NewNode->preNode =end;
281
282 end->data=element;
283 end->postNode=NewNode;
284
285 return TRUE;
286 }
287 else
288 {
289 return FALSE;
290 }
291 }
292 //**************************************************1
293
294
295
296
297
298 //**************************************************0
299 /*
300 函数功能:
301 查找指定元素
302 函数原型:
303 PDBLLINK SearchDblLink(PDBLLINK head,char element)
304 函数参数:
305 PDBLLINK head:链表头指针
306 char element: 要查找的字符
307 返回值:
308 如果增加成功,返回元素所在的节点指针;否则返回NULL
309 异常:
310 无
311 */
312 PDBLLINK SearchDblLink(PDBLLINK head,char element)
313 {
314 PDBLLINK temp;
315
316 if(!head)
317 {
318 return NULL;
319 }
320 else
321 {
322 temp=head;
323 while(temp->postNode)
324 {
325 if(temp->data ==element)
326 return temp;
327 temp=temp->postNode ;
328 }
329 //如果遍历完毕,还没有返回,则查找失败
330 return NULL;
331 }
332 }
333 //**************************************************1
334
335
336
337
338 //**************************************************0
339 /*
340 函数功能:
341 删除指定字符所在的节点
342 函数原型:
343 BOOL DenodeDblLink(PDBLLINK head,char element)
344 函数参数:
345 PDBLLINK head:链表头指针
346 char element: 指定的字符
347 返回值:
348 如果删除成功,返回TRUE,否则返回FALSE;
349 异常:
350 无
351 */
352 BOOL DenodeDblLink(PDBLLINK head,char element)
353 {
354 PDBLLINK temp,
355 DeNode;
356
357 if(NULL==head || head->postNode == NULL)
358 {
359 return FALSE;
360 }
361
362 temp=SearchDblLink(head,element);
363
364 if(temp==head)
365 {
366 DeNode=head;
367 head->postNode->preNode=NULL;
368 head=head->postNode=NULL;
369
370 DeNode->postNode=NULL;
371
372 return TRUE;
373 }
374 else
375 {
376 temp->preNode->postNode =temp->postNode;
377 temp->postNode->preNode=temp->preNode;
378 free(temp);
379 return TRUE;
380 }
381 }
382 //**************************************************1
383
384
385
386
387
388 //**************************************************0
389 /*
390 函数功能:
391 增加节点
392 1、如果指定的元素存在,则在指定元素之后增加
393 2、如果指定的元素不存在,则在最后增加
394 函数原型:
395 BOOL InsertDblLink(PDBLLINK head,char element)
396 函数参数:
397 PDBLLINK head:链表头指针
398 char elePos:指定的字符
399 char element: 要插入的字符
400 返回值:
401 如果增加成功,返回TRUE,否则返回FALSE;
402 异常:
403 无
404 */
405 BOOL InsertDblLink(PDBLLINK head,char elePos,char element)
406 {
407 PDBLLINK temp,
408 NewNode;
409
410 if(NULL==head )
411 {
412 return FALSE;
413 }
414
415 //如果仅有头节点,则必须插入到头节点之后
416 if(head->postNode == NULL)
417 {
418 MALLOC(NewNode,DBLLINK,1);
419
420 NewNode->data='\0';
421 NewNode->postNode=NULL;
422 NewNode->preNode=head;
423
424 head->data=element;
425 head->postNode=NewNode;
426 return TRUE;
427 }
428
429 temp=SearchDblLink(head,element);
430 MALLOC(NewNode,DBLLINK,1);
431
432 NewNode->data =element;
433 NewNode->postNode =temp->postNode;
434 NewNode->preNode=temp;
435 temp->postNode=NewNode;
436 return TRUE;
437 }
438 //**************************************************1