c语言中比链表优秀的,C语言的那些小秘密之链表(二)

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

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

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

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

特此说明:

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

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

#include 

#include 

typedefenum_DListReturn

{

DLIST_RETURN_OK,

DLIST_RETURN_FAIL

}DListReturn;

typedefstruct_DStu

{

intscore;

}DStu;

typedefstruct_DListNode

{

struct_DListNode* prev;

struct_DListNode* next;

DStu* data;

}DListNode;

typedefstruct_DList

{

DListNode* head;

}DList;

typedefDListReturn (*DListPrintFunction)(void* data);

DListNode* dlist_node_create(void* data)

{

DListNode* node;

if((node = (DListNode*) malloc(sizeof(DListNode)))==NULL)

{

printf("分配空间失败!");

exit(0);

}

if(node != NULL)

{

node->prev = NULL;

node->next = NULL;

node->data =(DStu*)data;

}

returnnode;

}

DList* dlist_head_create(void)

{

DList* thiz;

if((thiz = (DList*)malloc(sizeof(DList)))==NULL)

{

printf("分配空间失败!");

exit(0);

}

if(thiz != NULL)

{

thiz->head = NULL;

}

returnthiz;

}

DListReturn dlist_append(DList* thiz,void* data)

{

DListNode* node = NULL;

DListNode* cursor = NULL;

if((node = dlist_node_create(data)) == NULL)

{

returnDLIST_RETURN_OK;

}

if(thiz->head == NULL)

{

thiz->head = node;

returnDLIST_RETURN_OK;

}

cursor = thiz->head;

while(cursor != NULL && cursor->next != NULL)

{

cursor = cursor->next;

}

cursor->next = node;

node->prev = cursor;

returnDLIST_RETURN_OK;

}

DListReturn dlist_print(DList* thiz, DListPrintFunction print)

{

DListNode* iter = thiz->head;

while(iter != NULL)

{

print(iter->data);

iter = iter->next;

}

printf("\n");

returnDLIST_RETURN_OK;

}

DListReturn print_int(void* data)

{

DStu* ss=(DStu*)data;

printf("%d\t ", ss->score);

returnDLIST_RETURN_OK;

}

intmain(intargc,char* argv[])

{

inti = 0;

DList* dlist = dlist_head_create();

for(i = 0; i 

{

DStu* stu =(DStu*) malloc(sizeof(DStu));

stu->score = i;

dlist_append(dlist, (void*)stu);

}

dlist_print(dlist, print_int);

return0;

}

运行结果为:

4ea9be43bb9d0ee1f72ef968b7de01c3.gif

0        1       2       3       4       5       6

Press any key to continue

51/512345>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值