- 1、本文档共115页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第2章 线性表n
学习目标 掌握线性表的顺序存储结构及具体操作实现; 掌握线性表的单、双向链接存储结构及具体操作实现; 掌握算法时间复杂度分析。 2.1 线性表的基本概念 1、线性表 它是一种最简单的线性结构。是一种可以在任意位置进行插入和删除数据元素操作的,由n(n≥0)个相同类型数据元素a0, a1, … , an-1组成的线性结构。 例:试用C或类C语言编写一高效算法,将一顺序存储的线性表(设元素均为整型量)中所有零元素向表尾集中,其他元素则顺序向表头方向集中。 6、其它一些操作实现 1、 清空操作 void ClearList(SqList L) 2. 判空操作 bool ListEmpty(SqList L) 2. 查找指定序号的元素 ElemType GetElem(SqList L, int pos) 7、 顺序表操作的效率分析 算法时间主要耗费在移动元素的操作上,因此计算时间复杂度的基本操作(最深层语句频度) T(n)= O (移动元素次数) 而移动元素的个数取决于插入或删除元素的位置. 教材P25有对执行效率的推导:(与课本略有区别) 四、用单链表实现线性表上其它的操作 1. 初始化单链表 void InitList(LNode* L) { L=NULL; }//O(1) 2. 检查单链表是否为空 bool ListEmpty(LNode* L) { return ( L==NULL); } // O(1) 3. 删除单链表中结点,使之成为空表 void ClearList(LNode* L) { LNode *cp, *np; cp= L; while(cp!=NULL) { np=cp-next; cp-next=np-next; delete cp;} L=NULL; } //O(n) 4. 得到单链表的长度 int ListSize(LNode* L) //带头结点? { P= L-next; int i=0; while(P!=NULL) { i++; P = P -next; } return i; } //O(n) 5. 得到单链表中第pos个结点中的元素 ElemType GetElem(LNode* L, int pos) { if(pos1) { cerrpos is out range!endl; exit(1); } i=0; P= L-next; while(P!=NULL){ i++; if(i==pos) break; P = P -next; } if(P!=NULL) return P -data; else{ cerrpos is out range!endl; exit(1);} } //O(n) 6. 遍历一个单链表 void TraverseList(LNode* L) { P= L-next; while(P!=NULL) { cout P-data ; P = P -next; } coutendl; } O(n) 7. 查找具有给定值的第一个元素 bool Find(LNode* L, ElemType item) { LNode* p= L;int i=1; while(p!=NULL) if (p-data==item) { return i; } else {p=p-next;i++;} return false; } O(n) 五、单链表的操作效率分析 (1) 查找 :因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为 O(n)。 七、 静态链表 静态链表:在数组中增加一个(或两个)指针域,这些指针域用来存放下一个(或上一个)数据元素在数组中的下标,从而构成用数组构造的单链表(或双链表)。静态链表中的指针又称仿真指针。 本章小结 作业:试用C/C++语言编写一个算法,将一循环单链表就地逆置。 操作前: (a1, a2, … ai-1,ai
文档评论(0)