算法和数据结构_13_小算法_双链表

Posted volcanol ---- View OF Linux Ca

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法和数据结构_13_小算法_双链表相关的知识,希望对你有一定的参考价值。

      没什么新的内容,把自己写的练习代码贴出来,供大家批判。

  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

 

以上是关于算法和数据结构_13_小算法_双链表的主要内容,如果未能解决你的问题,请参考以下文章

算法和数据结构_14_小算法_Blank字符替换

算法和数据结构_18_小算法_源代码打包下载

算法和数据结构_16_小算法_IntToStr: 将整型数据转换为字符串

算法开启小码农双链表血脉

#yyds干货盘点#算法开启小码农双链表血脉

<LeetCode天梯>Day026 反转链表(递归法+(迭代法)双链表法) | 初级算法 | Python