【算法和数据结构】_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
时间: 2024-10-23 11:08:28

【算法和数据结构】_13_小算法_双链表的相关文章

算法与数据结构基础7:C++双链表的简单实现

双链表在单链表的基础上加了一个指向前一个节点的指针. // DList.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class DList { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝构造函数

【数据结构】用C++实现双链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//[数据结构]用C++实现双链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等) //头文件 #ifndef _LIST_H #define _LIST_H #include<iostream> using namespace std; template<class Type> class DList; template<class Type> class ListNode { friend class DList<Type>; public: L

数据结构与算法—一文多图搞懂双链表

前言 前面讲过线性表中顺序表和链表的实现和性质.但是在数据结构与算法中,双向链表无论在考察还是运用中都占有很大的比例,笔者旨在通过本文与读者一起学习分享双链表相关知识. 双链表介绍 与单链表区别 逻辑上没有区别.他们均是完成线性表的内容.主要的区别是结构上的构造有所区别. 对于单链表: 对于一个节点,有储存数据的data.和next后驱节点(指针).也就是这个单链表想要一些遍历的操作都得通过前节点—>后节点. 对于双链表: 对于一个节点,有些和单链表一样有存储数据的data,指向后方的next(

算法与数据结构基础3:简单单链表List类的实现

简单的单链表实现,数据类型定义成了int,如果要通用,需要改成模板类,然后稍微修改下就可以了. // List.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class List { public: // ************************************************************************** //

数据结构(C达到)------- 双链表

双链表中的每个节点包含两个指针域,指针域包含其后继节点的内存地址,还有一个指针所存储的存储器地址其领域前驱节点. 双向链表结点的类型描写叙述: //双向链表的类型描写叙述 typedef int ElemType; typedef struct node{ ElemType data; struct node *prior,*next; }DuLNode,*DuLinkList; 当中.prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址. 双向链表有两个特点:一是能

给自己新的开始——如何学好算法和数据结构

2020.3.6 一直以来很害怕接触到这一块,但是越早准备以后找工作的时候就能多一些底气,毕竟只要下定决心开始,什么时候都不算晚. 这篇文章是听了一个比较系统性的关于学习的路线,特此记录. 大纲 有哪些需要学习的算法与数据结构 如何学好算法与数据结构-刷题的重要性 算法与数据结构在工作中的应用 总结-有哪些经典的解题模版 算法为什么离不开数据结构 算法是解决问题的一系列操作集合 数据结构能使得这些操作更加的高效 同样的算法我们可以选择不同的数据结构,会带来不同效率的算法 有哪些需要学习的算法与数

数据结构实践——循环双链表应用

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目- 循环双链表应用] 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个算法Insert(ha,hb,i).其功能是:i=0时,将线性表hb插入到线性表ha的最前面:当i>0时,将线性表hb插入到线性表ha中第i个节点的后面:当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的最后面. 请在实现算法时,除项目中给出的特殊要求,其余工作均可利用项目4完成的算法支持. [参考解答](循环双链表的基本运算算法,请参考

图灵算法群《啊哈算法》领读

--图灵算法群阅读计划(第一期) 领读人:Zoctopus·Lian 本书特色 一本充满智慧和趣味的算法入门书.没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点. 书中涉及到的数据结构有栈.队列.链表.树.并查集.堆和图等:涉及到的算法有排序.枚举.深度和广度优先搜索.图的遍历,当然还有图论中不可以缺少的四种最短路径算法.两种最小生成树算法.割点与割边算法.二分图的最大匹配算法等. 书中通过幽默的语言配以可爱的插图来讲解算法,使用C语言实现. 适合读者 适合算法零基础入门和喜爱编程的朋友(

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有