线性表课件学习培训课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《线性表课件学习培训课件.ppt》由用户(林田)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 课件 学习 培训
- 资源描述:
-
1、1线性表线性表顺序表顺序表 单链表单链表循环链表循环链表双向链表双向链表多项式多项式线性表的物理实现单链表的变化形式 链表的应用2,3a1a2a3a4a5a64时时 0 0,)(时时 0 0,)(iliLOCiiLOC1LOC(i)=LOC(i-1)+l=+i*l5625 s 3.3 62 74 t 1.0 6 7顺序表(SeqList)类的定义#include /定义在“seqList.h”中#include#include“linearList.hconst int defaultSize=100;template class SeqList:public LinearList prote
2、cted:E*data;/存放数组 int maxSize;/最大可容纳表项的项数 int last;/当前已存表项的最后位置 void reSize(int newSize);/改变数组空间大小8 public:SeqList(int sz=defaultSize);/构造函数 SeqList(SeqList&L);/复制构造函数 SeqList()delete data;/析构函数 int Size()const return maxSize;/求表最大容量 int Length()const return last+1;/计算表长度 int Search(E&x)const;/搜索x在表
3、中位置,函数返回表项序号 int Locate(int i)const;/定位第 i 个表项,函数返回表项序号 bool getData(int i,E&x)const;/取第i个表项的值 bool Insert(int i,E x);/插入 bool Remove(int i,E&x);/删除;9顺序表的构造函数#include /操作“exit”存放在此#include“seqList.h”/操作实现放在“seqList.cpp”template SeqList:SeqList(int sz)if(sz 0)maxSize=sz;last=-1;data=new EmaxSize;/创建表
4、存储数组 if(data=NULL)/动态分配失败 cerr 存储分配错误!endl;exit(1);10template SeqList:SeqList(SeqList&L)maxSize=L.Size();last=L.Length()-1;E value;data=new EmaxSize;/创建存储数组 if(data=NULL)/动态分配失败 cerr 存储分配错误!endl;exit(1);for(int i=1;i=last+1;i+)/传送各个表项L.getData(i,value);datai-1=value;复制构造函数11顺序表的搜索算法template int SeqL
5、ist:Search(E&x)const/在表中顺序搜索与给定值 x 匹配的表项,找到则/函数返回该表项是第几个元素,否则函数返回0 for(int i=0;i=last;i+)/顺序搜索 if(datai=x)return i+1;/表项序号和表项位置差1 return 0;/搜索失败;12 x=48 x=5013212)(11)2(111=1nnnnnninACNni (假设表的长度为假设表的长度为n,即即n=last+1)niiic*pACN1=1415表项的插入算法template bool SeqList:Insert(int i,E x)/将新元素x插入到表中第i(1ilast+2
6、)个表项位/置。if(last=maxSize-1)return false;/表满 if(i last+2)return false;/参数i不合理 for(int j=last;j=i-1;j-)/依次后移 dataj+1=dataj;datai-1=x;/插入(第 i 表项在datai-1处)last+;return true;/插入成功;16在表中第在表中第 i 个位置插入,从个位置插入,从datai-1 到到data last 成块后移,成块后移,移动移动n-1-(i-1)+1=n-i+1项项(假设表的长度为假设表的长度为n,即即n=last+1)221)(1)(1 0)1(111)
7、(11=11nnnnnninnniAMN1718表项的删除算法template bool SeqList:Remove(int i,E&x)/从表中删除第 i(1ilast+1)个表项,通过引用型/参数 x 返回被删元素。if(last=-1)return false;/表空 if(i last+1)return false;/参数i不合理 x=datai-1;for(int j=i;j=last;j+)/依次前移,填补 dataj-1=dataj;last-;return true;19删除第删除第 i 个表项,需将第个表项,需将第 i+1 项到第项到第 last+1项全部前移,需前项全部前
8、移,需前移的项数为移的项数为 n-(i+1)+1=n-i (假设表的长度为假设表的长度为n,即即n=last+1)ninnnninn12121)(1)(1=AMN20void Union(SeqList&LA,SeqList&LB)int n=LA.Length();int m=LB.Length();int x;for(int i=1;i=m;i+)LB.getData(i,x);/在在LB中取一元素中取一元素 int k=LA.Search(x);/在在LA中搜索它中搜索它 if(k=0)/若未找到插入它若未找到插入它 n+;LA.Insert(n,x);21 void Intersect
9、ion(SeqList&LA,SeqList&LB)int n=LA.Length();int m=LB.Length();int i=1;int x;while(i link=first;first=newNode;firstnewNodenewNodefirst32u 第二种情况:在链表中间插入第二种情况:在链表中间插入 newNode-link=current-link;current-link=newNode;newNodecurrentnewNodecurrent33第三种情况:在链表末尾插入第三种情况:在链表末尾插入 newNode-link=current-link;curren
10、t-link=newNode;newNodenewNodecurrentcurrent 34单链表的插入算法bool List:Insert(int i,int x)/将新元素 x 插入到第 i 个结点之后。i 从1开始,/i=0 表示插入到首元结点之前。if(first=NULL|i=0)/空表或首元结点前 LinkNode*newNode=new LinkNode(x);/建立一个新结点 newNode-link=first;first=newNode;/新结点成为首元结点 else /否则,寻找插入位置 LinkNode*current=first;int k=1;35 while(k
11、link;k+;if(current=NULL&first!=NULL)/链短 cerr link=current-link;current-link=newNode;return true;3637单链表的删除算法bool List:Remove(int i,int&x)/将链表中的第 i 个元素删去,i 从1开始。LinkNode*del;/暂存删除结点指针if(i link;else LinkNode*current=first;k=1;/找i-1号结点 while(k link;k+;if(current=NULL|current-link=NULL)cout link;/删中间/尾结
12、点 current-link=del-link;x=del-data;delete del;/取出被删结点数据 return true;实现单链表的插入和删除算法,不需要移动元实现单链表的插入和删除算法,不需要移动元素,只需修改结点指针,比顺序表方便。素,只需修改结点指针,比顺序表方便。情况复杂,要专门讨论空表和在表头插入的特情况复杂,要专门讨论空表和在表头插入的特殊情形。殊情形。寻找插入或删除位置只能沿着链顺序检测。寻找插入或删除位置只能沿着链顺序检测。390ana1firstfirst040 newNode-link=current-link;current-link=newNode;fi
13、rstnewNodefirstnewNode插入firstnewNode0firstnewNode0插入currentcurrentcurrentcurrent41 del=current-link;current-link=del-link;delete del;(非空表)非空表)(空表)空表)firstfirstfirst0first0currentdelcurrentdel42434445template struct CircLinkNode/链表结点类定义 E data;CircLinkNode*link;CircLinkNode(CircLinkNode*next=NULL)lin
14、k=next;CircLinkNode(E x,CircLinkNode*next=NULL)data=x;link=next;bool Operator=(CircLinkNode&node)return data=node.data;bool Operator!=(CircLinkNode&node)return data!=node.data;循环链表类的定义46template /链表类定义class CircList:public LinearList private:CircLinkNode*first,*last;/头指针,尾指针public:CircList(const E x
15、);/构造函数CircList(CircList&L);/复制构造函数CircList();/析构函数 int Length()const;/计算链表长度bool IsEmpty()return first-link=first;/判表空否CircLinkNode*getHead()const;/返回表头结点地址47 void setHead(CircLinkNode*p);/设置表头结点地址 CircLinkNode*Search(E x);/搜索CircLinkNode*Locate(int i);/定位 E*getData(int i);/提取 void setData(int i,E
16、x);/修改bool Insert(int i,E x);/插入 bool Remove(int i,E&x);/删除;循环链表与单链表的操作实现,最主要的不同就循环链表与单链表的操作实现,最主要的不同就是扫描到链尾,遇到的不是是扫描到链尾,遇到的不是NULL,而是表头。,而是表头。48搜索不成功搜索不成功循环链表的搜索算法循环链表的搜索算法搜索搜索25搜索成功搜索成功搜索搜索15first31481557 current current currentfirst31481557 current current current currentcurrent49循环链表的搜索算法template
17、 CircListNode*CircList:Search(E x)/在链表中从头搜索其数据值为 x 的结点 current=first-link;while(current!=first¤t-data!=x)current=current-link;return current;5051求解Josephus问题的算法#include#include“CircList.h”template void Josephus(CircList&Js,int n,int m)CircLinkNode*p=Js.getHead(),*pre=NULL;int i,j;for(i=0;i n-1
展开阅读全文