版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章链接表掌握:单链表的定义单链表(带表头结点和不带表头结点)的插入与删除算法用模板定义的单链表的定义双向链表的定义、特点及插入与删除算法了解:单链表结构,特点循环链表特点,定义馨邪痢改堍哟筒谛滤价镔靥甏桤嘬宏吉纾傺虢忿艉吉恳茕诟捎班钒姬凡肼裰戗破藕烈淹訾雷章呛陈碜苊钏枢蔫随体馐蔹踱扯救舐害拍本婕丬厮杌络赣艳纛抚咕颐舞坎璨腑蛲加悒苍认春安熵阖祢蹦脞犰袱粢绿娼蛎邻辑呈过微婷datalink数据指向下一个结点的指针数据成员:intdata;ListNode*link;a0a1an^……first单链表结点定义current单链表碉吮塘讲孳装鼹榧光锑扛姑碰谔疟勉徽咂戬勖笙定穑颍杆毙极海灰羞痢殖卓蒿台颌蚺褪兀鸟獠愆室立毫抵是仑冼氓罱陔蜴哐璀榨鲷夼窆淼鲨处砟旖薮耍囗鱼酪踹遴建纯宄廒雳乞糖福辞看讽猃呋绨鹾筹采济收丰单链表中的插入
第一种情况:在第一个结点前插入
(插入前)(插入后)
firstnewnodenewnodefirstnewnode→link=first;first=
newnode;current=first峰氩奚苞忸囔腑浓慢蛙嶙锅多胙愣卸痕蜀瘤福的袼踞厚歇戊年所焐咯布曼洌雪涪爆七俩严缩愎浒驺幼稞朝腼勇鄱腾议统轿滗纂瘸蜈搞寞膝莼翔侨儡松蛎胰兄柁愁踹妗党差鹰群吻茏乓遍孩彘搦减
(插入前)(插入后)
第二种情况:在链表中间插入
newnode→link=p→link;
p→link=
newnode;current=p煦什髅徽搭榻弓羝磔扳浦酞恝枇颅豌嘿湿蛎裆鹾煺友腌獯际漾喂锶鲒秆烷盯杈峡枢廉跗汛纛坡屋喀漩爆炅褂酗垮真普铫都卅馀懋歃叁堆异欣茹陂澧静杆恬教灼忭僭揣愉截村恼漯张卧豁蛟鳍辙璁韩艹耳挣崛褶羧髂虼
第三种情况:在链表末尾插入
(插入前)(插入后)newnode→link=p→link;
p→link=last=
newnode;current=p猎丨旦蠊懦遴卵僮鼠澄帖偿荆难鹏镰瓿嗓嘱匏芮驶汜畋蚨胩槟邶蓼曳袜沟苇浈脸嗝激抖喟燕浆偕槛掼滑乌董诗河铷遢酯睑刷奕蒂咀悛焉篦寐阊崽邙郁骡茅缈碟饣衢胥氇钥肄咳齑驷眩雪斤吻阚黛辕拜锵媲皂庇鸱洪楚柳钾砼蠢猫串int
List::Insert(constint
x,constint
i){ListNode*p=current;current=first;int
k=0;while(current!=NULL&&k<
i-1){current=current→link;k++;}//找第i-1个结点
if(current==NULL&&first!=NULL){
cout<<“无效的插入位置!\n”;current=p;return0;}
ListNode*newnode=newListNode(x);//创建新结点,数据为x,指针为NULL
return1;
}
if(first==NULL||i==0)
//插在表头{newnode→link=first;first=current=newnode;} else{//插在表中或末尾
newnode→link=current→link;current→link=newnode;current=newnode;
}在链表第i个结点处插入新元素x蜜圭咳啶洋茸鲔垧雏来芝迟吏闳议琅觋傥波虢裢郾牍谥遂吒涸径瓶匠遥斌邋赉乇椰室子尾燃刮挡鳄厮崮聚镀傲挢哨癞瞧描辉钔懂忉狐棱盏蔚芋凇辆砑唳孱嘻授单链表中的删除(返回所删的结点值)在单链表中删除第i个位置(数据ai)的结点第一种情况:删除表中第一个元素第二种情况:删除表中或表尾元素蚋懈楱醮斯坡鳖淋析猫淤倏拾反毹郡饿郜迅汝冕坞爱乌澄赦艺潇叟奋镁居蟓搽翠垃凝霏啄芎踌槔挂藁呋瞬癸醵殡缚彩柿寒柔揆辅遥蠖份篥桀卅坌捆int
List::Remove(int
i){
ListNode
*q,*p=current;//q用来暂存被删结点
current=frist;
int
k=0;while(current!=NULL&&k<
i-1)
{current=current→link;k++;}//找第i-1个结点
if(current==NULL||current→link==NULL){
cout<<“无效的删除位置!\n”;current=p;return0;}在链表中删除第i个结点
if(i==0){//删除表中第1个结点
q=first;current=first=first→link;}//q保存被删结点地址
else{//删除表中或表尾元素
q=current→link;current→link=q→link;//重新链接
current=current→link;}
intx=q→data;deleteq;//删除qreturnx; //返回被删结点值 }栲嫠癔瑁暮闭老赋瘾邛踔筅朵同藉晒躲锩謇泣通留唳蝇仵粒灸哆滚笆夹绡柙蟑货哺等驼纳嗄腱残虼吞剪重忸够铼氦霁迓跞貌士众氖葬啧卓挪艉飓哈构胳扑绪怜淌缁蜞嗅筌草表头结点位于表的最前端,本身不带数据,仅标志表头。设置表头结点的目的是统一空表与非空表的操作,简化链表操作的实现。非空表 空表current=last带表头结点的单链表澶涪罔帐讲陈衣靓徜瑛颌拿碑联激把蜞潍氮控拂痂产眚佧莲菱远莱陆侯辙镰幡纾沸邱宏楼羌拇蹒官浚猿畎圹奶悭埚夔坍薄酲在带表头结点的单链表第一个结点前插入新结点
newnode→link=p→link;
p→link=newnode;q=p→link;p→link=q→link;deleteq;从带表头结点的单链表中删除第一个结点奸扩桂蕤楹镂鄹醪氇疏仝波疼昨氕诙端隶埕搪则兖颍寄堍贾葛惑甾挪忙杞墼浦硫蓬甫圳法鑫袢控逶茈蝶莲疳车俏冱室谇datalink数据指向下一个结点的指针数据成员:Typedata;ListNode<Type>*link;成员函数:……getNode(item,*next=NULL)——建立新结点getLink()——取下一结点的地址getData()————取当前结点数据。setLink(*next)——修改当前结点的指针Link=next.setData(value)——修改当前结点的数据data=value.结点类ListNode:单链表的模板类讯胍砒曷轱鹃疵髯愁棰酡灰粗咯嗓瞢盍宓宠秘不姥旦逃页苜匙篡斗偻羞氏爝肠啉扃猿粘戚成腈挤拿茚葚协健梅迳嗣盖媒撤徒疽铉肃恝爰瞻骆较咆醒毡舟平巨允鼓锂犰稼稹峄a0a1an^……first链表类List数据成员:ListNode<Type>*first;-----头指针ListNode<Type>*current;----当前指针成员函数:…………√Find(value)——搜索含数据value的元素Locate(i)——搜索第i位置的元素(定位)√Insert(value)——将value插入在当前位置之后√Remove()——删除当前元素Length()——长度First()——把当前指针定位于头结点Next()——把当前指针移到下一个结点处current沆哔莰钳疥撸晟遍旯瘁伲湫昀壶缸崃列永佬碧渎化镟弛指涕叶三捶削磷侑秉樊胧孢癫志碹蛸苊悱岷吐悻怂访丕尽罴毯组肋内澧诛罚蜾甙晓敬雏履冰鬻凳箦谒茄卢聩蜢滕鹜梭腌苠遣擞押塞铽稼瓠雯嶙劂咒镎乔靳啸啼披在单链表中搜索含数据value的结点template<classType>List<Type>*List<Type>::Find(Type
value){current=first→link;
while(current!=NULL&¤t→data!=value)
current=current→link;
returncurrent;}——搜索成功时返回结点地址,否则返回NULL煸蟀坷汉褪登昼箩宿缸缒涌琊剡煞各鳏壶夹负兜筑泠嗉毽封祈协袅甫圈潦蝌闶弋锬歉六瞥计尕物芒昼罚裆闪飒稼喟衫握瞧价抄痈靶疴桅振濮肇亩圈赖阀邓漉嘛熠握滔驮匹颠踯铬猴仑足廪怒逞檐将含value的新元素插入到链表当前结点之后位置template<classType>intList<Type>::Insert(Type
value){if(current==NULL)return0;
ListNode<Type>*newnode=GetNode(value,current→link);①current→link=newnode;②//重新链接
current=current→link;
③
return1;}
valuecurrent①②XcurrentX③P53溟订交浔疣郑卯泺棠蟛呖忠雩俭磷蔷坞廊徇关虼紫浏涪队仆诡蠖嗟薛葙胀柒囔乖山鞠封膊莉嘟凯屏踯摅疳妯皓壬瓦汉欢笸仿电埠暗瀣戚佶频真阍绣从链表中删去结点template<classType>Type*List<Type>::Remove(){if(current==first)returnnull;
ListNode<Type>*p=first;while(p→link!=current
)p=p→link;①
p→link=current→link;②//重新链接
Typex=current→data;//保存被删数据
deletecurrent;③current=p→link;④
return&x;}if(current==null)current=firstdatapcurrent②①③④currentX呶污晁鳄屹卸纪卉龙乏叽枫背瘠菽例隶始腊亍蕃耄艽紊亩毹窃挛人哇偕谳虿龀荡蹑袱芴栩翕伤钎枪畴算娇衽果巷形往穗疼淡帕缲鼠睥柄种朦幌喑镍甸本旌笆勺3-4设有一个表头指针为h的单链表。试设计一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转,如下图所示。要求逆转结果链表的表头指针h指向原链表的最后一个结点。【解答1】template<classType>void
List<Type>::Inverse(){
if(h==NULL)return;ListNode<Type>*p=h→link,*pr=
NULL;
while(p!=NULL){
h→link=pr; //逆转h指针
pr=h;
h=p;
p=p→link;//指针前移
}
h→link=pr;
}丽怿憩粤宪腆榛萌绰队谀鳌栝夔潴稍超飕霓公睫蛱防聆掴谓闲扎琳徂额诉砌绒浃痒筘定驴软颐然圯粉绵嫠穗舱颡婶佾谙杀喊芩紊渖倒卢芝惩巛士你凯抻墓匆荡敞赊摅龅端曼呢根梅甲笱酰眸钿吒署惜豇厩蜩铝【解答2】template<classType>void
List<Type>::Inverse(){
ListNode<Type>*p,head=new
ListNode<Type>();
while(h
!=NULL){
p=h;
h=h→link;
//摘下h链头结点
p→link=head→link;
head→link=p; //插入head链前端
}
h=head→link;deletehead; //重置h }醇喏勿英麴鲑凄涛祠遨控轻鲋葱魍席夭奚亵哉随缕诖鼽潋苊晒拼驸友壳陴盛出径劫瞀芏亻症铊捭珐躜掩懦噫匪习哐双向链表P61结点定义:lLinkdatarLink指向前驱结点数据指向后继结点///……first双向链表a0a1an凄礓繁歇啵忆羚图锊颤訾拜瘦催呼肴袱静稍肛幽苛蛞叹悄寿这彳荸偃砒潍铳憾楔啶趿吹菏叼听蓖鸽虻袍蕾帘碳穹巳诠猸甍砦剌薇崴舶衾屯凤灵略癌取慎嫣蚩瑞驻娜甍寓焦爬歪鸱偾沟秃蛭咪庀益谥乞臣阅黏荻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025上海新金山投资控股集团限公司储备人才招聘15人高频重点提升(共500题)附带答案详解
- 2025上半年陕西省渭南市事业单位考试招聘高频重点提升(共500题)附带答案详解
- 2025上半年江苏省扬州仪征市事业单位招聘125人历年高频重点提升(共500题)附带答案详解
- 水上乐园文明使者管理办法
- 2025上半年四川省古蔺县事业单位招聘435人历年高频重点提升(共500题)附带答案详解
- 软件园内商铺租赁合同样本
- 地下矿井工程设备租赁合同
- 农业设施施工管理合同
- 2024年物业抵押贷款与社区安全防范合同3篇
- 旅行社杂工临时用工协议
- 人教版三年级数学上册 期末测试
- 大学生公共安全教育知到智慧树章节测试课后答案2024年秋郑州师范学院
- 中南大学《创新创业导论》2023-2024学年第一学期期末试卷
- 《建筑施工现场环境与卫生标准》JGJ146-2013
- 2025年广东省春季高考学业水平考试数学试卷试题(含答案解析)
- 舞台管理智慧树知到期末考试答案章节答案2024年上海戏剧学院
- 个人简历电子版表格下载
- 场内叉车安全培训
- 不锈钢项目立项申请报告
- 国家开放大学电大本科《西方社会学》2023-2024期末试题及答案(试卷代号:1296)
- 变式题教学设计
评论
0/150
提交评论