數(shù)據(jù)結(jié)構(gòu)課程chap02線性表_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程chap02線性表_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程chap02線性表_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程chap02線性表_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程chap02線性表_第5頁(yè)
已閱讀5頁(yè),還剩122頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第二章第二章線性表線性表線性結(jié)構(gòu)的線性結(jié)構(gòu)的基本特征基本特征為為: :1集合中必存在唯一的一個(gè)集合中必存在唯一的一個(gè)“第一元素第一元素”;2集合中必存在唯一的一個(gè)集合中必存在唯一的一個(gè) “最后元素最后元素” ;3除最后元素在外,均有除最后元素在外,均有 唯一的后繼唯一的后繼;4除第一元素之外,均有除第一元素之外,均有 唯一的前驅(qū)唯一的前驅(qū)。線性結(jié)構(gòu)線性結(jié)構(gòu) 是是 一類數(shù)據(jù)元素的一類數(shù)據(jù)元素的有序(次序)集有序(次序)集線性表線性表是一種最簡(jiǎn)單的線性結(jié)構(gòu)線性結(jié)構(gòu)表頭元素表尾元素線性表的邏輯結(jié)構(gòu)示意圖a1aia2ai+1an2.1 線性表的類型定義線性表的類型定義2.3 線性表類型的實(shí)現(xiàn)線性表類型

2、的實(shí)現(xiàn) 鏈?zhǔn)接诚箧準(zhǔn)接诚?.4 一元多項(xiàng)式的表示一元多項(xiàng)式的表示2.2 線性表類型的實(shí)現(xiàn)線性表類型的實(shí)現(xiàn) 順序映象順序映象2.1線性表的類型定義線性表的類型定義抽象數(shù)據(jù)類型線性表線性表的定義如下:adt list 數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象:d ai | ai elemset, i=1,2,.,n, n0 稱 n 為線性表的表長(zhǎng)表長(zhǎng); 稱 n=0 時(shí)的線性表為空表空表。數(shù)據(jù)關(guān)系數(shù)據(jù)關(guān)系:r1 |ai-1 ,aid, i=2,.,n 設(shè)線性表為 (a1,a2, . . . ,ai,. . . ,an), 稱 i 為 ai 在線性表中的位序位序。 基本操作:基本操作: 結(jié)構(gòu)初始化操作結(jié)構(gòu)初始化操作結(jié)構(gòu)銷毀操

3、作結(jié)構(gòu)銷毀操作 引用型操作引用型操作 加工型操作加工型操作 adt list initlist( &l )操作結(jié)果:操作結(jié)果:構(gòu)造一個(gè)空的線性表l。初始化操作初始化操作 結(jié)構(gòu)銷毀操作結(jié)構(gòu)銷毀操作destroylist( &l )初始條件:操作結(jié)果:線性表 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( ) )l

4、isttraverse(l, visit( )引用型操作引用型操作: : listempty( l )初始條件:操作結(jié)果:線性表l已存在。若l為空表,則返回true,否則false。(線性表判空)listlength( l )初始條件:操作結(jié)果:線性表l已存在。返回l中元素個(gè)數(shù)。(求線性表的長(zhǎng)度) priorelem( l, cur_e, &pre_e )初始條件:操作結(jié)果:線性表l已存在。若cur_e是l的元素,但不是第一個(gè),則用pre_e 返回它的前驅(qū),否則操作失敗,pre_e無定義。(求數(shù)據(jù)元素的前驅(qū))nextelem( l, cur_e, &next_e )初始條件:操

5、作結(jié)果:線性表l已存在。若cur_e是l的元素,但不是最后一個(gè),則用next_e返回它的后繼,否則操作失敗,next_e無定義。(求數(shù)據(jù)元素的后繼)getelem( l, i, &e ) 初始條件: 操作結(jié)果:線性表l已存在,且 1ilengthlist(l)。用 e 返回l中第 i 個(gè)元素的值。(求線性表中某個(gè)數(shù)據(jù)元素)locateelem( l, e, compare( ) )初始條件:操作結(jié)果:線性表l已存在,e為給定值, compare( )是元素判定函數(shù)。返回l中第中第1個(gè)個(gè)與e滿足滿足關(guān)系compare( )的元素的位序。若這樣的元素不存在,則返回值為0。(定位函數(shù))loc

6、ateelem( l, e, compare( ) )(定位函數(shù)) listtraverse(l, visit( )初始條件:操作結(jié)果:線性表l已存在,visit() 為某個(gè)訪問函數(shù)。依次依次對(duì)l的每個(gè)元素調(diào)用函數(shù)visit( )。一旦visit( )失敗,則操作失敗。(遍歷線性表)加工型操作加工型操作 clearlist( &l )putelem( &l, i, &e )listinsert( &l, i, e )listdelete(&l, i, &e) clearlist( &l )初始條件:操作結(jié)果:線性表l已存在。將l重置為空表

7、。(線性表置空)putelem( &l, i, &e )初始條件:操作結(jié)果:線性表l已存在,且 1ilengthlist(l) 。l中第i個(gè)元素賦值同e的值。(改變數(shù)據(jù)元素的值) listinsert( &l, i, e )初始條件:操作結(jié)果:線性表l已存在, 且 1ilengthlist(l)+1 。在l的第i個(gè)元素之前插入插入新的元素e,l的長(zhǎng)度增1。(插入數(shù)據(jù)元素)listdelete(&l, i, &e)初始條件:操作結(jié)果:線性表l已存在且非空, 1ilengthlist(l) 。刪除l的第i個(gè)元素,并用e返回其值,l的長(zhǎng)度減1。(刪除數(shù)據(jù)元素)

8、利用上述定義的線性表線性表 可以實(shí)現(xiàn)其它更復(fù)雜的操作例例 2-2例例 2-3例例 2-1 假設(shè):有兩個(gè)集合集合 a 和和 b 分別用兩個(gè)線性表線性表 la 和和 lb 表示,即:線性表中的數(shù)據(jù)元素即為集合中的成員。 現(xiàn)要求一個(gè)新的集合現(xiàn)要求一個(gè)新的集合aab。例例 2-1 要求對(duì)線性表作如下操作:擴(kuò)大線性表 la,將存在于線性表存在于線性表lb 中中而不存在于線性表不存在于線性表 la 中中的數(shù)據(jù)元素插入到線性表插入到線性表 la 中中去。上述問題可演繹為:1從線性表lb中依次察看每個(gè)數(shù)據(jù)元素;2依值在線性表la中進(jìn)行查訪; 3若不存在,則插入之。getelem(lb, i)e locatee

9、lem(la, e, equal( ) listinsert(la, n+1, e)操作步驟:操作步驟: getelem(lb, i, e); / 取取lb中第中第i個(gè)數(shù)據(jù)元素賦給個(gè)數(shù)據(jù)元素賦給e if (!locateelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的數(shù)據(jù)元素,則插入之相同的數(shù)據(jù)元素,則插入之void union(list &la, list lb) la_len = listlength(la); / 求線性表的長(zhǎng)度求線性表的長(zhǎng)度 lb_len = listlength(lb

10、); for (i = 1; i = lb_len; i+) / union 已知已知一個(gè)非純集合非純集合 b,試構(gòu)造構(gòu)造一個(gè)純集合純集合 a,使使 a中只包含中只包含 b 中所有值各中所有值各不相不相 同的數(shù)據(jù)元素同的數(shù)據(jù)元素。仍選用線性表線性表表示集合。例例 2-2從集合 b 取出物件放入集合 a要求集合a中同樣物件不能有兩件以上同樣物件不能有兩件以上因此,算法的策略應(yīng)該和例算法的策略應(yīng)該和例2-1相同相同void union(list &la, list lb) la_len=listlength(la); lb_len=listlength(lb); / union getel

11、em(lb, i, e); / 取取lb中第中第 i 個(gè)數(shù)據(jù)元素賦給個(gè)數(shù)據(jù)元素賦給 e if (!locateelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的數(shù)據(jù)元素,則插入之相同的數(shù)據(jù)元素,則插入之for (i = 1; i = lb_len; i+) initlist(la); / 構(gòu)造(空的)線性表la若線性表中的數(shù)據(jù)元素相互之間可以比較比較,并且數(shù)據(jù)元素在線性表中依值非遞減或非依值非遞減或非遞增有序遞增有序排列,即 aiai-1 或 aiai-1(i = 2,3, n),則稱該線性表為有序表有

12、序表(ordered list)(ordered list)。試改變結(jié)構(gòu),以有序表有序表表示集合。例如例如:(2,3,3,5,6,6,6,8,12)對(duì)集合 b 而言, 值相同的數(shù)據(jù)元素必定相鄰;值相同的數(shù)據(jù)元素必定相鄰;對(duì)集合 a 而言, 數(shù)據(jù)元素依值從小至大的順序插入。數(shù)據(jù)元素依值從小至大的順序插入。因此,數(shù)據(jù)結(jié)構(gòu)改變了,數(shù)據(jù)結(jié)構(gòu)改變了, 解決問題的策略也相應(yīng)要改變。解決問題的策略也相應(yīng)要改變。void purge(list &la, list lb) initlist(la); la_len = listlength(la); lb_len =listlength(lb); / 求

13、線性表的長(zhǎng)度求線性表的長(zhǎng)度 for (i = 1; i = lb_len; i+) / purge getelem(lb, i, e); / 取取lb中第中第i個(gè)數(shù)據(jù)元素賦給個(gè)數(shù)據(jù)元素賦給 eif (listempty(la) | !equal (en, e) listinsert(la, +la_len, e); en = e; / la中不存在和中不存在和 e 相同的數(shù)據(jù)元素,則插入之相同的數(shù)據(jù)元素,則插入之 / la 和 lb 均非空,i = j = 1, k = 0 getelem(la, i, ai); getelem(lb, j, bj); if (ai = bj) / 將 ai

14、插入到 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_len) / 若 lb 不空initlist(lc); / 構(gòu)造

15、空的線性表 lci = j = 1; k = 0;la_len = listlength(la);lb_len = listlength(lb); while (i = la_len) / 當(dāng)la不空時(shí) getelem(la, i+, ai); listinsert(lc, +k, ai); / 插入插入 la 表中剩余元素表中剩余元素 while (j = lb_len) / 當(dāng)lb不空時(shí) getelem(lb, j+, bj); listinsert(lc, +k, bj); / 插入插入 lb 表中剩余元素表中剩余元素最簡(jiǎn)單的一種順序映象方法是:最簡(jiǎn)單的一種順序映象方法是: 令令 y y

16、 的存儲(chǔ)位置和的存儲(chǔ)位置和 x x 的存儲(chǔ)位置的存儲(chǔ)位置相鄰相鄰。順序映象順序映象 以以 x 的存儲(chǔ)位置和的存儲(chǔ)位置和 y 的存儲(chǔ)位置的存儲(chǔ)位置之間某種關(guān)系表示邏輯關(guān)系之間某種關(guān)系表示邏輯關(guān)系。 用一組地址連續(xù)地址連續(xù)的存儲(chǔ)單元 依次存放依次存放線性表中的數(shù)據(jù)元素 a1 a2 ai-1 ai an線性表的線性表的起始地址起始地址稱作線性表的基地址基地址以“存儲(chǔ)位置相鄰存儲(chǔ)位置相鄰”表示有序?qū)?即:loc(ai) = loc(ai-1) + c 一個(gè)數(shù)據(jù)元素所占存儲(chǔ)量一個(gè)數(shù)據(jù)元素所占存儲(chǔ)量所有數(shù)據(jù)元素的存儲(chǔ)位置均取決于所有數(shù)據(jù)元素的存儲(chǔ)位置均取決于 第一個(gè)數(shù)據(jù)元素的存儲(chǔ)位置第一個(gè)數(shù)據(jù)元素的存儲(chǔ)位

17、置 loc(ai) = loc(a1) + (i-1)c 基地址基地址順序映像的順序映像的 c 語(yǔ)言描述語(yǔ)言描述typedef struct sqlist; / 俗稱 順序表順序表#define list_init_size 80 / 線性表存儲(chǔ)空間的初始分配量#define listincrement 10 / 線性表存儲(chǔ)空間的分配增量elemtype *elem; / 存儲(chǔ)空間基址int length; / 當(dāng)前長(zhǎng)度int listsize; / 當(dāng)前分配的存儲(chǔ)容量 / (以sizeof(elemtype)為單位)線性表的基本操作在順序表中的實(shí)現(xiàn)線性表的基本操作在順序表中的實(shí)現(xiàn)initli

18、st(&l) / 結(jié)構(gòu)初始化結(jié)構(gòu)初始化locateelem(l, e, compare() / 查找查找listinsert(&l, i, e) / 插入元素插入元素listdelete(&l, i) / 刪除元素刪除元素status initlist_sq( sqlist& l ) / 構(gòu)造一個(gè)空的線性表 / initlist_sq算法時(shí)間復(fù)雜度時(shí)間復(fù)雜度:o(1)l.elem = (elemtype*) malloc (list_ init_size sizeof (elemtype);if (!l.elem) exit(overflow);l.length

19、 = 0;l.listsize = list_init_sizereturn ok;例如:順序表23 75 41 38 54 62 17l.eleml.lengthl.listsizee =38pppppi 1 2 3 4 1 850p可見,基本操作是:將順序表中的元素逐個(gè)和給定值 e 相比較。 int locateelem_sq(sqlist l, elemtype e, status (*compare)(elemtype, elemtype) / 在順序表中查詢第一個(gè)滿足判定條件的數(shù)據(jù)元素,在順序表中查詢第一個(gè)滿足判定條件的數(shù)據(jù)元素, / 若存在,則返回它的位序,否則返回若存在,則返回它

20、的位序,否則返回 0 0 / locateelem_sq o( listlength(l) )算法的算法的時(shí)間復(fù)雜度時(shí)間復(fù)雜度為:為:i = 1; / i i 的初值為第的初值為第 1 1 元素的位序元素的位序p = l.elem; / p p 的初值為第的初值為第 1 1 元素的存儲(chǔ)位置元素的存儲(chǔ)位置while (i = l.length & !(*compare)(*p+, e) +i;if (i = l.length) return i;else return 0;(*compare)( *p+, e)線性表操作 listinsert(&l, i, e)的實(shí)現(xiàn):首先分析首

21、先分析:插入元素時(shí),線性表的邏輯結(jié)構(gòu)邏輯結(jié)構(gòu)發(fā)生什么變化發(fā)生什么變化? (a1, , ai-1, ai, , an) 改變?yōu)?(a1, , ai-1, e, ai, , an)a1 a2 ai-1 ai ana1 a2 ai-1 ai ean, 表的長(zhǎng)度增加 status listinsert_sq(sqlist &l, int i, elemtype e) / 在順序表l的第 i 個(gè)元素之前插入新的元素e, / i 的合法范圍為 1il.length+1 / listinsert_sq 算法時(shí)間復(fù)雜度算法時(shí)間復(fù)雜度為為: :o( listlength(l) )q = &(l.

22、elemi-1); / q 指示插入位置for (p = &(l.eleml.length-1); p = q; -p) *(p+1) = *p; / 插入位置及之后的元素右移元素右移*q = e; / 插入e+l.length; / 表長(zhǎng)增1return ok;元素右移元素右移考慮移動(dòng)元素的平均情況考慮移動(dòng)元素的平均情況: : 假設(shè)在第 i 個(gè)元素之前插入的概率為 , 則在長(zhǎng)度為n 的線性表中插入一個(gè)元素所需插入一個(gè)元素所需移動(dòng)元素次數(shù)的期望值移動(dòng)元素次數(shù)的期望值為:ip11) 1(niiisinpe11) 1(11niisinne2n 若假定假定在線性表中任何一個(gè)位置上進(jìn)行插入插入

23、的概率的概率都是相等相等的,則移動(dòng)元素的期望值移動(dòng)元素的期望值為:if (l.length = l.listsize) / 當(dāng)前存儲(chǔ)空間已滿,增加分配 newbase = (elemtype *)realloc(l.elem, (l.listsize+listincrement)*sizeof (elemtype); if (!newbase) exit(overflow); / 存儲(chǔ)分配失敗 l.elem = newbase; / 新基址 l.listsize += listincrement; / 增加存儲(chǔ)容量if (i l.length+1) return error; / 插入位置不合

24、法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)的實(shí)現(xiàn):首先分析:刪除元素時(shí),線性表的邏輯結(jié)構(gòu)發(fā)生什么變化? (a1, , ai-1, ai, ai+1, , an) 改變?yōu)?(a1, , ai-1, ai+1, , an)ai+1

25、an, 表的長(zhǎng)度減少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; / 表長(zhǎng)減表長(zhǎng)減1 1return ok;算法時(shí)間復(fù)雜度算法時(shí)間復(fù)雜度為為: : o( listlength(l)p = &(l.elemi-1); / p 為被刪除元素的位置為被刪除元素的位置e = *p; / 被

26、刪除元素的值賦給被刪除元素的值賦給 eq = l.elem+l.length-1; / 表尾元素的位置表尾元素的位置if (i l.length) return error; / 刪除位置不合法刪除位置不合法元素左移元素左移考慮移動(dòng)元素的平均情況考慮移動(dòng)元素的平均情況: : 假設(shè)刪除第 i 個(gè)元素的概率為 , 則在長(zhǎng)度為n 的線性表中刪除一個(gè)元素所需移動(dòng)元素次數(shù)的期望值移動(dòng)元素次數(shù)的期望值為:iqniidlinqe1)(nidlinne1)(121n若假定在線性表中任何一個(gè)位置上進(jìn)行刪除的概率都是相等的,則移動(dòng)元素的期望值移動(dòng)元素的期望值為:21 18 30 75 42 56 8721 18

27、30 75l.length-10pppq8756p = &(l.elemi-1);q = l.elem+l.length-1;for (+p; p next; j = 1; / p p指向第一個(gè)結(jié)點(diǎn),指向第一個(gè)結(jié)點(diǎn),j j為計(jì)數(shù)器為計(jì)數(shù)器while (p & jnext; +j; / 順指針向后查找,直到順指針向后查找,直到 p p 指向第指向第 i i 個(gè)元素個(gè)元素 / 或或 p p 為空為空if ( !p | ji ) return error; / 第第 i i 個(gè)元素不存在個(gè)元素不存在e = p-data; / 取得第取得第 i i 個(gè)元素個(gè)元素return ok;ai

28、-1 線性表的操作 listinsert(&l, i, e) 在單鏈表中的實(shí)現(xiàn): 有序?qū)τ行驅(qū)?改變?yōu)楦淖優(yōu)?和和 eaiai-1 因此,在單鏈表中第因此,在單鏈表中第 i 個(gè)結(jié)點(diǎn)之前進(jìn)個(gè)結(jié)點(diǎn)之前進(jìn)行插入的基本操作為行插入的基本操作為: 找到線性表中第找到線性表中第i-1i-1個(gè)結(jié)點(diǎn),然后修改個(gè)結(jié)點(diǎn),然后修改其指向后繼的指針。其指向后繼的指針。 可見,在鏈表中插入結(jié)點(diǎn)只需要修改可見,在鏈表中插入結(jié)點(diǎn)只需要修改指針。但同時(shí),若要在第指針。但同時(shí),若要在第 i 個(gè)結(jié)點(diǎn)之前個(gè)結(jié)點(diǎn)之前插入元素,修改的是第插入元素,修改的是第 i-1 個(gè)結(jié)點(diǎn)的指?jìng)€(gè)結(jié)點(diǎn)的指針。針。 status listinse

29、rt_l(linklist l, int i, elemtype e) / l 為帶頭結(jié)點(diǎn)的單鏈表的頭指針,本算法為帶頭結(jié)點(diǎn)的單鏈表的頭指針,本算法 / 在鏈表中第在鏈表中第i 個(gè)結(jié)點(diǎn)之前插入新的元素個(gè)結(jié)點(diǎn)之前插入新的元素 e / linstinsert_l算法的算法的時(shí)間復(fù)雜度時(shí)間復(fù)雜度為:o(listlength(l)p = l; j = 0;while (p & j next; +j; / 尋找第尋找第 i-1 個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn)if (!p | j i-1) return error; / i 大于表長(zhǎng)或者小于大于表長(zhǎng)或者小于1 s = (linklist) malloc ( siz

30、eof (lnode); / 生成新結(jié)點(diǎn)s-data = e; s-next = p-next; p-next = s; / 插入return ok; eai-1aiai-1sp線性表的操作listdelete (&l, i, &e)在鏈表中的實(shí)現(xiàn):有序?qū)τ行驅(qū)?和和 改變?yōu)楦淖優(yōu)?ai-1aiai+1ai-1 在單鏈表中刪除第刪除第 i i 個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn)的基本基本操作操作為:找到線性表中第找到線性表中第i-1i-1個(gè)結(jié)點(diǎn),修個(gè)結(jié)點(diǎn),修改其指向后繼的指針。改其指向后繼的指針。ai-1aiai+1ai-1q = p-next; p-next = q-next; e = q-dat

31、a; free(q);pq status listdelete_l(linklist l, int i, elemtype &e) / 刪除以 l 為頭指針(帶頭結(jié)點(diǎn))的單鏈表中第 i 個(gè)結(jié)點(diǎn) / listdelete_l算法的算法的時(shí)間復(fù)雜度時(shí)間復(fù)雜度為: o(listlength(l)p = l; j = 0;while (p-next & j next; +j; / 尋找第 i 個(gè)結(jié)點(diǎn),并令 p 指向其前趨if (!(p-next) | j i-1) return error; / 刪除位置不合理q = p-next; p-next = q-next; / 刪除并釋放結(jié)點(diǎn)

32、e = q-data; free(q);return ok;操作 clearlist(&l) 在鏈表中的實(shí)現(xiàn):void clearlist(&l) / 將單鏈表重新置為一個(gè)空表 while (l-next) p=l-next; l-next=p-next; / clearlistfree(p);算法時(shí)間復(fù)雜度:o(listlength(l)如何從線性表得到單鏈表?如何從線性表得到單鏈表?鏈表是一個(gè)動(dòng)態(tài)的結(jié)構(gòu),它不需要鏈表是一個(gè)動(dòng)態(tài)的結(jié)構(gòu),它不需要予分配空間,因此予分配空間,因此生成鏈表的過程生成鏈表的過程是一個(gè)結(jié)點(diǎn)是一個(gè)結(jié)點(diǎn)“逐個(gè)插入逐個(gè)插入” ” 的過程。的過程。例如:逆位序

33、輸入例如:逆位序輸入 n n 個(gè)數(shù)據(jù)元素的值,個(gè)數(shù)據(jù)元素的值, 建立帶頭結(jié)點(diǎn)的單鏈表。建立帶頭結(jié)點(diǎn)的單鏈表。操作步驟:操作步驟:一、建立一個(gè)一、建立一個(gè)“空表空表”;二、輸入數(shù)據(jù)元素二、輸入數(shù)據(jù)元素an, 建立結(jié)點(diǎn)并插入;建立結(jié)點(diǎn)并插入;三、輸入數(shù)據(jù)元素三、輸入數(shù)據(jù)元素an-1, 建立結(jié)點(diǎn)并插入;建立結(jié)點(diǎn)并插入;ananan-1四、依次類推,直至輸入四、依次類推,直至輸入a a1 1為止。為止。void createlist_l(linklist &l, int n) / 逆序輸入 n 個(gè)數(shù)據(jù)元素,建立帶頭結(jié)點(diǎn)的單鏈表 / createlist_l算法的算法的時(shí)間復(fù)雜度時(shí)間復(fù)雜度為:o

34、(listlength(l)l = (linklist) malloc (sizeof (lnode);l-next = null; / 先建立一個(gè)帶頭結(jié)點(diǎn)的單鏈表for (i = n; i 0; -i) p = (linklist) malloc (sizeof (lnode); scanf(&p-data); / 輸入元素值 p-next = l-next; l-next = p; / 插入回顧回顧 2.1 節(jié)中三個(gè)例子的算法,節(jié)中三個(gè)例子的算法,看一下當(dāng)線性表分別以順序存看一下當(dāng)線性表分別以順序存儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)時(shí),儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)時(shí),它們的時(shí)間復(fù)雜度為多少?它們

35、的時(shí)間復(fù)雜度為多少?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控制結(jié)構(gòu):控制結(jié)構(gòu):基本操作:基本操作:for 循環(huán)循環(huán)getelem, locateelem 和 listinsert當(dāng)以順序映像實(shí)現(xiàn)抽象數(shù)據(jù)類型線性表時(shí)為: o( list

36、length(la)listlength(lb) ) 當(dāng)以鏈?zhǔn)接诚駥?shí)現(xiàn)抽象數(shù)據(jù)類型線性表時(shí)為: o( listlength(la)listlength(lb) )例例2-1算法時(shí)間復(fù)雜度算法時(shí)間復(fù)雜度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) | !equal (en, e) listinsert(la, +la_le

37、n, e); en = e; /for / purge控制結(jié)構(gòu):控制結(jié)構(gòu):基本操作:基本操作:for 循環(huán)getelem 和 listinsert當(dāng)以順序映像實(shí)現(xiàn)抽象數(shù)據(jù)類型線性表時(shí)為: o( listlength(lb) )當(dāng)以鏈?zhǔn)接诚駥?shí)現(xiàn)抽象數(shù)據(jù)類型線性表時(shí)為: o( listlength2(lb) )例例2-2算法時(shí)間復(fù)雜度算法時(shí)間復(fù)雜度void mergelist(list la, list lb, list &lc) initlist(lc); i = j = 1; k = 0; la_len = listlength(la); lb_len = listlength(lb)

38、; 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 ) / 若當(dāng)前指針及其后繼在鏈表中,則刪除線性鏈表l中當(dāng)前 / 指針?biāo)附Y(jié)點(diǎn)之后的結(jié)點(diǎn),并返回ok; 否則返回erro

39、r。 /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) (elemtype,elemtype) / 歸并有序表 la 和 lb

40、 ,生成新的有序表 lc, / 并在歸并之后銷毀la 和 lb, / compare 為指定的元素大小判定函數(shù) / mergelist_l例二例二if ( !initlist(lc) return error; / 存儲(chǔ)空間分配失敗while (!( a=maxc & b=maxc) / la 或或 lb 非空非空 locatepos (la, 0); locatepos (lb, 0); / 當(dāng)前指針指向頭結(jié)點(diǎn)當(dāng)前指針指向頭結(jié)點(diǎn)if ( delafter( la, e) a = e; / 取得取得 la 表中第一個(gè)元素表中第一個(gè)元素 aelse a = maxc; / maxc為常量

41、最大值if ( delafter( lb, e) b = e; / 取得取得 lb 表中第一個(gè)元素表中第一個(gè)元素 belse b = maxc; / a 和和 b 為兩表中當(dāng)前比較元素為兩表中當(dāng)前比較元素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-next = p-next-next;p-next-prio

42、r = p;pai-1六、有序表類型六、有序表類型adt ordered_list 數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象: s = xi|xi orderedset , i=1,2,n, n0 集合中任意兩個(gè)元素之間均可以進(jìn)行比較數(shù)據(jù)關(guān)系數(shù)據(jù)關(guān)系: :r = | xi-1, xi s, xi-1 xi, i=2,3,n 回顧例回顧例2-2的兩個(gè)算法的兩個(gè)算法 locateelem( l, e, &q, int(*compare)(elemtype,elemtype) )初始條件初始條件:有序表l已存在。操作結(jié)果操作結(jié)果:若有序表l中存在元素e,則 q指示l中第一個(gè)值為第一個(gè)值為 e 的元素的元素的位置,并

43、返回函數(shù)值true;否則 q 指示第一個(gè)大第一個(gè)大于于 e 的元素的前驅(qū)的元素的前驅(qū)的位置,并返回函數(shù)值false。 基本操作:基本操作: compare是一個(gè)是一個(gè)有序判定函數(shù)有序判定函數(shù)( 12, 23, 34, 45, 56, 67, 78, 89, 98, 45 )例如例如:若若 e = 45, 則則 q 指向指向 若若 e = 88, 則則 q 指向指向表示值為表示值為 88 的元素應(yīng)插入的元素應(yīng)插入在該指針?biāo)附Y(jié)點(diǎn)之后。在該指針?biāo)附Y(jié)點(diǎn)之后。void union(list &la, list lb) / lb 為線性表 initlist(la); / 構(gòu)造(空的)線性表la

44、 la_len=listlength(la); lb_len=listlength(lb); for (i = 1; i = lb_len; i+) getelem(lb, i, e); / 取取lb中第中第 i 個(gè)數(shù)據(jù)元素賦給個(gè)數(shù)據(jù)元素賦給 e if (!locateelem(la, e, equal( ) ) listinsert(la, +la_len, e); / la中不存在和中不存在和 e 相同的數(shù)據(jù)元素,則插入之相同的數(shù)據(jù)元素,則插入之 / union算法時(shí)間復(fù)雜度:算法時(shí)間復(fù)雜度:o(n2)void purge(list &la, list lb) / lb為有序表 i

45、nitlist(la); la_len = listlength(la); lb_len =listlength(lb); / 求線性表的長(zhǎng)度求線性表的長(zhǎng)度 for (i = 1; i = lb_len; i+) / purge getelem(lb, i, e); / 取取lb中第中第i個(gè)數(shù)據(jù)元素賦給個(gè)數(shù)據(jù)元素賦給 eif (listempty(la) | !equal (en, e) listinsert(la, +la_len, e); en = e; / la中不存在和中不存在和 e 相同的數(shù)據(jù)元素,則插入之相同的數(shù)據(jù)元素,則插入之算法時(shí)間復(fù)雜度:算法時(shí)間復(fù)雜度:o(n)nnnxpxp

46、xppxp.)(2210在計(jì)算機(jī)中,可以用一個(gè)線性表來表示在計(jì)算機(jī)中,可以用一個(gè)線性表來表示: p = (p0, p1, ,pn)一元多項(xiàng)式一元多項(xiàng)式但是對(duì)于形如但是對(duì)于形如 s(x) = 1 + 3x10000 2x20000的多項(xiàng)式,上述表示方法是否合適?的多項(xiàng)式,上述表示方法是否合適? 一般情況下的一元稀疏多項(xiàng)式一元稀疏多項(xiàng)式可寫成 pn(x) = p1xe1 + p2xe2 + + pmxem其中其中:pi 是指數(shù)為ei 的項(xiàng)的非零系數(shù), 0 e1 e2 em = n可以下列線性表表示:(p1, e1), (p2, e2), , (pm,em) ) p999(x) = 7x3 - 2x

47、12 - 8x999例如例如:可用線性表 ( (7, 3), (-2, 12), (-8, 999) )表示adt polynomial 數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象: 數(shù)據(jù)關(guān)系數(shù)據(jù)關(guān)系:抽象數(shù)據(jù)類型一元多項(xiàng)式的定義如下:d ai | ai termset, i=1,2,.,m, m0 termset 中的每個(gè)元素包含一個(gè)每個(gè)元素包含一個(gè) 表示系數(shù)的實(shí)數(shù)和表示指數(shù)的整數(shù)表示系數(shù)的實(shí)數(shù)和表示指數(shù)的整數(shù) r1 |ai-1 ,aid, i=2,.,n 且ai-1中的指數(shù)值中的指數(shù)值ai中的指數(shù)值中的指數(shù)值 creatpolyn ( &p, m ) destroypolyn ( &p ) prin

48、tpolyn ( &p ) 基本操作基本操作:操作結(jié)果操作結(jié)果:輸入 m 項(xiàng)的系數(shù)和指數(shù), 建立一元多項(xiàng)式 p。初始條件初始條件:一元多項(xiàng)式 p 已存在。操作結(jié)果操作結(jié)果:銷毀一元多項(xiàng)式 p。初始條件初始條件:一元多項(xiàng)式 p 已存在。操作結(jié)果操作結(jié)果:打印輸出一元多項(xiàng)式 p。 polynlength( p ) addpolyn ( &pa, &pb ) subtractpolyn ( &pa, &pb ) adt polynomial初始條件初始條件:一元多項(xiàng)式 p 已存在。操作結(jié)果操作結(jié)果:返回一元多項(xiàng)式 p 中的項(xiàng)數(shù)。初始條件初始條件:一元多項(xiàng)式 pa 和 pb 已存在。操作結(jié)果操作結(jié)果:完成多項(xiàng)式相加運(yùn)算,即: pa = papb,并銷毀一元多項(xiàng)式 pb。一元多項(xiàng)式的實(shí)現(xiàn):一元多項(xiàng)式的實(shí)現(xiàn):typedef struct / 項(xiàng)項(xiàng)的表示 float coef; / 系數(shù)系數(shù) int expn; / 指數(shù)指數(shù) term, elemtype; typedef orderedlinklist polynomial; / 用帶表頭結(jié)點(diǎn)的有序鏈表表示多項(xiàng)式用帶表頭結(jié)點(diǎn)的有序鏈表表示多項(xiàng)式結(jié)點(diǎn)的數(shù)據(jù)元素類型定義為:status creat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論