计算机软件及应用数据结构-课件-单链表_第1页
计算机软件及应用数据结构-课件-单链表_第2页
计算机软件及应用数据结构-课件-单链表_第3页
计算机软件及应用数据结构-课件-单链表_第4页
计算机软件及应用数据结构-课件-单链表_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1单链表数据结构电子教案[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第1页。2特点每个元素(表项)由结点(Node)构成。线性结构

结点之间可以连续,可以不连续存储结点的逻辑顺序与物理顺序可以不一致表可扩充单链表(SinglyLinkedChain)datalinka1a2a3a4a5Λfirst[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第2页。3单链表的存储映像free(a)可利用存储空间a0a2a1a3freefirst(b)经过一段运行后的单链表结构[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第3页。4单链表的结构定义在C中定义单链表的结构十分简单:

typedefintT; //结点数据的类型

typedefstructnode{//结点结构定义

Tdata;//结点数据域

structnode*link;//结点链接指针域

}ChainNode;//结点命名这是一个递归的定义。在结构定义时不考虑操作,以后在定义和实现链表操作时直接使用结构的成分。[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第4页。5单链表的类定义使用面向对象方法,要把数据与操作一起定义和封装,用多个类表达一个单链表。

链表结点(ChainNode)类链表(Chain)类定义方式

复合方式嵌套方式

继承方式结构方式[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第5页。6

classChain;

//复合方式

classChainNode{

//链表结点类

friendclassChain;

//链表类为其友元类

private:

intdata;

//结点数据,

整型

ChainNode*link;

//结点指针

};classChain{

//链表类

private:ChainNode*first;

//表头指针

};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第6页。7classChain{

//嵌套方式private:

classChainNode{

//嵌套链表结点类

public:

intdata;

ChainNode*link;

};ChainNode*first;

//表头指针public:

//链表操作………};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第7页。8//链表类和链表结点类定义(继承方式)classChainNode{

//链表结点类

protected:

intdata;

ChainNode*link;

};classChain:public

classChainNode{

//链表类,继承链表结点类的数据和操作

private:ChainNode*first;

//表头指针};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第8页。9在复合方式中,链表结点类中声明链表类是它的友元类,这样可以“奉献”它的私有成员给链表类。这种方式灵活。在嵌套方式中,链表结点类是链表类的私有成员,这样限制了链表结点类的应用范围。在继承方式中,链表类声明为链表结点类的派生类,这在实现上是可行的。但在逻辑上是有问题的,如三角形

is

多边形(继承关系)链表is

链表结点(显然概念不准确)[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第9页。10//链表类和链表结点类定义(结构方式)structChainNode{

//链表结点类

intdata;

ChainNode*link;

};classChain{

//链表类,直接使用链表结点类的数据和操作

private:ChainNode*first;

//表头指针

};//链表中的结点属于链表私有,别人无法访问[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第10页。11单链表中的插入与删除操作插入

第一种情况:在链表最前端插入

newnode->link=first;

first=newnode;(插入前)(插入后)

firstnewnodenewnodefirst[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第11页。12(插入前)(插入后)

第二种情况:在链表中间插入

newnode->link=current->link;

current->link=newnode;newnodecurrentnewnodecurrent[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第12页。13

第三种情况:在链表末尾插入

newnode->link=current->link;

current->link=newnode;(插入前)(插入后)newnodenewnodecurrentcurrent[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第13页。14单链表的插入算法boolChain::Insert(inti,intx){//将新元素x插入到第i个结点之后。i从1开始,//i=0表示插入到首元结点之前。

if(first==NULL||i==0){

//空表或首元结点前

ChainNode*newNode=newChainNode(x);

//建立一个新结点

newNode->link=first;first=newNode;

//新结点成为首元结点

}

else{//否则,寻找插入位置

ChainNode*current=first; intk=1;[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第14页。15

while(k<i&¤t!=NULL)//找第i结点

{current=current->link;k++;}

if(current==NULL&&first!=NULL)//链短

{cerr<<“无效的插入位置!\n”;returnfalse;}

else{

//插入在链表的中间

ChainNode*newNode=newChainNode(x); newNode->link=current->link;current->link=newNode;} }

returntrue;};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第15页。16删除第一种情况:删除表中第一个元素第二种情况:删除表中或表尾元素在单链表中删除含ai的结点ai-1ai-1aiaiai+1ai+1pq删除前删除后[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第16页。17单链表的删除算法boolChain::Remove(inti,int&x){//将链表中的第i个元素删去,i从1开始。

ChainNode*del; //暂存删除结点指针

if(i<=1){del=first;first=first->link;} else{ChainNode*current=first;k=1;//找i-1号结点

while(k<i-1&¤t!=NULL) {current=current->link;k++;}

if(current==NULL||current->link==NULL){

cout<<“无效的删除位置!\n”;returnfalse;}

[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第17页。18 del=current->link;

//删中间/尾结点

current->link=del->link; } x=del->data;deletedel;

//取出被删结点数据

returntrue; };实现单链表的插入和删除算法,不需要移动元素,只需修改结点指针,比顺序表方便。情况复杂,要专门讨论空表和在表头插入的特殊情形。寻找插入或删除位置只能沿着链顺序检测。[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第18页。19带表头结点的单链表表头结点位于表的最前端,本身不带数据,仅标志表头。设置表头结点的目的是统一空表与非空表的操作,简化链表操作的实现。非空表 空表0an-1a1firstfirst0[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第19页。20在带表头结点的单链表最前端插入新结点

newnode->link=p->link;p->link=newnode;firstnewnodefirstnewnode插入firstnewnode0firstnewnode0插入pppp[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第20页。21

q=p->link;

p->link=q->link;deleteq;从带表头结点的单链表中删除最前端的结点(非空表)(空表)firstfirstfirst0first0pqpq[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第21页。22单链表的模板类类模板将类的数据成员和成员函数设计得更完整、更灵活。类模板更易于复用。在单链表的类模板定义中,增加了表头结点。[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第22页。23

用模板定义的单链表类template<classT>//定义在“LinkedChain.h”structChainNode{ //链表结点类的定义

Tdata; //数据域

ChainNode<T>*link;//链指针域

ChainNode(){link=NULL;}//构造函数

ChainNode(Titem,ChainNode<T>*ptr=NULL){data=item;link=ptr;}//构造函数

booloperator==(Tx){returndata==x;}

//重载函数,判相等

booloperator!=(Tx){returndata!=x;}};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第23页。24template<classT>classChain{//单链表类定义,不用继承也可实现protected:

ChainNode<T>*first; //表头指针public:

Chain(){first=newChainNode<T>;}//构造函数

Chain(T

x){first=newChainNode<T>(x);}

Chain(Chain<T>&L); //复制构造函数

~Chain(){} //析构函数

voidmakeTmpty(); //将链表置为空表

intLength()const; //计算链表的长度[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第24页。25

ChainNode<T>*Search(T

x); //搜索含x元素

ChainNode<T>*Locate(inti); //定位第i个元素

T*getData(inti); //取出第i元素值

voidsetData(inti,Tx); //更新第i元素值

boolInsert(inti,Tx); //在第i元素后插入

boolRemove(inti,T&x); //删除第i个元素

boolIsTmpty()const //判表空否

{returnfirst->link==NULL?true:false;}ChainNode<T>*getFirst()const{returnfirst;}

voidsetFirst(ChainNode<T>*f){first=f;} voidSort(); //排序};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第25页。26template<classT>

voidChain<T>::makeTmpty(){

ChainNode<T>*q; while(first->link!=NULL){

q=first->link;//保存被删结点

first->link=q->link;//从链上摘下该结点

deleteq; //删除

}};链表置空算法(保留表头结点)[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第26页。27firstqfirstfirstqqfirsta0a1a1a2a2a2current[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第27页。28template<classT>intChain<T>::Length()const{ChainNode<T>*p=first->link;

//检测指针p指示第一号结点

intcount=0;

while(p!=NULL){//逐个结点检测

p=p->link;count++;}

returncount;}求单链表的长度的算法[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第28页。29firstpa0a1a2c=0firstpa0a1a2c=1firstpa0a1a2c=2firstpa0a1a2c=3[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第29页。30单链表的搜索算法template<classT>ChainNode<T>*Chain<T>::Search(Tx){//在表中搜索含数据x的结点,搜索成功时函数返//该结点地址;否则返回NULL。

ChainNode<T>*current=first->link; while(current!=NULL&¤t->data!=x)

current=current->link;

//沿着链找含x结点

returncurrent;};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第30页。31单链表的定位算法template<classT>ChainNode<T>*Chain<T>::Locate(inti){//函数返回表中第i个元素的地址。若i<0或i超//出表中结点个数,则返回NULL。

if(i<0)returnNULL; //i不合理

ChainNode<T>*current=first;intk=0; while(current!=NULL&&k<i){current=current->link; k++;}returncurrent; //返回第i号结点地址或NULL};[计算机软件及应用]数据结构-课件-单链表全文共34页,当前为第31页。32单链表的插入算法t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论