数据结构算法实现及解析 chap线性表_第1页
数据结构算法实现及解析 chap线性表_第2页
数据结构算法实现及解析 chap线性表_第3页
数据结构算法实现及解析 chap线性表_第4页
数据结构算法实现及解析 chap线性表_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、线性结构的线性结构的基本特征基本特征为为: :1集合中必存在唯一的一个集合中必存在唯一的一个“第一元素第一元素”;2集合中必存在唯一的一个集合中必存在唯一的一个 “最后元素最后元素” ;3除最后元素在外,均有除最后元素在外,均有 唯一的后继唯一的后继;4除第一元素之外,均有除第一元素之外,均有 唯一的前驱唯一的前驱。 线性结构线性结构 是是 一个数据元素的一个数据元素的有序(次序)集有序(次序)集线性表线性表是一种最简单的线性结构线性结构2.1 线性表的类型定义线性表的类型定义2.3 线性表类型的实现线性表类型的实现 链式映象链式映象2.4 一元多项式的表示一元多项式的表示2.2 线性表类型的

2、实现线性表类型的实现 顺序映象顺序映象2.1线性表的类型定义线性表的类型定义抽象数据类型线性表线性表的定义如下:adt list 数据对象数据对象:d ai | ai elemset, i=1,2,.,n, n0 称 n 为线性表的表长表长; 称 n=0 时的线性表为空表空表。数据关系数据关系:r1 |ai-1 ,aid, i=2,.,n 设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序位序。读作属于 基本操作:基本操作: 结构初始化操作结构初始化操作结构销毁操作结构销毁操作 引用型操作引用型操作 加工型操作加工型操作 adt list

3、 initlist( &l )操作结果:操作结果:构造一个空的线性表l。初始化操作初始化操作 结构销毁操作结构销毁操作destroylist( &l )初始条件:操作结果:线性表 l 已存在。销毁线性表 l。listempty( l )listlength( l )priorelem( l, cur_e, &pre_e )nextelem( l, cur_e, &next_e ) getelem( l, i, &e )locateelem( l, e, compare( ) )listtraverse(l, visit( )引用型操作引用型操作: : l

4、istempty( l )初始条件:操作结果:线性表l已存在。若l为空表,则返回true,否则false。(线性表判空)listlength( l )初始条件:操作结果:线性表l已存在。返回l中元素个数。(求线性表的长度) priorelem( l, cur_e, &pre_e )初始条件:操作结果:线性表l已存在。若cur_e是l的元素,但不是第一个,则用pre_e 返回它的前驱,否则操作失败,pre_e无定义。(求数据元素的前驱)nextelem( l, cur_e, &next_e )初始条件:操作结果:线性表l已存在。若cur_e是l的元素,但不是最后一个,则用next

5、_e返回它的后继,否则操作失败,next_e无定义。(求数据元素的后继)getelem( l, i, &e ) 初始条件: 操作结果:线性表l已存在,且 1ilengthlist(l)。用 e 返回l中第 i 个元素的值。(求线性表中某个数据元素)locateelem( l, e, compare( ) )初始条件:操作结果:线性表l已存在,e为给定值, compare( )是元素判定函数。返回l中第中第1个个与e满足满足关系compare( )的元素的位序。若这样的元素不存在,则返回值为0。(定位函数) listtraverse(l, visit( )初始条件:操作结果:线性表l已存

6、在,visit() 为某个访问函数。依次依次对l的每个元素调用函数visit( )。一旦visit( )失败,则操作失败。(遍历线性表)加工型操作加工型操作 clearlist( &l )putelem( &l, i, &e )listinsert( &l, i, e )listdelete(&l, i, &e) clearlist( &l )初始条件:操作结果:线性表l已存在。将l重置为空表。(线性表置空)putelem( &l, i, &e )初始条件:操作结果:线性表l已存在,且 1ilengthlist(l) 。l

7、中第i个元素赋值同e的值。(改变数据元素的值) listinsert( &l, i, e )初始条件:操作结果:线性表l已存在, 且 1ilengthlist(l)+1 。在l的第i个元素之前插入插入新的元素e,l的长度增1。(插入数据元素)listdelete(&l, i, &e)初始条件:操作结果:线性表l已存在且非空, 1ilengthlist(l) 。删除l的第i个元素,并用e返回其值,l的长度减1。(删除数据元素)利用上述定义的线性表线性表 可以实现其它更复杂的操作例例 2-2例例 2-3例例 2-1 假设:有两个集合集合 a 和和 b 分别用两个线性表线性表

8、 la 和和 lb 表示,即:线性表中的数据元素即为集合中的成员。 现要求一个新的集合现要求一个新的集合 aab。是联集 是交集例例 2-1 要求对线性表作如下操作:扩大线性表 la,将存在于线性表存在于线性表lb 中中而不存在于线性表不存在于线性表 la 中中的数据元素插入到线性表插入到线性表 la 中中去。上述问题可演绎为:1从线性表lb中依次察看每个数据元素;2依值在线性表la中进行查访; 3若不存在,则插入之。getelem(lb, i)e locateelem(la, e, equal( ) listinsert(la, n+1, e)操作步骤:操作步骤: getelem(lb, i

9、, 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 已知已知一个非纯集合非纯集合 b,试构造构造一个纯集合

10、纯集合 a,使使 a中只包含中只包含 b 中所有值各中所有值各不相不相 同的数据元素同的数据元素。仍选用线性表线性表表示集合。例例 2-2集合集合 b集合集合 a从集合 b 取出物件放入集合 a要求集合a中同样物件不能有两件以上同样物件不能有两件以上因此,算法的策略应该和例算法的策略应该和例2-1相同相同void union(list &la, list lb) la_len=listlength(la); lb_len=listlength(lb); / union getelem(lb, i, e); / 取取lb中第中第 i 个数据元素赋给个数据元素赋给 e if (!locat

11、eelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,则插入之for (i = 1; i = lb_len; i+) initlist(la); / 构造(空的)线性表la若线性表中的数据元素相互之间可以比比较较,并且数据元素在线性表中依值非递依值非递减或非递增有序减或非递增有序排列,即 aiai-1 或 aiai-1(i = 2,3, n),则称该线性表为有序表有序表 (ordered list)(ordered list)。试改变结构,以有序表有序表表示集合。例如例如

12、:(2,3,3,5,6,6,6,8,12)对集合 b 而言, 值相同的数据元素必定相邻;值相同的数据元素必定相邻;对集合 a 而言,数据元素依值从小至大的顺序插入。数据元素依值从小至大的顺序插入。因此,数据结构改变了,数据结构改变了, 解决问题的策略也相应要改变。解决问题的策略也相应要改变。void purge(list &la, list lb) initlist(la); la_len = listlength(la); lb_len =listlength(lb); / 求线性表的长度求线性表的长度 for (i = 1; i = lb_len; i+) / purge gete

13、lem(lb, i, e); / 取取lb中第中第i个数据元素赋给个数据元素赋给 eif (listempty(la) | !equal (en, e) listinsert(la, +la_len, e); en = e; / la中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,则插入之 已知两个非纯集合已知两个非纯集合a 和和b中的元素中的元素按值非递减有序排列,现要求将按值非递减有序排列,现要求将a和和b归并为一个新集合归并为一个新集合c。例例 2-3 / la 和 lb 均非空,i = j = 1, k = 0 getelem(la, i, ai); getelem(

14、lb, j, bj); if (ai = bj) / 将 ai 插入到 lc 中 listinsert(lc, +k, ai); +i; else / 将 bj 插入到 lc 中 listinsert(lc, +k, bj); +j; 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_

15、len) / 若 lb 不空initlist(lc); / 构造空的线性表 lci = j = 1; k = 0;la_len = listlength(la);lb_len = listlength(lb); while (i = la_len) / 当la不空时 getelem(la, i+, ai); listinsert(lc, +k, ai); / 插入插入 la 表中剩余元素表中剩余元素 while (j = lb_len) / 当lb不空时 getelem(lb, j+, bj); listinsert(lc, +k, bj); / 插入插入 lb 表中剩余元素表中剩余元素最简单

16、的一种顺序映象方法是:最简单的一种顺序映象方法是: 令令 y y 的存储位置和的存储位置和 x x 的存储位置的存储位置相邻相邻。顺序映象顺序映象 以以 x 的存储位置和的存储位置和 y 的存储位置的存储位置之间某种关系表示逻辑关系之间某种关系表示逻辑关系。 用一组地址连续地址连续的存储单元 依次存放依次存放线性表中的数据元素 a1 a2 ai-1 ai an线性表的线性表的起始地址起始地址称作线性表的基地址基地址以“存储位置相邻存储位置相邻”表示有序对 即:loc(ai) = loc(ai-1) + c 一个数据元素所占存储量一个数据元素所占存储量所有数据元素的存储位置均取决于所有数据元素的

17、存储位置均取决于 第一个数据元素的存储位置第一个数据元素的存储位置 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)为单位)线性表的基本

18、操作在顺序表中的实现线性表的基本操作在顺序表中的实现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 (elemtype);if (

19、!l.elem) exit(overflow);l.length = 0;l.listsize = list_init_sizereturn ok;例如:顺序表23 75 41 38 54 62 17l.eleml.lengthl.listsizee =38pppppi 1 2 3 4 1 850p可见,基本操作是:将顺序表中的元素逐个和给定值 e 相比较。 int locateelem_sq(sqlist l, elemtype e, status (*compare)(elemtype, elemtype) / 在顺序表中查询第一个满足判定条件的数据元素,在顺序表中查询第一个满足判定条件的

20、数据元素, / 若存在,则返回它的位序,否则返回若存在,则返回它的位序,否则返回 0 0 / locateelem_sq o( listlength(l) )算法的算法的时间复杂度时间复杂度为:为: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;(*compare)(*p+, e)线性表操作 li

21、stinsert(&l, i, e)的实现:首先分析首先分析:插入元素时,线性表的逻辑结构逻辑结构发生什么变化发生什么变化? (a1, , ai-1, ai, , an) 改变为 (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, / i 的合法范围为 1il.length+1 / listinsert_sq 算法时间复杂度算法时间复杂度为为:

22、:o( listlength(l) )q = &(l.elemi-1); / q 指示插入位置for (p = &(l.eleml.length-1); p = q; -p) *(p+1) = *p; / 插入位置及之后的元素右移元素右移*q = e; / 插入e+l.length; / 表长增1return ok;元素右移元素右移考虑移动元素的平均情况考虑移动元素的平均情况: : 假设在第 i 个元素之前插入的概率为 , 则在长度为n 的线性表中插入一个元素所需插入一个元素所需移动元素次数的期望值移动元素次数的期望值为:ip11) 1(niiisinpe11) 1(11nii

23、sinne2n 若假定假定在线性表中任何一个位置上进行插入插入的概率的概率都是相等相等的,则移动元素的期望值移动元素的期望值为: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.l

24、ength+1) 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)的实现:首先分析:删除元素时,线性表的逻辑结构发生什么变化? (a1, , ai-1, ai, ai+1, , an) 改变

25、为 (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( listlength(l)p = &(l.elemi-1); /

26、p 为被删除元素的位置为被删除元素的位置e = *p; / 被删除元素的值赋给被删除元素的值赋给 eq = l.elem+l.length-1; / 表尾元素的位置表尾元素的位置if (i l.length) return error; / 删除位置不合法删除位置不合法元素左移元素左移考虑移动元素的平均情况考虑移动元素的平均情况: : 假设删除第 i 个元素的概率为 , 则在长度为n 的线性表中删除一个元素所需移动元素次数的期望值移动元素次数的期望值为:iqniidlinqe1)(nidlinne1)(121n若假定在线性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值移动元素的

27、期望值为: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 p指向第一个结点,指向第一个结点,j j为计数器为计数器while (p & jnext; +j; / 顺指针向后查找,直到顺指针向后查找,直到 p p 指向第指向第 i i 个元素个元素 / 或或 p p 为空为空if ( !p | ji ) return error; / 第第 i i 个元素不存在个元素不存在e = p-data;

28、/ 取得第取得第 i i 个元素个元素return ok;ai-1 线性表的操作 listinsert(&l, i, e) 在单链表中的实现: 有序对有序对 改变为改变为 和和 eaiai-1 因此,在单链表中第因此,在单链表中第 i 个结点之前进个结点之前进行插入的基本操作为行插入的基本操作为: 找到线性表中第找到线性表中第i-1i-1个结点,然后修改个结点,然后修改其指向后继的指针。其指向后继的指针。 可见,在链表中插入结点只需要修改可见,在链表中插入结点只需要修改指针。但同时,若要在第指针。但同时,若要在第 i 个结点之前个结点之前插入元素,修改的是第插入元素,修改的是第 i-1

29、 个结点的指个结点的指针。针。 status listinsert_l(linklist l, int i, elemtype e) / l 为带头结点的单链表的头指针,本算法为带头结点的单链表的头指针,本算法 / 在链表中第在链表中第i 个结点之前插入新的元素个结点之前插入新的元素 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 大于表长或者小于大于表长或者

30、小于1 s = (linklist) malloc ( sizeof (lnode); / 生成新结点s-data = e; s-next = p-next; p-next = s; / 插入return ok; eai-1aiai-1sp线性表的操作listdelete (&l, i, &e)在链表中的实现:有序对有序对 和和 改变为改变为 ai-1aiai+1ai-1 在单链表中删除第删除第 i i 个结点个结点的基本基本操作操作为:找到线性表中第找到线性表中第i-1i-1个结点,修个结点,修改其指向后继的指针。改其指向后继的指针。ai-1aiai+1ai-1q = p-n

31、ext; p-next = q-next; e = q-data; free(q);pq status listdelete_l(linklist l, int i, elemtype &e) / 删除以 l 为头指针(带头结点)的单链表中第 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-n

32、ext; p-next = q-next; / 删除并释放结点e = q-data; free(q);return ok;操作 clearlist(&l) 在链表中的实现:void clearlist(&l) / 将单链表重新置为一个空表 while (l-next) p=l-next; l-next=p-next; / clearlistfree(p);算法时间复杂度:o(listlength(l)如何从线性表得到单链表?如何从线性表得到单链表?链表是一个动态的结构,它不需要链表是一个动态的结构,它不需要予分配空间,因此予分配空间,因此生成链表的过程生成链表的过程是一个结点是

33、一个结点“逐个插入逐个插入” ” 的过程。的过程。例如:逆位序输入例如:逆位序输入 n n 个数据元素的值,个数据元素的值, 建立带头结点的单链表。建立带头结点的单链表。操作步骤:操作步骤:一、建立一个一、建立一个“空表空表”;二、输入数据元素二、输入数据元素an, 建立结点并插入;建立结点并插入;三、输入数据元素三、输入数据元素an-1, 建立结点并插入;建立结点并插入;ananan-1四、依次类推,直至输入四、依次类推,直至输入a a1 1为止。为止。void createlist_l(linklist &l, int n) / 逆序输入 n 个数据元素,建立带头结点的单链表 /

34、createlist_l算法的算法的时间复杂度时间复杂度为:o(listlength(l)l = (linklist) malloc (sizeof (lnode);l-next = null; / 先建立一个带头结点的单链表for (i = n; i 0; -i) p = (linklist) malloc (sizeof (lnode); scanf(&p-data); / 输入元素值 p-next = l-next; l-next = p; / 插入回顾回顾 2.1 节中三个例子的算法,节中三个例子的算法,看一下当线性表分别以顺序存看一下当线性表分别以顺序存储结构和链表存储结构实

35、现时,储结构和链表存储结构实现时,它们的时间复杂度为多少?它们的时间复杂度为多少?void union(list &la, list lb) la_len = listlength(la); lb_len =listlength(lb); for (i = 1; i = lb_len; i+) getelem(lb, i, e); if (!locateelem(la, e, equal( ) listinsert(la, +la_len, e); /for / union控制结构:控制结构:基本操作:基本操作:for 循环循环getelem, locateelem 和 listins

36、ert当以顺序映像实现抽象数据类型线性表时为: o( listlength(la)listlength(lb) ) 当以链式映像实现抽象数据类型线性表时为: o( listlength(la)listlength(lb) )例例2-1算法时间复杂度算法时间复杂度void purge(list &la, list lb) initlist(la); la_len = listlength(la); lb_len =listlength(lb); for (i = 1; i = lb_len; i+) getelem(lb, i, e); if (listempty(la) | !equa

37、l (en, e) listinsert(la, +la_len, e); en = e; /for / purge控制结构:控制结构:基本操作:基本操作:for 循环getelem 和 listinsert当以顺序映像实现抽象数据类型线性表时为: o( listlength(lb) )当以链式映像实现抽象数据类型线性表时为: o( listlength2(lb) )例例2-2算法时间复杂度算法时间复杂度void mergelist(list la, list lb, list &lc) initlist(lc); i = j = 1; k = 0; la_len = listleng

38、th(la); lb_len = listlength(lb); while (i = la_len) & (j = lb_len) getelem(la, i, ai); getelem(lb, j, bj); if (ai next = l.current-next; l.current-next = s; if (l.tail = l.current) l.tail = s; l.current = s; return ok;status delafter( linklist& l, elemtype& e ) / 若当前指针及其后继在链表中,则删除线性链表l中当

39、前 / 指针所指结点之后的结点,并返回ok; 否则返回error。 /delafterif ( !(l.current & l.current-next ) ) return error;q = l.current-next;l.current-next = q-next;if (l.tail = q) l.tail = l.current;e=q-data; freenode(q);return ok;status mergelist_l(linklist &lc, linklist &la, linklist &lb ,int (*compare) (ele

40、mtype,elemtype) / 归并有序表 la 和 lb ,生成新的有序表 lc, / 并在归并之后销毁la 和 lb, / compare 为指定的元素大小判定函数 / mergelist_l例二例二if ( !initlist(lc) return error; / 存储空间分配失败while (!( a=maxc & b=maxc) / la 或或 lb 非空非空 locatepos (la, 0); locatepos (lb, 0); / 当前指针指向头结点当前指针指向头结点if ( delafter( la, e) a = e; / 取得取得 la 表中第一个元素表中

41、第一个元素 aelse a = maxc; / maxc为常量最大值if ( delafter( lb, e) b = e; / 取得取得 lb 表中第一个元素表中第一个元素 belse b = maxc; / a 和和 b 为两表中当前比较元素为两表中当前比较元素destroylist(la); destroylist(lb); / 销毁链表销毁链表 la 和和 lbreturn ok; if (*compare)(a, b) next = p-next; p-next = s;s-next-prior = s; s-prior = p;psai-1ai插入插入ai-1删除删除aiai+1p

42、-next = p-next-next;p-next-prior = p;pai-1六、有序表类型六、有序表类型adt ordered_list 数据对象数据对象: s = xi|xi orderedset , i=1,2,n, n0 集合中任意两个元素之间均可以进行比较数据关系数据关系: :r = | xi-1, xi s, xi-1 xi, i=2,3,n 回顾例回顾例2-2的两个算法的两个算法 locateelem( l, e, &q, int(*compare)(elemtype,elemtype) )初始条件初始条件:有序表l已存在。操作结果操作结果:若有序表l中存在元素e,

43、则 q指示l中第一个值为第一个值为 e 的元素的元素的位置,并返回函数值true;否则 q 指示第一个大第一个大于于 e 的元素的前驱的元素的前驱的位置,并返回函数值false。 基本操作:基本操作: compare是一个是一个有序判定函数有序判定函数( 12, 23, 34, 45, 56, 67, 78, 89, 98, 45 )例如例如:若若 e = 45, 则则 q 指向指向 若若 e = 88, 则则 q 指向指向表示值为表示值为 88 的元素应插入的元素应插入在该指针所指结点之后。在该指针所指结点之后。void union(list &la, list lb) / lb 为

44、线性表 initlist(la); / 构造(空的)线性表la la_len=listlength(la); lb_len=listlength(lb); for (i = 1; i = lb_len; i+) getelem(lb, i, e); / 取取lb中第中第 i 个数据元素赋给个数据元素赋给 e if (!locateelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,则插入之 / union算法时间复杂度:算法时间复杂度:o(n2)void purge(li

45、st &la, list lb) / lb为有序表 initlist(la); la_len = listlength(la); lb_len =listlength(lb); / 求线性表的长度求线性表的长度 for (i = 1; i = lb_len; i+) / purge getelem(lb, i, e); / 取取lb中第中第i个数据元素赋给个数据元素赋给 eif (listempty(la) | !equal (en, e) listinsert(la, +la_len, e); en = e; / la中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,

46、则插入之算法时间复杂度:算法时间复杂度:o(n)nnnxpxpxppxp.)(2210在计算机中,可以用一个线性表来表示在计算机中,可以用一个线性表来表示: p = (p0, p1, ,pn)一元多项式一元多项式但是对于形如但是对于形如 s(x) = 1 + 3x10000 2x20000的多项式,上述表示方法是否合适?的多项式,上述表示方法是否合适? 一般情况下的一元稀疏多项式一元稀疏多项式可写成 pn(x) = p1xe1 + p2xe2 + + pmxem其中其中:pi 是指数为ei 的项的非零系数, 0 e1 e2 em = n可以下列线性表表示:(p1, e1), (p2, e2),

47、 , (pm,em) ) p999(x) = 7x3 - 2x12 - 8x999例如例如:可用线性表 ( (7, 3), (-2, 12), (-8, 999) )表示adt polynomial 数据对象数据对象: 数据关系数据关系:抽象数据类型一元多项式的定义如下:d ai | ai 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。初始条件初始条件:一元多项式 p 已存在。操作结果操作结果:打印

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论