- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线性表的逻辑结构及其基本操作 线性表的顺序存储结构 线性表的链式存储结构 顺序表和链表的比较 2.1. 线性表的逻辑结构及其基本操作 一、逻辑结构: 1、定义:几个类型相同的数据元素的有限序列。 记:A=(a1,a2,…,an),n≥0; n称为线性表的长度,当n=0,称空表。 注:元素类型可以是基本型也可以是构造型,如数组或结构体 2、线性结构的特点: 表中存在两个端点元素,即“第一个”和“最后一个”数据元素。 表中每个元素,除第一个外,都有且只有一个直接前趋;除最后一个元素外,都有且只有一个直接后继。 线性表的逻辑结构及其基本操作 线性表的顺序存储结构 线性表的链式存储结构 顺序表和链表的比较 二、顺序表上实现的基本操作: 1.初始化操作 构造一个空的顺序表。 void InitList_Sq( SqList L) { // 构造一个最大容量为LIST_INIT_SIZE的顺序表L L.elem = new ElemType[LIST_INIT_SIZE]; // 为顺序表 分配一个最大容量为LIST_INIT_SIZE的数组空间 if (!L.elem) ErrorMessage (“overflow”); //存储分配失败 L.length = 0; // 顺序表中当前所含元素个数为 0 L.listsize =LIST_INIT_SIZE // 该顺序表可以容纳 LIST_INIT_SIZE个数据元素 } // InitList_Sq 顺序表追加空间函数 void increment ( SqList L) { //为顺序表增加预定义个元素空间; ElemType *a; a = new ElemType[L.listsize+ LISTINCREMENT]; if (!a) ErrorMessage(“overflow”); for(i = 0; iL.length; i++ ) a[i] = L.elem[i]; //腾挪原空间数据 delete [] L.elem; //释放原表所占空间 L.elem = a; //移交空间首地址 L.listsize += LISTINCREMENT; //扩容后的顺序表最大空间 } 算法时间复杂度T(n)分析: 关键操作为:数据移动。 设插入位置为i,则移动元素个数为(n-i+1), 设Pi是在每个位置插入一个元素的概率。则在长度为n的线性表中插入一个元素时,所需移动的元素次数的平均次数为: void ListDelete_Sq(SqList L, int i,ElemType e) { //在顺序线性表L中删除第i个元素,并用e返回其值 //i的合法值为 1≤i≤L.length if ((i 1) || (i L.length)) ErrorMessage(“i值不合法”); p = (L.elem[i-1]); // p为被删除元素的位置 e = *p; // 或:e=L.elem[i-1]; 被删除元素的值赋给e q = L.elem[L.length-1]; // 表尾元素的位置 for (++p; p = q; ++p) *(p-1) = *p; //或:for(int j=i;j=L.length-1;j++) L.elem[j-1]=L.elem[j]; //被删除元素之后的元素左移 --L.length; // 表长减1 } // ListDelete_Sq ErrorMessage是自定义的错误处理函数,用于处理异常情况.使算法正常转到用户操作界面,而不至于转到操作系统意外状况. #includeprocess.h #includeiostream.h void ErrorMessage(char *s) { coutsendl; exit(1); } 算法时间复杂度T(n)分析: 关键操作为:数据移动。 设Qi是删除第i个元素的概率,则在长度为n的线性表中删除一个元素需移动元素的平均次数为: 销毁结构操作,当程序中的表结
文档评论(0)