版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——c语言链表的用法c语言链表的用法
链表是数据布局中对比根基也是对比重要的类型之一,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据布局的初衷在哪里?下面我就为大家介绍下c语言链表的用法。
c语言枚举的用法如下:
这是由于,在我们使用数组的时候,需要预先设定目标群体的个数,也即数组容量的大小,然而实时处境下我们目标的个数我们是不确定的,因此我们总是要把数组的容量设置的很大,这样以来就滥用了好多的空间。另外,数组在举行插入操作和删除操作的时候,在插入或者删除制定元素之后,我们往往需要举行循环移位,这增加了我们的线性开销。
正是由于以上的两种主要理由,链表被设计出来用于一般表的操作。为了制止上面描述数组的两种弊端,我们梦想链表有一下的特点
1可以生动的扩展自己的长度。
2存储地址不连续,删除或者插入操作的时候不需要循环移位。
要实现以上两个特点,我们需既要保证每个节点的独立性,又要保存相邻两个节点的联系。
为此,链表一般被设计为下面的形式。
NodeNodeNode
链表是由一个一个的节点组成的,可以便当和自由的插入未知个Node,前一个节点中用指针保存着下一个节点的位置,这样以来便顺遂的完成了我们对链表的两点期望,但是唯一的缺点是增加了额外的空间消耗。
————————————————————————————————————————————————————————————————————————————
链表的定义:
链表的定义一般使用布局体,在看《数据布局与算法分析》这本书的时候察觉,书中频繁的使用typedef的关键字,结果真的很棒不仅保持的代码的感激程度,也让我们在下面的编码过程中少见了好多烦人的指针(当然指针还是一向存在的)。所以这里也借用了书中的定义方法。
structNode;
typedefstructNode*PtrNode;
typedefPtrNodePosition;
typedefPtrNodeList;
structNode
intValue;
PtrNodeNext;
;
下面接着书写一个建立链表的函数,输入每个节点的值,直到这个值是-1的时候函数终止。
在这个里面,我以前一向搞不明白为什么需要定义三个Node*,现在终究了解了,最终还是复习了指针的内容明白的,这里说一下指针实现链表对指针的操作很频繁,需要对比扎实的掌管了指针之后,在来看链表会轻松好多。在下面的一段程序里,我分别定义了head/p/tmp这三个指向节点布局体的指针,head的主要作用就像一个传销头目,他会主动联系上一个下线p,然后他就什么也不干了,p接着去进展一个又一个的下线tmp,结果一串以head为首的链表就出来了。
起先,我总觉得有了head,为什么还要p,这是由于假设直接使用head去指向下一个节点,head的.位置也是不断在移动的,即它永远处于链表的尾端,这样当我们返回链表的时候,其实是空值。所以,我们需要p这个中转环节。(其实,这种做法在指针中分外普遍,大片面有返回指针类型的函数中,都会首先定义一个指针变量来保存函数的传入的参数,而不是对参数直接举行操作)。
?
/*
函数功能:创造一个链表
函数描述:每次输入一个新的整数,即把新增加一个节点存放该整数,
当输入的整数为-1时,函数终止。
*/
Listcreate
intn=0;
Positionp,head,tmp;
head=NULL;
tmp=mallocsizeofstructNode;
iftmp==NULL
printftmpmallocfailed!;
returnNULL;
else
p=tmp;
printfpleaseinputthefirstnodesmessage!;
scanf%d,tmp-Value;
whiletmp-Value!=-1
n+=1;
ifn==1
head=p;
tmp-Next=NULL;
else
p-Next=tmp;
p=tmp;
tmp=mallocsizeofstructNode;
printfpleaseinputthe%dnode!,n+1;
scanf%d,tmp-Value;
p-Next=NULL;
freetmp;//free函数free掉的只是申请的空间,但是指针还是照旧存在的。
tmp=NULL;
returnhead;
接下来,在写一个删除链表节点的函数,输入一个整数然后遍历链表节点,当链表节点的值与该整数相等的时候,即把该节点删除。
在完成这个函数首先确定要把这个过程斟酌领会,不成否认我之前是一个上来就敲代码的人,看了《剑指offer》感觉这种习惯是程序员的大忌,甚至还想写一篇博客,名字都想好了《程序员的自我修养之斟酌在前,代码在后》。其实想想也是,我们写程序的目的是为了解决问题,而不是为了简朴的写程序,纯粹的让程序跑起来约莫只会在上学那会存在吧!真实的程序开发中需要考虑几乎全体能想到的实际问题,所以无论程序再下,一要学会先斟酌领会,再下笔写程序。
关于这个函数,我们要想到的是:
1假设链表为空,我们该怎么做,当然是直接返回。
2假设要删除的元素为头节点该怎么办?
3假设要删除的元素为尾节点该怎么办?
当留神到以上三个片面,我们的程序就可能制止掉了输入链表为空,程序直接崩溃的现象,也可以制止删除元素值为头节点时删不掉的难堪。我们的程序就有了确定的鲁棒性。
下面着重考虑链表的删除的实现:
list:????Node_a-Node_b-Node_c-Node_d;
??????????????list??????tmp????????p
?
???????????tmp-Next=p-Next;
?
?
list:??????Node_a-Node_bNode_d
?????????????????????????????????????freep
假设我们要删除的节点为上图的Node_c;假设我们能够找到Node_c的前一个位置tmp和被删除节点位置p的话;这个时候我们只需要执行tmp-Next=p-Next即可。
只要完成上面的分析以及考虑到各种处境,我们完成下面的代码就水到渠成了。
/*
函数功能:删除链表中指定值的节点(假设存在多个,只删除第一个)
本例中输入一个整数,删除链表节点值为这个整数的节点。
*/
ListDeleteNodeListlist
Positionp,tmp;
intvalue;
iflist==NULL
printfThelistisnull,functionreturn!;
returnNULL;
else
printfpleaseinputtheNodesvalue:;
scanf%d,value;
p=list;
ifp-Value==value
list=p-Next;
freep;
p=NULL;
returnlist;
whilep!=NULLp-Value!=value
tmp=p;
p=p-Next;
ifp-Value==value
ifp-Next!=NULL
tmp-Next=p-Next;
else
tmp-Next=NULL;
freep;
p=NULL;
returnlist;
?关于链表的使用场景分析:
链表在程序开发中用到的频率还是分外高的,所以在高级语言中往往会对链表举行一些实现,譬如STL中list以及Java中也有类似的东西。在目前的服务器端开发,主要运用链表来接收一些从数据中取出来的数据举行处理。
即使你不知道链表的底层实现,依旧可以告成的运用STL里面的现成的东西。但是作为一个学习者,我觉得会使用和从底层掌管依旧是两个不同的概念,linux之父说:“talkisless,showyoucode”。
以下的程序,用链表模拟了一个电话通讯录的功能,包括添加联系人,查找联系人,以及删除联系人。
PS:关于鲁棒性,程序中最大的危害是使用了gets这个函数,目前先留存使用gets,等待找到工作之后在做进一步的程序完善。(尼玛,读书去。。。应届生,找个工作***咋这么难呢!??工作阅历,工作阅历,艹,那个大牛一出校门就什么都会。)
?
/**************************************************************************
Programe:
Thisisaphonelistwritebylist
Theprogrameisjustprictiseforlist
Author:heatnan
Mail:964465194@.com
Data:2022/07/27
**************************************************************************/
#include
#include
#include
#defineN25
#defineM15
structnode;
typedefstructnode*p_node;
typedefp_nodeList;
typedefp_nodePosition;
typedefstructnode**PList;
structnode
charname[N];
charnumber[M];
Positionnext;
;
intJudgeNameExistListlist,char*name;
voidAddPersonPListlist;
voidPrintListListlist;
ListFindPersonListlist;
ListFindPersonByNameListlist,char*name;
intAddPersonByNamePListlist,Listnode;
intDeletePersonByNamePListlist,char*name;
voidDeletePersonPListlist;
intmain
Listlist=NULL;
Positionp;
charcmd[100];
while1
printfMAIN;
printf*******1addaperson*******;
printf*******2showthephonelist*******;
printf*******3findfromphonelist*******;
printf*******4fromphonelist*******;
printfPleaseinputthecmdnumber:;
getscmd;
switchcmd[0]
case1:
AddPersonlist;
break;
case2:
PrintListlist;
break;
case3:
FindPersonlist;
break;
case4:
DeletePersonlist;
break;
default:
printfwrongcmd!;
break;
return0;
/*
Function:判断要添加的联系人名称是否已经存在于电话簿中.
Input:List电话列表,name要添加的联系人的姓名.
Return:已经存在返回1,不存在返回0.
*/
intJudgeNameExistListlist,char*name
ifFindPersonByNamelist,name!=NULL
return1;
else
return0;
/*
Function:根据输入的姓名查找联系人的信息节点
Input:要输入的电话列表list,姓名name
Return:返回查找到的节点
*/
ListFindPersonByNameListlist,char*name
whilelist!=NULL
ifstrcmplist-name,name==0
break;
list=list-next;
returnlist;
/*
Function:根据姓名添加新的联系人到联系人列表
Input:指向联系人列表地址的指针,新用户节点
Return:添加告成返回1,添加失败返回0
*/
intAddPersonByNamePListlist,Listnode
ifnode==NULL
printfthenodeisNULL!;
return0;
if*list==NULL
*list=node;
return1;
ListpHead=*list;
whilepHead-next!=NULL
pHead=pHead-next;
pHead-next=node;
return1;
voidAddPersonPListlist
Positiontmp;
Positionp_head;
tmp=structnode*mallocsizeofstructnode;
charname[N];
charnumber[M];
iftmp==NULL
printfmallocthetmpnodefailedinfunctionaddperson!;
else
printfpleaseinputthename:;
getsname;
printfpleaseinputthenumber:;
getsnumber;
strcpytmp-name,name;
strcpytmp-number,number;
tmp-next=NULL;
ifJudgeNameExist*list,name==1
freetmp;
printfthenamehavealreadyexist!;
return;
AddPersonByNamelist,tmp;
/*
Function:打印联系人列表
Input:联系人列表
*/
voidPrintListListlist
Positionshow;
show=list;
ifshow==NULL
return;
printfNow,weprintthephonelist:;
whileshow!=NULL
printfName:%sNumber:%s,show-name,show-number;
show=show-next;
ListFindPersonListlist
charname[N];
PositionpHead=list;
printfpleaseinputthenameyouwillfind:;
getsname;
Positionnode=FindPersonByNamelist,name;
ifnode!=NULL
printffindsuccess!name-%snumber-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重症哮喘急救护理的培训与演练
- 中医饮食护理原则
- 卵巢囊肿的定期复查与护理
- 创新护理带教方法与实践
- 自体干细胞移植过程中的护理配合
- 大口径穿刺护理职业防护要点
- 教资试题综合素质及答案
- 风湿免疫科规培第二年出科考(B卷)含答案解析
- 硅橡胶装置操作工工作水平强化考核试卷含答案
- 电学计量员安全实操模拟考核试卷含答案
- SHA1-42(01)-2025 上海市市政工程养护维修估算指标 第一册 城市道路
- 四川省成都市成华区2024-2025学年八年级(下)期末物理试卷(含解析)
- 老年人睡眠改善策略-洞察及研究
- 2025至2030美术馆产业市场深度分析及发展趋势与发展趋势分析与未来投资战略咨询研究报告
- 医学检验试题及答案
- 执业兽医资格重点考点大全2025
- TCFA 0106012-2023 汽车压铸件孔隙率测定方法
- 2025届四川省绵阳市名校联盟英语七年级第二学期期末统考试题含答案
- DB14T 1023-2025 公路工程施工危险源辨识指南
- DB11∕T 969-2016 城镇雨水系统规划设计暴雨径流计算标准
- GB/T 44399-2024移动式金属氢化物可逆储放氢系统
评论
0/150
提交评论