C语言的那些小秘密之链表(二)

发表于:2011-12-14 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  除了个别天才程序员外,没有人一开始就能写出让人惊叹的代码,都是从模仿开始的!不要相信你身边的人说他能很轻松的自己编写出让人惊叹的代码而不用任何的参考资料,因为我相信在你我的身边没有这样的天才程序员,所以我们都选择从模仿和阅读源代码开始。就好比一个优秀的作家不是一开始就能写出好的文章,他也是阅读了很多优秀的文章之后才能写出优秀作品的。一开始我想详细的讲解双链表部分,但是我发现由于代码的原因,使得文章的篇幅过大,所以在此就选择一些易错和场用的知识点来进行讲解,如果一开始你发现阅读代码时很吃力,请不要放弃!我们要有毅力去把它消化掉,融会贯通之后再写出我们自己的双链表,当然我给出的仅仅只是一个参考而已。

  在此也要特地感谢下编程浪子朱云翔老师,阅读我博客后提出的宝贵意见,根据你的建议我接下来的博客中都把代码部分放到了代码框中,使得代码看起来更加的悦目。

  前一篇博客中我们讲解了单链表,那么接下来还是按照我们之前的安排讲解双链表部分, 在开始讲解之前,我们先来简单的回顾下上一篇博客中的双链表,双链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。对双链表做了一个简单的回顾之后那么接下来我们就来开始讲解双链表了,在这里我们也同样遵循一个原则,就是用简单易懂的代码和文字描述来讲解,我们要突出代码的重点是在编程的过程中我们的易错点。

  因为双链表的使用相对于单链表操作来说要复杂和常用些,所以在这里我采用逐渐添加功能模块的方法来进行讲解,从易到难,让读者理解起来更加轻松,同时我们在这里也使用我前面博客中提到的一些方法,学以致用嘛,学了就要在代码中尽可能的使用起来,要不然学了有什么用呢,接下来我们先来看看一个最为简单的双链表的创建。

  特此说明:

  1、如果在接下来的代码中发现一些不懂而我又没有给出提示信息的,如自己定义枚举型的数据结构DListReturn作为返回类型等,那么请你看我的前一篇博客《C语言的那些小秘密之链表(一)》。

  2、由于文章在编辑的时候可以对代码部分使用颜色标记,但是发表后好像显示不出来,我试图修改,但还是不行,所以在此说明下,代码中被“<span style="color:#ff0000;">” 和“</span> ”框起来的部分为有色部分。读者自己在阅读代码的时候注意下,自己对比也能找到新加入的代码。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. typedef enum _DListReturn  
  5. {  
  6.     DLIST_RETURN_OK,  
  7.     DLIST_RETURN_FAIL  
  8. }DListReturn;  
  9.   
  10. typedef struct _DStu  
  11. {  
  12.     int score;  
  13. }DStu;  
  14.   
  15. typedef struct _DListNode  
  16. {  
  17.     struct _DListNode* prev;  
  18.     struct _DListNode* next;  
  19.   
  20.     DStu* data;  
  21. }DListNode;  
  22.   
  23. typedef struct _DList  
  24. {  
  25.     DListNode* head;  
  26. }DList;  
  27.   
  28. typedef DListReturn (*DListPrintFunction)(void* data);  
  29.   
  30. DListNode* dlist_node_create(void* data)  
  31. {  
  32.     DListNode* node;  
  33.     if((node = (DListNode*) malloc(sizeof(DListNode)))==NULL)  
  34.     {  
  35.         printf("分配空间失败!");  
  36.         exit(0);  
  37.     }  
  38.   
  39.     if(node != NULL)  
  40.     {  
  41.         node->prev = NULL;  
  42.         node->next = NULL;  
  43.         node->data =(DStu*)data;  
  44.     }  
  45.     return node;  
  46. }  
  47.   
  48. DList* dlist_head_create(void)  
  49. {  
  50.     DList* thiz;  
  51.     if((thiz = (DList*)malloc(sizeof(DList)))==NULL)  
  52.     {  
  53.         printf("分配空间失败!");  
  54.         exit(0);  
  55.     }  
  56.   
  57.     if(thiz != NULL)  
  58.     {  
  59.         thiz->head = NULL;  
  60.     }  
  61.   
  62.     return thiz;  
  63. }  
  64.   
  65. DListReturn dlist_append(DList* thiz, void* data)  
  66. {  
  67.     DListNode* node = NULL;  
  68.     DListNode* cursor = NULL;  
  69.   
  70.     if((node = dlist_node_create(data)) == NULL)  
  71.     {  
  72.         return DLIST_RETURN_OK;   
  73.     }  
  74.   
  75.     if(thiz->head == NULL)  
  76.     {  
  77.         thiz->head = node;  
  78.   
  79.         return DLIST_RETURN_OK;  
  80.     }  
  81.   
  82.     cursor = thiz->head;  
  83.     while(cursor != NULL && cursor->next != NULL)  
  84.     {  
  85.         cursor = cursor->next;  
  86.     }  
  87.   
  88.     cursor->next = node;  
  89.     node->prev = cursor;  
  90.   
  91.     return DLIST_RETURN_OK;  
  92. }  
  93.   
  94. DListReturn dlist_print(DList* thiz, DListPrintFunction print)  
  95. {  
  96.     DListNode* iter = thiz->head;  
  97.   
  98.     while(iter != NULL)  
  99.     {  
  100.         print(iter->data);  
  101.         iter = iter->next;  
  102.     }  
  103.     printf("\n");  
  104.     return DLIST_RETURN_OK;  
  105. }  
  106.   
  107. DListReturn print_int(void* data)  
  108. {  
  109.     DStu* ss=(DStu*)data;  
  110.     printf("%d\t ", ss->score);  
  111.   
  112.     return DLIST_RETURN_OK;  
  113. }  
  114.   
  115. int main(int argc, char* argv[])  
  116. {  
  117.     int i = 0;  
  118.       
  119.     DList* dlist = dlist_head_create();  
  120.   
  121.     for(i = 0; i < 7; i++)  
  122.     {  
  123.         DStu* stu =(DStu*) malloc(sizeof(DStu));  
  124.         stu->score = i;  
  125.         dlist_append(dlist, (void*)stu);  
  126.     }  
  127.     dlist_print(dlist, print_int);  
  128.   
  129.     return 0;  
  130. }

  运行结果为:

  0        1       2       3       4       5       6
  Press any key to continue

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号