




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 getelem(lb, i, e); / 取取lb中第中第i个数据元素赋给个数据元素赋给e if (!locateelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,则插入之void union(list &la, list lb) la_len = listlength(la); / 求线性表的长度求线性表的长度 lb_len = listlength(lb); for (i = 1; i = lb_len; i+) / union算法时间复杂度算法时间复杂度
2、o( listlength(la)listlength(lb) )void mergelist(list la, list lb, list &lc) / 本算法将非递减的有序表 la 和 lb 归并为 lc / merge_listwhile (i = la_len) & (j = lb_len) / la 和和 lb 均不空均不空 while (i=la_len) / 若 la 不空while (j=lb_len) / 若 lb 不空initlist(lc); / 构造空的线性表 lci = j = 1; k = 0;la_len = listlength(la);lb_l
3、en = listlength(lb); / la 和 lb 均非空,i = j = 1, k = 0 getelem(la, i, ai); getelem(lb, j, bj); if (ai = bj) / 将 ai 插入到 lc 中 listinsert(lc, +k, ai); +i; else / 将 bj 插入到 lc 中 listinsert(lc, +k, bj); +j; while (i = la_len) / 当la不空时 getelem(la, i+, ai); listinsert(lc, +k, ai); / 插入插入 la 表中剩余元素表中剩余元素 while
4、(j = lb_len) / 当lb不空时 getelem(lb, j+, bj); listinsert(lc, +k, bj); / 插入插入 lb 表中剩余元素表中剩余元素算法时间复杂度算法时间复杂度o( listlength(la) + listlength(lb) ) 用一组地址连续地址连续的存储单元 依次存放依次存放线性表中的数据元素 a1 a2 ai-1 ai an线性表的线性表的起始地址起始地址称作线性表的基地址基地址以“存储位置相邻存储位置相邻”表示有序对 即:loc(ai) = loc(ai-1) + c 一个数据元素所占存储量一个数据元素所占存储量所有数据元素的存储位置均
5、取决于所有数据元素的存储位置均取决于 第一个数据元素的存储位置第一个数据元素的存储位置 loc(ai) = loc(a1) + (i-1)c 基地址基地址顺序映像的顺序映像的 c 语言描述语言描述typedef struct sqlist; / 俗称 顺序表顺序表#define list_init_size 80 / 线性表存储空间的初始分配量#define listincrement 10 / 线性表存储空间的分配增量elemtype *elem; / 存储空间基址int length; / 当前长度int listsize; / 当前分配的存储容量 / (以sizeof(elemtype)
6、为单位)线性表的基本操作在顺序表中的实现线性表的基本操作在顺序表中的实现initlist(&l) / 结构初始化结构初始化locateelem(l, e, compare() / 查找查找listinsert(&l, i, e) / 插入元素插入元素listdelete(&l, i) / 删除元素删除元素status initlist_sq( sqlist& l ) / 构造一个空的线性表 / initlist_sq算法时间复杂度时间复杂度:o(1)l.elem = (elemtype*) malloc (list_ init_size sizeof (elem
7、type);if (!l.elem) exit(overflow);l.length = 0;l.listsize = list_init_sizereturn ok; int locateelem_sq(sqlist l, elemtype e, status (*compare)(elemtype, elemtype) / 在顺序表中查询第一个满足判定条件的数据元素,在顺序表中查询第一个满足判定条件的数据元素, / 若存在,则返回它的位序,否则返回若存在,则返回它的位序,否则返回 0 0 / locateelem_sq o( listlength(l) )算法的算法的时间复杂度时间复杂度为
8、:为:i = 1; / i i 的初值为第的初值为第 1 1 元素的位序元素的位序p = l.elem; / p p 的初值为第的初值为第 1 1 元素的存储位置元素的存储位置while (i = l.length & !(*compare)(*p+, e) +i;if (i = l.length) return i;else return 0;线性表线性表操作操作 listinsert(&l, i, e)的实现:的实现:首先分析首先分析:插入元素时,插入元素时,线性表的逻辑结构线性表的逻辑结构发生什么变化发生什么变化? (a1, , ai-1, ai, , an) 改变为改变
9、为 (a1, , ai-1, e, ai, , an)a1 a2 ai-1 ai ana1 a2 ai-1 ai ean, 表的长度增加表的长度增加 status listinsert_sq(sqlist &l, int i, elemtype e) / 在顺序表l的第 i 个元素之前插入新的元素e, / listinsert_sq 算法时间复杂度算法时间复杂度为为: :o( listlength(l) )q = &(l.elemi-1); / q 指示插入位置for (p = &(l.eleml.length-1); p = q; -p) *(p+1) = *p; /
10、 插入位置及之后的元素右移元素右移*q = e; / 插入e+l.length; / 表长增1return ok;if (l.length = l.listsize) / 当前存储空间已满,增加分配 newbase = (elemtype *)realloc(l.elem, (l.listsize+listincrement)*sizeof (elemtype); if (!newbase) exit(overflow); / 存储分配失败 l.elem = newbase; / 新基址 l.listsize += listincrement; / 增加存储容量if (i l.length+1
11、) return error; / 插入位置不合法21 18 30 75 42 56 8721 18 30 75例如:例如:listinsert_sq(l, 5, 66) l.length-10pppq87564266q = &(l.elemi-1); / q 指示插入位置指示插入位置for (p = &(l.eleml.length-1); p = q; -p) *(p+1) = *p;p线性表操作线性表操作 listdelete(&l, i, &e)的实现的实现:首先分析:首先分析:删除元素时,删除元素时,线性表的逻辑结构发生什么变化?线性表的逻辑结构发生什
12、么变化? (a1, , ai-1, ai, ai+1, , an) 改变为 (a1, , ai-1, ai+1, , an)ai+1 an, 表的长度减少a1 a2 ai-1 ai ai+1 ana1 a2 ai-1 status listdelete_sq (sqlist &l, int i, elemtype &e) / listdelete_sqfor (+p; p = q; +p) *(p-1) = *p; / 被删除元素之后的元素左移被删除元素之后的元素左移-l.length; / 表长减表长减1 1return ok;算法时间复杂度算法时间复杂度为为: : o( l
13、istlength(l)p = &(l.elemi-1); / p 为被删除元素的位置为被删除元素的位置e = *p; / 被删除元素的值赋给被删除元素的值赋给 eq = l.elem+l.length-1; / 表尾元素的位置表尾元素的位置if (i l.length) return error; / 删除位置不合法删除位置不合法元素左移元素左移21 18 30 75 42 56 8721 18 30 75l.length-10pppq8756p = &(l.elemi-1);q = l.elem+l.length-1;for (+p; p next; j = 1; / p
14、p指向第一个结点,指向第一个结点,j j为计数器为计数器while (p & jnext; +j; / 顺指针向后查找,直到顺指针向后查找,直到 p p 指向第指向第 i i 个元素个元素 / 或或 p p 为空为空if ( !p | ji ) return error; / 第第 i i 个元素不存在个元素不存在e = p-data; / 取得第取得第 i i 个元素个元素return ok;ai-1 线性表的操作 listinsert(&l, i, e) 在单链表中的实现: 有序对有序对 改变为改变为 和和 eaiai-1 因此,在单链表中第因此,在单链表中第 i 个结点之
15、前进个结点之前进行插入的基本操作为行插入的基本操作为: 找到线性表中第找到线性表中第i-1i-1个结点,然后修改个结点,然后修改其指向后继的指针。其指向后继的指针。 可见,在链表中插入结点只需要修改可见,在链表中插入结点只需要修改指针。但同时,若要在第指针。但同时,若要在第 i 个结点之前个结点之前插入元素,修改的是第插入元素,修改的是第 i-1 个结点的指个结点的指针。针。 status listinsert_l(linklist &l, int i, elemtype e) / l 为带头结点的单链表的头指针,本算法为带头结点的单链表的头指针,本算法 / 在链表中第在链表中第i 个
16、结点之前插入新的元素个结点之前插入新的元素 e / linstinsert_l算法的算法的时间复杂度时间复杂度为:o(listlength(l)p = l; j = 0;while (p & j next; +j; / 寻找第寻找第 i-1 个结点个结点if (!p | j i-1) return error; / i 大于表长或者小于大于表长或者小于1 s = (linklist) malloc ( sizeof (lnode); / 生成新结点s-data = e; s-next = p-next; p-next = s; / 插入return ok; eai-1aiai-1sp线
17、性表的操作listdelete (&l, i, &e)在链表中的实现:有序对有序对 和和 改变为改变为 ai-1aiai+1ai-1 在单链表中删除第删除第 i i 个结点个结点的基本基本操作操作为:找到线性表中第找到线性表中第i-1i-1个结点,修个结点,修改其指向后继的指针。改其指向后继的指针。ai-1aiai+1ai-1q = p-next; p-next = q-next; e = q-data; free(q);pq status listdelete_l(linklist &l, int i, elemtype &e) / 删除以 l 为头指针(带头
18、结点)的单链表中第 i 个结点 / listdelete_l算法的算法的时间复杂度时间复杂度为: o(listlength(l)p = l; j = 0;while (p-next & j next; +j; / 寻找第 i 个结点,并令 p 指向其前趋if (!(p-next) | j i-1) return error; / 删除位置不合理q = p-next; p-next = q-next; / 删除并释放结点e = q-data; free(q);return ok;操作 clearlist(&l) 在链表中的实现:void clearlist(&l) / 将
19、单链表重新置为一个空表 while (l-next) p=l-next; l-next=p-next; / clearlistfree(p);算法时间复杂度:o(listlength(l)如何从线性表得到单链表?如何从线性表得到单链表?链表是一个动态的结构,它不需要链表是一个动态的结构,它不需要予分配空间,因此予分配空间,因此生成链表的过程生成链表的过程是一个结点是一个结点“逐个插入逐个插入” ” 的过程。的过程。例如:逆位序输入例如:逆位序输入 n n 个数据元素的值,个数据元素的值, 建立带头结点的单链表。建立带头结点的单链表。操作步骤:操作步骤:一、建立一个一、建立一个“空表空表”;二、
20、输入数据元素二、输入数据元素an, 建立结点并插入;建立结点并插入;三、输入数据元素三、输入数据元素an-1, 建立结点并插入;建立结点并插入;ananan-1四、依次类推,直至输入四、依次类推,直至输入a a1 1为止。为止。void createlist_l(linklist &l, int n) / 逆序输入 n 个数据元素,建立带头结点的单链表 / createlist_l算法的算法的时间复杂度时间复杂度为:o(listlength(l)l = (linklist) malloc (sizeof (lnode);l-next = null; / 先建立一个带头结点的单链表for
21、 (i = n; i 0; -i) p = (linklist) malloc (sizeof (lnode); scanf(&p-data); / 输入元素值 p-next = l-next; l-next = p; / 插入用上述定义的单链表实现线性表的操作时,用上述定义的单链表实现线性表的操作时,存在的存在的问题问题: 改进链表的设置:改进链表的设置:1单链表的表长是一个隐含的值;单链表的表长是一个隐含的值; 1增加增加“表长表长”、“表尾指针表尾指针” 和和 “当前位当前位置的指针置的指针” 三个数据域;三个数据域;2在单链表的最后一个元素之后插入元素时,在单链表的最后一个元素
22、之后插入元素时, 需遍历整个链表;需遍历整个链表;3在链表中,元素的在链表中,元素的“位序位序”概念淡化,结概念淡化,结点的点的“位置位置”概念加强。概念加强。2将基本操作中的将基本操作中的“位序位序 i ”改变为改变为“指针指针 p ”。四、一个带头结点的线性链表类型四、一个带头结点的线性链表类型typedef struct lnode / 结点类型结点类型 elemtype data; struct lnode *next; *link, *position;status makenode( link &p, elemtype e ); / 分配由 p 指向的值为e的结点,并返回o
23、k, / 若分配失败,则返回 errorvoid freenode( link &p ); / 释放 p 所指结点typedef struct / 链表类型链表类型 link head, tail; / 分别指向头结点和 / 最后一个结点的指针 int len; / 指示链表长度 link current; / 指向当前被访问的结点 /的指针,初始位置指向头结点 linklist;链表的基本操作链表的基本操作: : 结构初始化和销毁结构结构初始化和销毁结构 status initlist( linklist &l ); / 构造一个空的线性链表 l,其头指针、 / 尾指针和当前
24、指针均指向头结点, / 表长为零。status destroylist( linklist &l ); / 销毁线性链表 l,l不再存在。 o(1) o(n) 引用型操作引用型操作 status listempty ( linklist l ); /判表空int listlength( linklist l ); / 求表长status prior( linklist l ); / 改变当前指针指向其前驱status next ( linklist l ); / 改变当前指针指向其后继elemtype getcurelem ( linklist l ); / 返回当前指针所指数据元素o
25、(1)o(1)o(n)o(1)o(1)status locatepos( linklist l, int i, link &p ); / 改变当前指针指向第i个结点status locateelem (linklist l, elemtype e, status (*compare)(elemtype, elemtype); / 若存在与e 满足函数compare( )判定关系的元 / 素,则移动当前指针指向第1个满足条件的 / 元素的前驱,并返回ok; 否则返回errorstatus listtraverse(linklist l, status(*visit)() ); / 依次对
26、l的每个元素调用函数visit()o(n)o(n)o(n) 加工型操作加工型操作status clearlist ( linklist &l ); / 重置 l 为空表status setcurelem(linklist &l, elemtype e ); / 更新当前指针所指数据元素status append ( linklist &l, link s ); / 在表尾结点之后链接一串结点status insafter ( linklist &l, elemtype e ); / 将元素 e 插入在当前指针之后status delafter ( linklis
27、t &l, elemtype& e ); / 删除当前指针之后的结点 o(1)o(n) o(s) o(1) o(1)status insafter( linklist& l, elemtype e ) / 若当前指针在链表中,则将数据元素e插入在线性链 / 表l中当前指针所指结点之后,并返回ok; / 否则返回error。 / insafter if ( ! l.current ) return error; if (! makenode( s, e) ) return error; s-next = l.current-next; l.current-next = s
28、; if (l.tail = l.current) l.tail = s; l.current = s; return ok;status delafter( linklist& l, elemtype& e ) / 若当前指针及其后继在链表中,则删除线性链表l中当前 / 指针所指结点之后的结点,并返回ok; 否则返回error。 /delafterif ( !(l.current & l.current-next ) ) return error;q = l.current-next;l.current-next = q-next;if (l.tail = q) l.
29、tail = l.current;e=q-data; freenode(q);return ok;status mergelist_l(linklist &lc, linklist &la, linklist &lb ,int (*compare) (elemtype,elemtype) / 归并有序表 la 和 lb ,生成新的有序表 lc, / 并在归并之后销毁la 和 lb, / compare 为指定的元素大小判定函数 / mergelist_l例二例二if ( !initlist(lc) return error; / 存储空间分配失败while (!( a=
30、maxc & b=maxc) / la 或或 lb 非空非空 locatepos (la, 0); locatepos (lb, 0); / 当前指针指向头结点当前指针指向头结点if ( delafter( la, e) a = e; / 取得取得 la 表中第一个元素表中第一个元素 aelse a = maxc; / maxc为常量最大值if ( delafter( lb, e) b = e; / 取得取得 lb 表中第一个元素表中第一个元素 belse b = maxc; / a 和和 b 为两表中当前比较元素为两表中当前比较元素destroylist(la); destroyli
31、st(lb); / 销毁链表销毁链表 la 和和 lbreturn ok;if ( a != maxc ) / 连接连接la中剩余节点中剩余节点if ( b != maxc ) / 连接连接la中剩余节点中剩余节点 if (*compare)(a, b) next = p-next; p-next = s;s-next-prior = s; s-prior = p;psai-1ai插入插入ai-1删除删除aiai+1p-next = p-next-next;p-next-prior = p;pai-1六、有序表类型六、有序表类型adt ordered_list 数据对象数据对象: s = xi
32、|xi orderedset , i=1,2,n, n0 集合中任意两个元素之间均可以进行比较数据关系数据关系: :r = | xi-1, xi s, xi-1 xi, i=2,3,n locateelem( l, e, &q, int(*compare)(elemtype,elemtype) )初始条件初始条件:有序表l已存在。操作结果操作结果:若有序表l中存在元素e,则 q指示l中第一个值为第一个值为 e 的元素的元素的位置,并返回函数值true;否则 q 指示第一个大第一个大于于 e 的元素的前驱的元素的前驱的位置,并返回函数值false。 基本操作:基本操作: compare是
33、一个是一个有序判定函数有序判定函数( 12, 23, 34, 45, 56, 67, 78, 89, 98, 45 )例如例如:若若 e = 45, 则则 q 指向指向 若若 e = 88, 则则 q 指向指向表示值为表示值为 88 的元素应插入的元素应插入在该指针所指结点之后。在该指针所指结点之后。void union(list &la, list lb) / lb 为线性表 initlist(la); / 构造(空的)线性表la la_len=listlength(la); lb_len=listlength(lb); for (i = 1; i = lb_len; i+) get
34、elem(lb, i, e); / 取取lb中第中第 i 个数据元素赋给个数据元素赋给 e if (!locateelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,则插入之 / union算法时间复杂度:算法时间复杂度:o(n2)nnnxpxpxppxp.)(2210在计算机中,可以用一个线性表来表示在计算机中,可以用一个线性表来表示: p = (p0, p1, ,pn)一元多项式一元多项式但是对于形如但是对于形如 s(x) = 1 + 3x10000 2x20000的
35、多项式,上述表示方法是否合适?的多项式,上述表示方法是否合适? 一般情况下的一元稀疏多项式一元稀疏多项式可写成 pn(x) = p1xe1 + p2xe2 + + pmxem其中其中:pi 是指数为ei 的项的非零系数, 0 e1 e2 em = n可以下列线性表表示:(p1, e1), (p2, e2), , (pm,em) ) p999(x) = 7x3 - 2x12 - 8x999例如例如:可用线性表 ( (7, 3), (-2, 12), (-8, 999) )表示adt polynomial 数据对象数据对象: 数据关系数据关系:抽象数据类型一元多项式的定义如下:d ai | ai
36、termset, i=1,2,.,m, m0 termset 中的每个元素包含一个每个元素包含一个 表示系数的实数和表示指数的整数表示系数的实数和表示指数的整数 r1 |ai-1 ,aid, i=2,.,n 且ai-1中的指数值中的指数值ai中的指数值中的指数值 creatpolyn ( &p, m ) destroypolyn ( &p ) printpolyn ( &p ) 基本操作基本操作:操作结果操作结果:输入 m 项的系数和指数, 建立一元多项式 p。初始条件初始条件:一元多项式 p 已存在。操作结果操作结果:销毁一元多项式 p。初始条件初始条件:一元多项式
37、p 已存在。操作结果操作结果:打印输出一元多项式 p。 polynlength( p ) addpolyn ( &pa, &pb ) subtractpolyn ( &pa, &pb ) adt polynomial初始条件初始条件:一元多项式 p 已存在。操作结果操作结果:返回一元多项式 p 中的项数。初始条件初始条件:一元多项式 pa 和 pb 已存在。操作结果操作结果:完成多项式相加运算,即: pa = papb,并销毁一元多项式 pb。一元多项式的实现:一元多项式的实现:typedef struct / 项项的表示 float coef; / 系数系数 int expn; / 指数指数 term, elemtype; typedef orderedlinklist poly
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢铁行业新一代节能降耗技术分析
- 相反数的题目及答案
- 现场答辩题目及参考答案
- 2025有关电子产品销售合同
- 2025版房屋租赁合同范本
- 物业保洁考试试题及答案
- 2024译林版八年级英语上册Unit 2 课时6 Integration ABC 分层作业(含答案)
- 2025年7月血液学检验考试题(附参考答案)
- 2025年高考化学试题分类汇编:化学实验基础(含解析)
- 2025高考生物试题分类汇编:细胞的物质基础和结构基础(含解析)
- Q3D学习体会课件
- 眼科学教学课件:绪论
- 中医运动养生 中医养生学课件
- GB/T 5563-2013橡胶和塑料软管及软管组合件静液压试验方法
- GB/T 1192-1999农业轮胎
- 人类学-课件精
- DBJ51-T 188-2022 预拌流态固化土工程应用技术标准
- 体育产业经营管理课件第一章导论
- 2023门球竞赛规则电子版图文并茂
- 部编版四年级语文上册第5课《一个豆荚里的五粒豆》优秀PPT课件
- 大班社会《班级规则我遵守》课件
评论
0/150
提交评论