版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1线性表线性表顺序表顺序表 单链表单链表循环链表循环链表双向链表双向链表多项式多项式线性表的物理实现单链表的变化形式 链表的应用2, , , a1a2a3a4a5a63时时 0 0, ,) )( (时时 0 0, ,) )( (iliLOCiiLOC1LOC ( i ) = LOC ( i - -1 ) + l =+ i*l45625 s 3.3 62 74 t 1.0 6 7顺序表(SeqList)类的定义#include /定义在“seqList.h”中#include #include “linearList.hconst int defaultSize = 100;template c
2、lass SeqList: public LinearList protected: 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() c
3、onst return last+1; /计算表长度 int Search(E& x) const; /搜索x在表中位置,函数返回表项序号 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 SeqLi
4、st:SeqList(int sz) if (sz 0) maxSize = sz; last = -1; data = new EmaxSize; /创建表存储数组 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;
5、 exit(1); for (int i = 1; i = last+1; i+) /传送各个表项L.getData(i, value); datai-1 = value;复制构造函数11顺序表的搜索算法template int SeqList:Search(E & x) const /在表中顺序搜索与给定值 x 匹配的表项,找到则/函数返回该表项是第几个元素,否则函数返回0 for (int i = 0; i = last; i+)/顺序搜索 if ( datai = x ) return i+1; /表项序号和表项位置差1 return 0; /搜索失败; x = 48 x = 50122
6、12)(11)2(111=1nnnnnninACNni (假设表的长度为假设表的长度为n,即即n = last + 1)13niiic*pACN1=1415表项的插入算法template bool SeqList:Insert (int i, E x) /将新元素x插入到表中第i (1ilast+2) 个表项位/置。 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 =
7、 x; /插入(第 i 表项在datai-1处) last+; return true; /插入成功;在表中第在表中第 i 个位置插入,从个位置插入,从datai-1 到到data last 成块后移,成块后移,移动移动n-1-(i-1)+1 = n-i+1项项 (假设表的长度为假设表的长度为n,即即n = last + 1)221)(1)(1 0)1(111)(11=11nnnnnninnniAMN161718表项的删除算法template bool SeqList:Remove (int i, E& x) /从表中删除第 i (1ilast+1) 个表项,通过引用型/参数 x 返回被删元素
8、。 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; ;删除第删除第 i 个表项,需将第个表项,需将第 i+1 项到第项到第 last+1项全部前移,需前项全部前移,需前移的项数为移的项数为 n-(i+1)+1 = n-i (假设表的长度为假设表的长度为n,即即n = last + 1)ninnnninn12121)(1)(1=AMN
9、19void 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 ) /若未找到插入它若未找到插入它 LA.Insert (n, x); n+; 20 void Intersection ( SeqList & LA, SeqList & LB )
10、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; c
11、urrent-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 *cu
12、rrent = first; int k = 1; 35 while (k 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-
13、1号结点 while (k link; k+; if (current = NULL | current-link = NULL) cout link; /删中间/尾结点 current-link = del-link; x = del-data; delete del; /取出被删结点数据 return true;实现单链表的插入和删除算法,不需要移动元实现单链表的插入和删除算法,不需要移动元素,只需修改结点指针,比顺序表方便。素,只需修改结点指针,比顺序表方便。情况复杂,要专门讨论空表和在表头插入的特情况复杂,要专门讨论空表和在表头插入的特殊情形。殊情形。寻找插入或删除位置只能沿着链顺序检
14、测。寻找插入或删除位置只能沿着链顺序检测。0ana1firstfirst039 newNode-link = current-link; current-link = newNode;firstnewNodefirstnewNode插入firstnewNode0firstnewNode0插入currentcurrentcurrentcurrent40 del = current-link; current-link = del-link; delete del; ( (非空表)非空表)( (空表)空表)firstfirstfirst0first0currentdelcurrentdel4142
15、434445template struct CircLinkNode /链表结点类定义 E data; CircLinkNode *link; CircLinkNode ( CircLinkNode *next = NULL ) link = next; CircLinkNode ( E x, CircLinkNode *next = NULL ) data = x; link = next; bool Operator=(CircLinkNode & node) return data = node.data; bool Operator!=(CircLinkNode & node) ret
16、urn data != node.data; ;循环链表类的定义46template /链表类定义class CircList : public LinearList private: CircLinkNode *first, *last; /头指针, 尾指针public: CircList(const E x); /构造函数CircList(CircList& L); /复制构造函数CircList(); /析构函数 int Length() const; /计算链表长度bool IsEmpty() return first-link = first; /判表空否CircLinkNode *
17、getHead() const; /返回表头结点地址47 void setHead ( CircLinkNode *p ); /设置表头结点地址 CircLinkNode *Search ( E x ); /搜索CircLinkNode *Locate ( int i );/定位 E *getData ( int i ); /提取 void setData ( int i, E x ); /修改bool Insert ( int i, E x ); /插入 bool Remove ( int i, E& x); /删除;循环链表与单链表的操作实现,最主要的不同就循环链表与单链表的操作实现,最主
18、要的不同就是扫描到链尾,遇到的不是是扫描到链尾,遇到的不是NULL,而是表头。,而是表头。搜索不成功搜索不成功循环链表的搜索算法循环链表的搜索算法搜索搜索25搜索成功搜索成功搜索搜索15first31481557 current current currentfirst31481557 current current current currentcurrent48循环链表的搜索算法template CircListNode * CircList:Search( E x ) /在链表中从头搜索其数据值为 x 的结点 current = first-link; while ( current !
19、= first & current-data != x ) current = current-link; return current;495051求解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; i+ ) /执行n-1次 for ( j = 1; j link; cout “出列的人是” data l
20、ink = p-link; delete p; /删去 p = pre-link; ;void main() CircList clist; int i, n, m; cout n m; for (i = 1; i = n; i+ ) clist.insert(i, i); /约瑟夫环 Josephus(clist, n, m); /解决约瑟夫问题 l lL Li in nk k( (左左左左 链链链链 指指指指 针针针针 ) ) d da at ta a( (数数数数 据据据据 ) ) r rL Li in nk k( (右右右右 链链链链 指指指指 针针针针 ) )53 5455templ
21、ate struct DblNode /链表结点类定义 E data;/链表结点数据 DblNode *lLink, *rLink;/前驱、后继指针 DblNode ( DblNode *l = NULL, DblNode *r = NULL ) lLink = l; rLink = r; /构造函数 DblNode ( E value, DblNode *l = NULL, DblNode *r = NULL) data = value; lLink = l; rLink = r; /构造函数;56template class DblList /链表类定义 public: DblList (
22、 E uniqueVal ) /构造函数 first = new DblNode (uniqueVal); first-rLink = first-lLink = first; ; DblNode *getFirst () const return first; void setFirst ( DblNode *ptr ) first = ptr; DblNode *Search ( E x, int d); /在链表中按d指示方向寻找等于给定值x的结点, /d=0按前驱方向,d0按后继方向57 DblNode *Locate ( int i, int d ); /在链表中定位序号为i(0)的
23、结点, d=0按前驱方 /向,d0按后继方向 bool Insert ( int i, E x, int d ); /在第i个结点后插入一个包含有值x的新结点,d=0 /按前驱方向,d0按后继方向 bool Remove ( int i, E& x, int d ); /删除第i个结点 bool IsEmpty() return first-rlink = first; /判双链表空否 private: DblNode *first; /表头指针;搜索成功搜索成功搜索不成功搜索不成功firstfirst3131484815155757搜索搜索15 搜索搜索25 5859双向循环链表的搜索算法t
24、emplate DblNode *DblList:Search (E x, int d) /在双向循环链表中寻找其值等于x的结点。 DblNode *current = (d = 0)? first-lLink : first-rLink; /按d确定搜索方向while ( current != first & current-data != x )current = (d = 0) ? current-lLink : current-rLink;if ( current != first ) return current; /搜索成功else return NULL; /搜索失败;双向循环链
25、表的插入算法双向循环链表的插入算法 ( (非空表非空表) )newNode-rLink = current-rLink; current-rLink = newNode;newNode-rLink-lLink = newNode; newNode-lLink = current;firstfirst31481525currentnewNode31482515current60双向循环链表的插入算法双向循环链表的插入算法 ( (空表空表) )first25currentnewNode25firstcurrentnewNode-rLink = current-rLink (newNode-rLin
26、k = first); current-rLink = newNode;newNode-rLink -lLink = newNode; ( first-lLink = newNode ) newNode-lLink = current;6162双向循环链表的插入算法template bool DblList:Insert ( int i, E x, int d ) /建立一个包含有值x的新结点, 并将其按 d 指定的/方向插入到第i个结点之后。 DblNode *current = Locate(i, d); /按d指示方向查找第i个结点 if ( current = NULL ) retur
27、n false; /插入失败 DblNode *newNd = new DblNode(x); if (d = 0) /前驱方向:插在第i个结点左侧newNd-lLink = current-lLink; /链入lLink链 current-lLink = newNd;63 newNd-lLink-rLink = newNd; /链入rLink链 newNd-rLink = current; else /后继方向:插在第i个结点后面 newNd-rLink = current-rLink; /链入rLink链 current-rLink = newNd; newNd-rLink-lLink =
28、 newNd; /链入lLink链 newNd-lLink = current;return true; /插入成功; 删除删除48双向循环链表的删除算法双向循环链表的删除算法firstfirst314815current3115currentcurrent-rLink-lLink = current-lLink; current-lLink-rLink = current-rLink;6465双向循环链表的删除算法template bool DblList:Remove( int i, E& x, int d ) /在双向循环链表中按d所指方向删除第i个结点。 DblNode *curren
29、t = Locate (i, d); if (current = NULL) return false; /删除失败current-rLink-lLink = current-lLink;current-lLink-rLink = current-rLink; /从lLink链和rLink链中摘下 x = current-data; delete current; /删除 return true; /删除成功;iniinnnxaxaxaxaaxP02210 )(Pn(x) 。u u A(x) = 1 - 10 x6 + 2x8 +7x1466 67 (静态静态数数组表示组表示) private
30、: int degree; float coef maxDegree+1; 可以表示为可以表示为: pl.degree = n pl.coefi = ai, 0 i na0 a1 a2 an 0 1 2 degree maxDegree- -1coefn (动态数组表示动态数组表示) private: int degree; float * coef; Polynomial : Polynomial (int sz) maxDegree = sz; coef = new float maxDegree + 1; 68: struct term /多项式的项定义 float coef; /系数
31、int exp; /指数;static term termArraymaxTerms; /项数组 static int free, maxTerms; /当前空闲位置指针a0 a1 a2 ai ame0 e1 e2 ei emcoefexp0 1 2 i m69初始化:初始化:/ term Polynomial:termArraymaxTerms;/ int Polynomial:free = 0;class Polynomial /多项式定义 public: private: int start, finish; /多项式始末位置70两个多项式存储的例子两个多项式存储的例子 A(x) = 2
32、.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 maxTerms71数据域数据域指针域指针域A(x) = 1 - 10 x6 + 2x8 +7x147273 多项式顺序存储表示的缺点多项式顺序存储表示的缺点 插入和删除时项数可能有较大变化,因此要插入和删除时项数可能有较大变化,因此要移动大量数据移动大量数据 不利于多个多项式的同时处理不利于
33、多个多项式的同时处理 多项式链表存储表示的优点多项式链表存储表示的优点 多项式的项数可以动态地增长,不存在存储多项式的项数可以动态地增长,不存在存储溢出问题。溢出问题。 插入、删除方便,不移动元素插入、删除方便,不移动元素74struct Term /多项式结点定义 float coef; /系数 int exp; /指数 Term *link; /链接指针 Term (float c, int e, Term *next = NULL) coef = c; exp = e; link = next;Term *InsertAfter ( float c, int e); friend ost
34、ream& operator (ostream&, const Term& ); 75class Polynomial /多项式类的定义public:Polynomal() first = new Term(0, -1); /构造函数Polynomal (Polynomal& R); /复制构造函数int maxOrder(); /计算最大阶数private:Term *first; friend ostream& operator ( istream&, Polynomal& );76 friend void Add ( Polynomial& A, Polynomial& B, Polyn
35、omial& C ); friend void Mul ( Polynomial& A, Polynomial& B, Polynomial& C );77两个多项式的相加算法设两个多项式都带表头结点,检测指针设两个多项式都带表头结点,检测指针pa和和pb分分别指示两个链表当前检测结点,并设结果多项式的别指示两个链表当前检测结点,并设结果多项式的链表为链表为C,存放指针为,存放指针为pc,初始位置在,初始位置在C的表头结的表头结点。点。当当pa和和pb没有检测完各自的链表时,比较当前检没有检测完各自的链表时,比较当前检测结点的指数域:测结点的指数域: 指数不等:小者加入指数不等:小者加入C链,相应检测指针链,相应检测指针pa或者或者pb进进1; 指数相等:对应项系数相加。若相加结果不为指数相等:对应项系数相加。若相加结果不为零,则结果加入零,则结果加入C链,链,pa与与pb进进1。 当当pa或或pb指针中有一个为指针中有一个为NULL,则把另一个链
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 19566-10:2024/AMD1:2025 EN Information technology - JPEG Systems - Part 10: Reference software - Amendment 1: Additional reference software implementations
- 2020-2025年二级建造师之二建建设工程施工管理押题练习试题A卷含答案
- 中国纯绒无纺项目投资可行性研究报告
- 2025年妇产科副高试题库及答案
- 包胶不锈钢绳行业深度研究报告
- 中国粘结稀土磁体项目投资可行性研究报告
- 中国调速皮带配料称项目投资可行性研究报告
- 中国铝锰钛合金项目投资可行性研究报告
- 中国胎面胶颗粒项目投资可行性研究报告
- 玻璃雕刻书画屏行业深度研究报告
- 中国融通集团招聘笔试题
- 留置针输液操作和评分标准
- 理财赎回合同范本
- 运动会开-闭幕式服务投标方案
- 国开(辽宁)2024年《中国传统文化概观》形考1-4答案
- TB 10303-2020铁路桥涵工程施工安全技术规程
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T 31011-2019)
- 《土木工程新材料》PPT课件-2024鲜版
- 建筑工程挂靠协议样书
- 【S耗材公司财务共享中心人员职业胜任能力提升方案设计4000字】
- 物流园区商业计划书
评论
0/150
提交评论