c语言链表的用法.docx
《c语言链表的用法.docx》由会员分享,可在线阅读,更多相关《c语言链表的用法.docx(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c语言链表的用法链表的定义一般使用构造体,在看(数据构造与算法分析)这本书的时候发现,书中频繁的使用typedef的关键字,结果真的很棒不仅保持的代码的整洁程度,也让我们在下面的编码经过中少见了很多烦人的指针当然指针还是一直存在的。所以这里也借用了书中的定义方法。structNode;typedefstructNode*PtrNode;typedefPtrNodePosition;typedefPtrNodeList;structNodeintValue;PtrNodeNext;下面接着书写一个建立链表的函数,输入每个节点的值,直到这个值是-1的时候函数结束。在这个里面,我以前一直搞不明白为什
2、么需要定义三个Node*,如今终于了解了,最终还是温习了指针的内容明白的,这里讲一下指针实现链表对指针的操作很频繁,需要比拟扎实的把握了指针之后,在来看链表会轻松很多。在下面的一段程序里,我分别定义了head/p/tmp这三个指向节点构造体的指针,head的主要作用就像一个传销头目,他会主动联络上一个下线p,然后他就什么也不干了,p接着去发展一个又一个的下线tmp,结果一串以head为首的链表就出来了。起先,我总觉得有了head,为什么还要p,这是由于假如直接使用head去指向下一个节点,head的位置也是不断在移动的,即它永远处于链表的尾端,这样当我们返回链表的时候,其实是空值。所以,我们需
3、要p这个中转环节。其实,这种做法在指针中非常普遍,大部分有返回指针类型的函数中,都会首先定义一个指针变量来保存函数的传入的参数,而不是对参数直接进行操作。函数功能:创立一个链表函数描绘:每次输入一个新的整数,即把新增加一个节点存放该整数,当输入的整数为-1时,函数结束。Listcreate()intn=0;Positionp,head,tmp;head=NULL;tmp=malloc(sizeof(structNode);if(tmp=NULL)printf(tmpmallocfailed!nreturnNULL;elsep=tmp;printf(pleaseinputthefirstnode
4、smessage!nscanf(%d,(tmp-Value);while(tmp-Value!=-1)n+=1;if(n=1)head=p;tmp-Next=NULL;elsep-Next=tmp;p=tmp;tmp=malloc(sizeof(structNode);printf(pleaseinputthe%dnode!n,n+1);scanf(%d,(tmp-Value);p-Next=NULL;free(tmp);/free函数free掉的只是申请的空间,但是指针还是仍然存在的。tmp=NULL;returnhead;接下来,在写一个删除链表节点的函数,输入一个整数然后遍历链表节点,当
5、链表节点的值与该整数相等的时候,即把该节点删除。在完成这个函数首先一定要把这个经过考虑清楚,不可否认我之前是一个上来就敲代码的人,看了(剑指offer)感觉这种习惯是程序员的大忌,甚至还想写一篇博客,名字都想好了(程序员的自己修养之考虑在前,代码在后)。其实想想也是,我们写程序的目的是为了解决问题,而不是为了简单的写程序,纯粹的让程序跑起来大概只会在上学那会存在吧!真实的程序开发中需要考虑几乎所有能想到的实际问题,所以无论程序再下,一要学会先考虑清楚,再下笔写程序。关于这个函数,我们要想到的是:1假如链表为空,我们该怎么做,当然是直接返回。2假如要删除的元素为头节点该怎么办?3假如要删除的元素
6、为尾节点该怎么办?当注意到以上三个部分,我们的程序就可能避免掉了输入链表为空,程序直接崩溃的现象,可以以避免删除元素值为头节点时删不掉的尴尬。我们的程序就有了一定的鲁棒性。下面着重考虑链表的删除的实现:list:?Node_a-Node_b-Node_c-Node_d;?list?tmp?p?-?tmp-Next=p-Next;list:?Node_a-Node_b-Node_d?free(p)假设我们要删除的节点为上图的Node_c;假设我们能够找到Node_c的前一个位置tmp和被删除节点位置p的话;这个时候我们只需要执行tmp-Next=p-Next即可。只要完成上面的分析以及考虑到各种
7、情况,我们完成下面的代码就水到渠成了。函数功能:删除链表中指定值的节点假如存在多个,只删除第一个本例中输入一个整数,删除链表节点值为这个整数的节点。ListDeleteNode(Listlist)Positionp,tmp;intvalue;if(list=NULL)printf(Thelistisnull,functionreturn!nreturnNULL;elseprintf(pleaseinputthedeleteNodesvalue:nscanf(%d,value);p=list;if(p-Value=value)list=p-Next;free(p);p=NULL;returnli
8、st;while(p!=NULLp-Value!=value)tmp=p;p=p-Next;if(p-Value=value)if(p-Next!=NULL)tmp-Next=p-Next;elsetmp-Next=NULL;free(p);p=NULL;returnlist;?关于链表的使用场景分析:链表在程序开发中用到的频率还是非常高的,所以在高级语言中往往会对链表进行一些实现,比方STL中list以及Java中也有类似的东西。在目前的服务器端开发,主要运用链表来接收一些从数据中取出来的数据进行处理。即便你不知道链表的底层实现,仍然能够成功的运用STL里面的现成的东西。但是作为一个学习者,
9、我觉得会使用和从底层把握仍然是两个不同的概念,linux之父讲:talkisless,showyoucode。下面的程序,用链表模拟了一个通讯录的功能,包括添加联络人,查找联络人,以及删除联络人。PS:关于鲁棒性,程序中最大的危险是使用了gets这个函数,目前先保留使用gets,等待找到工作之后在做进一步的程序完善。尼玛,读书去。应届生,找个工作他妈咋这么难呢!?工作经历,工作经历,艹,那个大牛一出校门就什么都会。/*Programe:ThisisaphonelistwritebylistTheprogrameisjustprictiseforlistAuthor:heatnanMail:96
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 用法
限制150内