数据结构 课件 链表应用与变形.ppt

上传人:hwp****526 文档编号:84370490 上传时间:2023-04-05 格式:PPT 页数:45 大小:317KB
返回 下载 相关 举报
数据结构 课件 链表应用与变形.ppt_第1页
第1页 / 共45页
数据结构 课件 链表应用与变形.ppt_第2页
第2页 / 共45页
点击查看更多>>
资源描述

《数据结构 课件 链表应用与变形.ppt》由会员分享,可在线阅读,更多相关《数据结构 课件 链表应用与变形.ppt(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、链表应用与变形数据结构电子教案数据结构电子教案1第二章第二章 线性表线性表n多项式多项式n循环链表循环链表n双向链表双向链表2 2单链表的应用n多项式存储3 3多项式多项式 (Polynomial)n nn阶多项式阶多项式 Pn(x)有有 n+1 项项。u 系数系数 a0,a1,a2,anu 指数指数 0,1,2,n。按升幂排列按升幂排列4 4第三种第三种:struct term /多项式的项定义 float coef;/系数 int exp;/指数;static term termArraymaxTerms;/项数组 static int free,maxTerms;/当前空闲位置指针a0

2、a1 a2 ai ame0 e1 e2 ei emcoefexp0 1 2 i m5 5两个多项式存储的例子两个多项式存储的例子 A(x)=2.0 x1000+1.8 B(x)=1.2+51.3x50+3.7x101 两个多项式存放在两个多项式存放在termArray中中A.start A.finish B.start B.finish freecoefexp1.8 2.0 1.2 51.3 3.7 0 1000 0 50 101 maxTerms6 6n多项式顺序存储表示的缺点多项式顺序存储表示的缺点u插入和删除时项数可能有较大变化,因此插入和删除时项数可能有较大变化,因此要移动大量数据要移

3、动大量数据u不利于多个多项式的同时处理不利于多个多项式的同时处理n采用多项式的链表表示可以克服这类困难:采用多项式的链表表示可以克服这类困难:u多项式的项数可以动态地增长,不存在存多项式的项数可以动态地增长,不存在存储溢出问题。储溢出问题。u插入、删除方便,不移动元素插入、删除方便,不移动元素。多项式的链表存储表示多项式的链表存储表示7 7n在多项式的链表表示中,每个结点三个数据在多项式的链表表示中,每个结点三个数据成员:成员:n通过链接指针,可以将多项式各项按指数递通过链接指针,可以将多项式各项按指数递增的顺序链接成一个单链表。增的顺序链接成一个单链表。n在此结构上,新项的加入和废项的删除执

4、行在此结构上,新项的加入和废项的删除执行简单的链表插入和删除操作即可解决。简单的链表插入和删除操作即可解决。多项式的链表结构多项式的链表结构coef exp link Data Term8 8多项式表示法14328100a.poly.first148-3101060b.poly.first9 9多项式类定义struct Term/all members of Terms are public by defaultintcoef;/coefficientintexp;/exponentTerm Set(int c,int e)coef=c;exp=e;return*this;classPolyn

5、omialprivate:Chain poly;1010两个多项式的相加算法两个多项式的相加算法设两个多项式都带表头结点,检测指针设两个多项式都带表头结点,检测指针pa和和pb分别指示两个链表当前检测结点,并设结分别指示两个链表当前检测结点,并设结果多项式的表头指针为果多项式的表头指针为C,存放指针为存放指针为pc,初始位置在初始位置在C的表头结点。的表头结点。当当pa和和pb没有检测完各自的链表时,比较当没有检测完各自的链表时,比较当前检测结点的指数域:前检测结点的指数域:指数不等:小者加入指数不等:小者加入C链,相应检测指针链,相应检测指针pa或者或者pb进进1;指数相等:对应项系数相加。

6、若相加结果指数相等:对应项系数相加。若相加结果不为零,则结果加入不为零,则结果加入C链,链,pa与与pb进进1。11 11CH.poly.firstAH.poly.firstBH.poly.first 1 01 0-1 4-1 4-3 63 6-9 10-9 107 127 128 148 14多项式链表的相加多项式链表的相加AH=1-3x6+7x12BH=-x4+3x6-9x10+8x14CH=1-x4-9x10+7x12+8x141212AH.firstBH.first CH.first1 0-1 4-3 63 6-9 107 128 14papcpb 1313AH.first CH.fi

7、rst 1 01 0-1 4-3 63 6-9 107 128 14papbpcBH.first1414AH.first CH.first 1 01 0-1 4-1 4-3 63 6-9 107 128 14papbpcBH.first1515AH.first CH.first 1 01 0-1 4-1 4-3 63 6-9 107 128 14papbpcBH.firsttmp=-3+3=01616AH.first CH.first1 01 0-1 4-1 4-3 63 6-9 107 128 14papc-9 10pbBH.first 1717AH.first CH.first1 01 0

8、-1 4-1 4-3 63 6-9 107 128 14papc-9 10pbBH.first7 12 1818AH.first CH.first1 01 0-1 4-1 4-3 63 6-9 107 128 14papc-9 10pbBH.first7 128 14 p1919当当pa或或pb指针中有一个为指针中有一个为NULL,则把另一则把另一个链表的剩余部分加入到个链表的剩余部分加入到C链。链。void Add(Polynomal&A,Polynomal&B,Polynomal&C)/友元函数:两个带表头结点的按升幂排列的/多项式链表的头指针分别是 A.first 和 B.first,/

9、返回的是结果多项式链表 C.Term*pa,*pb,*pc,*p,temp;float sum;pc=C.poly.first;/结果链尾指针 pa=A.poly.first-link;/A链检测指针 pb=B.poly.first-link;/B链检测指针 while(pa!=NULL&pb!=NULL)2020 if(pa-exp=pb-exp)/对应项指数相等 sum=pa-coef+pb-coef;if(fabs(sum)0.001)temp.set(sum,pa-exp);pc=C.poly.InsertAfter(temp);pa=pa-link;pb=pb-link;else i

10、f(pa-exp exp)/pa指数小 temp.set(pa-coef,pa-exp);pc=C.poly.InsertAfter(temp);pa=pa-link;else /pb指数小temp.set(pb-coef,pb-exp)pc=C.poly.InsertAfter(temp);pb=pb-link;2121 p=(pa!=NULL)?pa:pb;/p指示剩余链 while(p!=NULL)temp.set(p-coef,p-exp);pc=C.poly.InsertAfter(temp);p=p-link;2222template struct CircLinkNode/链表结

11、点类定义 T data;CircLinkNode*link;CircLinkNode(CircLinkNode*next=NULL)link=next;CircLinkNode(T d,CircLinkNode*next=NULL)data=d;link=next;bool Operator=(T x)return data=x;bool Operator!=(T x)return data!=x;带表头结点的循环链表类的定义带表头结点的循环链表类的定义2323template /链表类定义class CircList private:CircLinkNode*first,*last;/头指针

12、,尾指针public:CircList(const T x);/构造函数CircList(CircList&L);/复制构造函数CircList();/析构函数 int Length()const;/计算链表长度bool IsEmpty()return first-link=first;/判表空否CircLinkNode*getHead()const;/返回表头结点地址2424 void setHead(CircLinkNode*p);/设置表头结点地址 CircLinkNode*Search(T x);/搜索CircLinkNode*Locate(int i);/定位 T*getData(i

13、nt i);/提取 void setData(int i,Tx);/修改bool Insert(int i,T x);/插入 bool Remove(int i,T&x);/删除;n循环链表与单链表的操作实现,最主要的不同就循环链表与单链表的操作实现,最主要的不同就是扫描到链尾,遇到的不是是扫描到链尾,遇到的不是NULL,而是表头。,而是表头。2525搜索不成功搜索不成功循环链表的搜索算法循环链表的搜索算法搜索搜索25搜索成功搜索成功搜索搜索15first31481557 current current currentfirst31481557 current current current

14、currentcurrent2626循环链表的搜索算法循环链表的搜索算法template CircListNode*CircList:Search(T x)/在链表中从头搜索其数据值为 x 的结点 current=first-link;while(current!=first¤t-data!=x)current=current-link;return current;2727带尾指针的循环链表带尾指针的循环链表last3148155722n n如果插入与删除仅在链表的两端发生,可如果插入与删除仅在链表的两端发生,可采用带表尾指针的循环链表结构。采用带表尾指针的循环链表结构。在表尾插

15、入,时间复杂性在表尾插入,时间复杂性 O(1)在表尾删除,时间复杂性在表尾删除,时间复杂性 O(n)在表头插入,相当于在表尾插入在表头插入,相当于在表尾插入在表头删除,时间复杂性在表头删除,时间复杂性 O(1)2828带尾指针的单循链表代码见课本2929可用空间链表(见课本)n又叫 空闲链表n课本用单循链表实现3030双向链表(Doubly Linked List)n双向链表是指在前驱和后继方向都能游历双向链表是指在前驱和后继方向都能游历(遍历)的线性链表。(遍历)的线性链表。n双向链表每个结点结构:双向链表每个结点结构:n双向链表通常采用带表头结点的循环链表形双向链表通常采用带表头结点的循环

16、链表形式。式。前驱方向前驱方向 后继方向后继方向lLink data rLink3131n n结点指向结点指向结点指向结点指向p=pp=p-lLinklLink-rLinkrLink=p=p-rLinkrLink-lLinklLink非空表非空表 空表空表p-lLinkp-rLinkplLinkrLinkfirstfirst3232双向循环链表类的定义双向循环链表类的定义template struct DblNode/链表结点类定义T data;/链表结点数据DblNode*lLink,*rLink;/前驱、后继指针DblNode(DblNode*l=NULL,DblNode*r=NULL)l

17、Link=l;rLink=r;/构造函数DblNode(T value,DblNode*l=NULL,DblNode*r=NULL)data=value;lLink=l;rLink=r;/构造函数;3333template class DblList/链表类定义public:DblList(T uniqueVal)/构造函数 first=new DblNode(uniqueVal);first-rLink=first-lLink=first;DblNode*getFirst()const return first;void setFirst(DblNode*ptr)first=ptr;DblN

18、ode*Search(T x,int d);/在链表中按d指示方向寻找等于给定值x的结点,/d=0按前驱方向,d0按后继方向3434DblNode*Locate(int i);/在链表中定位序号为i(0)的结点,bool Insert(int i,T x);/在第i个结点后插入一个包含有值x的新结点bool Remove(int i,T&x);/删除第i个结点bool IsEmpty()return first-rlink=first;/判双链表空否private:DblNode*first;/表头指针;3535双向循环链表的搜索算法双向循环链表的搜索算法搜索成功搜索成功搜索不成功搜索不成功f

19、irstfirst3131484815155757搜索搜索15 搜索搜索25 3636双向循环链表的搜索算法双向循环链表的搜索算法template DblNode*DblList:Search(T x)/在双向循环链表中寻找其值等于x的结点。DblNode*current=first-rLink;while(current!=first¤t-data!=x)current=current-rLink;if(current!=first)return current;/搜索成功else return NULL;/搜索失败;3737双向循环链表的插入算法双向循环链表的插入算法 (非空表

20、非空表)newNode-rLink=current-rLink;current-rLink=newNode;newNode-rLink-lLink=newNode;newNode-lLink=current;firstfirst314815后插入后插入后插入后插入25currentnewNode31482515current3838双向循环链表的插入算法双向循环链表的插入算法 (空表空表)first后插入后插入25currentnewNode25firstcurrentnewNode-rLink=current-rLink (newNode-rLink=first);current-rLink

21、=newNode;newNode-rLink-lLink=newNode;(first-lLink=newNode)newNode-lLink=current;3939双向循环链表的插入算法双向循环链表的插入算法template bool DblList:Insert(int i,T x)/建立一个包含有值x的新结点,并将其插入到第i个结点之后。DblNode*current=Locate(i);/按d指示方向查找第i个结点 if(current=NULL)return false;/插入失败 DblNode*newNd=new DblNode(x);4040 newNd-rLink=curr

22、ent-rLink;/链入rLink链 current-rLink=newNd;newNd-rLink-lLink=newNd;/链入lLink链 newNd-lLink=current;return true;/插入成功;4141删除删除48双向循环链表的删除算法双向循环链表的删除算法firstfirst非空表非空表314815current3115currentcurrent-rLink-lLink=current-lLink;current-lLink-rLink=current-rLink;4242双向循环链表的删除算法双向循环链表的删除算法template bool DblList:

23、Remove(int i,T&x)/在双向循环链表中按d所指方向删除第i个结点。DblNode*current=Locate(i);if(current=NULL)return false;/删除失败current-rLink-lLink=current-lLink;current-lLink-rLink=current-rLink;/从lLink链和rLink链中摘下 x=current-data;delete current;/删除 return true;/删除成功;4343静态链表静态链表n为数组中每一个元素附加一个链接指针,就为数组中每一个元素附加一个链接指针,就形成静态链表结构。形

24、成静态链表结构。n处理时中可以处理时中可以不改变各元素的物理位置不改变各元素的物理位置,只,只要要重新链接重新链接就能改变这些元素的逻辑顺序。就能改变这些元素的逻辑顺序。n它是利用数组定义的,在整个运算过程中存它是利用数组定义的,在整个运算过程中存储空间的大小不会变化。储空间的大小不会变化。n静态链表每个结点由两个数据成员构成:静态链表每个结点由两个数据成员构成:data域存储数据,域存储数据,link域存放链接指针。域存放链接指针。n所有结点形成一个结点数组,所有结点形成一个结点数组,4444静态链表的结构静态链表的结构n0号是表头结点,号是表头结点,link给出首元结点地址。给出首元结点地址。n循环链表收尾时循环链表收尾时link=0,回到表头结点。如果,回到表头结点。如果不是循环链表,收尾结点指针不是循环链表,收尾结点指针link=-1。nlink指针是数组下标,因此是整数。指针是数组下标,因此是整数。a1a2a3a4a5first012345dataa3a4a1a5a2link3245-1(0)14545

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁