付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华中
理学院
章
英zy数据结构与算法2/40第三讲单链表本讲知识点:(1)熟悉单链表的创建方法(2)掌握单链表的各类操作(3)了解链表的相关应用重点:单链表的操作难点:单链表的应用已知线性链表la和lb中的数据元素按值递增,现要将la和lb合并为新的线性表lc,使lc中的数据元素仍然递增有序。la提出问题281219……13/4037∧lb线性链表的形成需要什么的支撑?如何初始化,使其
起来?合并时指针的移动规则是什么?分析问题4/40链表中的结点解决问题ZHAOQIANSUNLIZHOUWUZHENGWANG^HWU5/406/40template
<class
ElemType>struct
Node{//数据成员:ElemType
data;
//数据域Node<ElemType>
*next;
//指针域//构造函数:Node();
//无参数的构造函数Node(ElemType
item,
Node<ElemType>
*link
=NULL);//已知数据域和指针域建立结构};结点类参见文件夹S2_3里的文件node.h7/40申请一个结点空间Node*p;p
=
new
Node;或者p=new
Node(“WU”,NULL);WU^p例如:8/40template
<class
ElemType>class
SimpleLinkList{protected://
链表实现的数据成员:Node<ElemType>*head;
//头结点指针//辅助函数Node<ElemType>
*Ge emPtr(int
position)
const;//返回指向第position个结点的指针void
Init();
//初始化线性表……
……简单线性链表类参见文件夹S2_3里的文件simple_lk_list.h9/40后面的数据暂且不看,前者的形成:Node*la,*lb;la
=new
Node;lb=
new
Node;例如:137
∧la281219……lb一、单链表之初始化void
SimpleLinkLisemType>::SimpleLinkList()//操作结果:构造一个空链表{Init();}构造函数template
<class
ElemType>10/40一、单链表之初始化template
<class
ElemType>void
SimpleLinkLis
emType>::Init()//操作结果:初始化单链表{head
=
new
Node<ElemType>;//构造头指针}head11/40头插法
演示HsC1C2HCi-1Ci-2C1^……sCix^二、单链表之创建12/40s
=
new
Node<ElemType>(e,
h->next);//生成新结点h->next
=
s;//将s
到链表的头结点之后头插法代码实现13/40法
演示H^sC1
r
CiHCi-1C1C2……r
xC1H
sr14/40^二、单链表之创建法代码实现r
=
h;s
=
new
Node<ElemType>(e,
h->next);//生成新结点r->next
=
s;//
将s
到最后r=r->next;
//或者r=s;//r后移r=h;放在循环外面仅需执行一次15/40三、单链表之查找指针定位:根据已给的表头指针,按由前向后的次序
单链表的各个结点,定位到需要的位置处。heada1a2a3a4……123一个数据元素,则指针需要定tmpPtr例如:请在4号位置位到3号位置16/4017/40指针定位过程heada1a2a3a4……tmpPtrcurPosition=012
3tmpPtr=tmpPtr->next;curPosition++;tmpPtr=tmpPtr->next;curPosition++;tmpPtr=tmpPtr->next;curPosition++;tmpPtrtmpPtrtmpPtr第一步tmpPtr=head18/40template<class
ElemType>Node<ElemType>*SimpleLinkLis
emType>::Ge emPtr(int
position)const{Node<ElemType>
*tmpPtr
=
head;int
curPosition
=0;while
(tmpPtr!=
NULL
&&
curPosition
<position){tmpPtr
=
tmpPtr->next;curPosition++;}if
(tmpPtr
!=
NULL
&&
curPosition
==
position)returntmpPtr;{else{return
NULL;//
查找成功
}//
查找失败
}}参见文件夹S2_3里的文件simple_lk_list.hheada1a2a3a4……newPtre×在单链表中第i(1<=i<=Length()+1)个结点之前
一个数据域为x的结点。
演示例如:i=3tmpPtr
tmpPtr
tmpPtr四、单链表之19/40的三个基本操作在单链表上找到
位置,即定位找到第i-1个结点。tmpPtr
=
Ge emPtr(position
-
1);生成一个以e为值的新结点。newPtr
=
new
Node<ElemType>(e,
tmpPtr->next);将新结点链入单链表中。tmpPtr->next
=
newPtr;20/400算法template
<class
ElemType>StatusCode
SimpleLinkLis
emType>::Insert(intposition,
cons
emType
&e){ if
(position
<
1||
position
>
Length()
+
1){else{//position范围错return
RANGE_ERROR;
//
位置不合法
}//position合法Node<ElemType>
*tmpPtr;tmpPtr
=
Ge emPtr(position
-
1);Node<ElemType>
*newPtr;newPtr
=
newNode<ElemType>(e,
tmpPtr->next);tmpPtr->next
=
newPtr;return
SUCCESS;}}本 采用
法创建单链表五、单链表之形成lala1la13la137∧构造函数初始化法创建1法创建3法创建722/40思考数据存放在哪里?int
a[]
=
{1,
3,
7,
9,
12};或者动态录入for(i=0;
i<n;
i++)cin>>a[i];多少个数据结点由int
n
=
5;或者cin>>n;控制?23/40本 采用
法创建单链表template
<class
ElemType>void
Create(SimpleLinkLis
emType>
&la,
ElemTypea[
],
intn)//操作结果:由数组a{la.Clear();的n个元素构造线性表//清空lafor
(intposition
=
1;
position
<=
n;
position++)la.Insert(position,
a[position
-1]);//向la
元素}五、单链表之形成24/40继续解决问题链表已经形成,如何进行合并?la137∧281219……lblc∧25/40解决问题281219……137∧lalblc12aPosition=12小bPosition=1bPosition=2aPosition=21小3小7小3aPosition=37∧aPosition=4越界26/40template
<class
ElemType>void
MergeList(const
SimpleLinkLisemType>
&la,const
SimpleLinkLisemType>
&lb,SimpleLinkLis
emType>
&lc){ElemType
aItem,
bItem;//la和lb中当前数据元素int
aLength
=
la.Length(),
bLength
=
lb.Length();//la和lb的长度int
aPosition
=
1,
bPosition
=
1;//la和lb的当前元素序号lc.Clear();//清空lc算法实现27/4028/40while
(aPosition
<=
aLength
&&
bPosition
<=bLength){
//取出la和lb中数据元素进行归并la.Gelb.Geem(aPosition,
aItem);em(bPosition,
bItem);if(aItem
<
bItem){//归并aItemlc.Insert(lc.Length()+1,aItem);aPosition++;}else{//归并bItemlc.Insert(lc.Length()+1,bItem);bPosition++;}}算法实现while
(aPosition
<=
aLength){ //归并la中剩余数据元素la.Ge em(aPosition,
aItem);lc.Insert(lc.Length()
+
1,aItem);aPosition++;}while
(bPosition
<=
bLength
){
//归并lb中剩余数据元素lb.Ge em(bPosition,
bItem);lc.Insert(lc.Length()
+
1,bItem);bPosition++;}}算法实现29/40实战:
理工2002年考研题程序阅读题阅读下面的程序,在空白处填上恰当的内容。void
Addpolyn(Slink
&Ha,
Slink
&Hb){ /*用带节点的单链表
多项式,Ha和Hb分别是两个多项式链表的指针*//*多项式加法算法:将多项式Hb加到Ha上,Ha=Ha+Hb,利用两个多项式节点构成“和多项式”*/pa=Ha;pb=Hb;qa=pa→next;
qb=pb→next;/*qa和qb分别指向Ha和Hb的当前节点,pa和pb分别指向Ha和Hb当前节点的前一个节点*/30/40HaHbpapb
qb(1)Ha的指数小qacoef域exp域……系数相加不为0系数相加为0Hb的指数小Ha与Hb的指数相等31/40while(
(qa!=NULL)
&&(qb!=NULL)){
a=qa→data;
b=qb→data;switch(cmp(a,b)){case
-1:
/*多项式Ha当前节点的指数值小*/pa=qa;qa=qa→next;break;case
0:
/*两者值相等*/sum=a.coef+b.coef;if(sum!=0.0)
{
qa→data=sum;pa=qa;}else{pa→next=qa→next;free(qa);}
(1)
;pb→next=qb→next;
free(qb);
qb=pb→next;break;32/40case
1:
/*多项式Hb当前节点的指数值小*/pb→next=qb→next;
(2)
;
(3)
;
(4)
;break;}/*
switch end
*/}
/* while
end
*/if(qb!=NULL)free(pb);/*
(5)
;Hb的头节点*/}33/40删除单链表中第position个位置的元素。两个基本操作:在单链表上找到前驱结点。从单链表上删除该结点。34/40演示六、单链表之删除35/40heada1a2a3a4……tmpPtr例如:i=3tmpPtr
tmpPtrnextPtr六、单链表之删除tmpPtr
=
Ge emPtr(position
-
1);Node<ElemType>
*nextPtr
=
tmpPtr->next;tmpPtr->next
=
nextPtr->next;e
=
nextPtr->data;delete
nextPtr;36/40删除算法template
<classElemType>StatusCode
SimpleLinkLis
emType>::Delete(intposition,
ElemType
&e){ if
(position
<
1
||
position
>
Length()){//position范围错returnRANGE_ERROR;
}else{//position合法Node<ElemType>
*tmpPtr;tmpPtr=Ge emPtr(position
-1);Node<Elem
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 糖尿病患者营养膳食控制方案
- 固体废物分类贮存管理指南
- 前台接待服务标准化操作规范
- 售后服务质量考核管理标准
- 环保设施升级改造方案
- 茄子嫁接育苗定植田间操作指南
- 突发环境事件风险防控方案
- 广东省梅州市兴宁市中考2026年数学一模试卷附答案
- 孕期产后营养调理手册
- 蔬菜地下害虫化学防治操作规程
- 雨课堂学堂在线学堂云《环境工程概论(沈建)》单元测试考核答案
- 《思想政治教育方法论》课程讲义
- 2025年摇滚音乐节举办项目可行性研究报告及总结分析
- 核心考点03 断句-2026年高考《语文》一轮复习高效培优系列讲义
- 高级微观经济学
- 2025年助产证考试试题及答案
- 智慧树知到《大数据与人工智能(哈尔滨商业大学)》章节测试含答案
- 针灸学试题库(含参考答案)
- 弱电安防知识培训课件
- 肺功能进修生汇报课件
- -2025年浙江省衢州市开化县重点高中自主招生 数学 试卷 (学生版+解析版)
评论
0/150
提交评论