數(shù)據(jù)結(jié)構(gòu)線性表PPTPPT課件.ppt
《數(shù)據(jù)結(jié)構(gòu)線性表PPTPPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)線性表PPTPPT課件.ppt(109頁珍藏版)》請在匯文網(wǎng)上搜索。
1、第2章 線性表 2.1 線性表的基本概念 2.2 線性表的順序存儲2.3 線性表的鏈?zhǔn)酱鎯?.4 線性表的應(yīng)用 本章小結(jié) 2.5 有序表 12.1 線性表的基本概念 2.1.1 線性表的定義2.1.2 線性表的運(yùn)算22.1.1 線性表的定義 線性表是具有相同特性的數(shù)據(jù)元素的一個有限序列。該序列中所含元素的個數(shù)叫做線性表的長度,用n表示,n0。當(dāng)n=0時,表示線性表是一個空表,即表中不包含任何元素。設(shè)序列中第i(i表示位序)個元素為ai(1in)。線性表的一般表示為:(a1,a2,ai,ai+1,an)3 其中a1為第一個元素,又稱做表頭元素,a2為第二個元素,an為最后一個元素,又稱做表尾元素
2、。例如,在線性表 (1,4,3,2,8,10)中,1為表頭元素,10為表尾元素。42.1.2 線性表的運(yùn)算 線性表的基本運(yùn)算如下:(1)初始化線性表InitList(&L):構(gòu)造一個空的線性表L。(2)銷毀線性表DestroyList(&L):釋放線性表L占用的內(nèi)存空間。5 (3)判線性表是否為空表ListEmpty(L):若L為空表,則返回真,否則返回假。(4)求線性表的長度ListLength(L):返回L中元素個數(shù)。(5)輸出線性表DispList(L):當(dāng)線性表L不為空時,順序顯示L中各結(jié)點的值域。(6)求線性表L中指定位置的某個數(shù)據(jù)元素GetElem(L,i,&e):用e返回L中第
3、i(1iListLength(L)個元素的值。6 (7)定位查找LocateElem(L,e):返回L中第1個值域與e相等的位序。若這樣的元素不存在,則返回值為0。(8)插入數(shù)據(jù)元素ListInsert(&L,i,e):在L的第i(1iListLength(L)+1)個元素之前插入新的元素e,L的長度增1。(9)刪除數(shù)據(jù)元素ListDelete(&L,i,&e):刪除L的第i(1iListLength(L)個元素,并用e返回其值,L的長度減1。7 例2.1 假設(shè)有兩個集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,即線性表中的數(shù)據(jù)元素即為集合中的成員。編寫一個算法求一個新的集合C=A
4、B,即將兩個集合的并集放在線性表LC中。解:本算法思想是:先初始化線性表LC,將LA的所有元素復(fù)制到LC中,然后掃描線性表LB,若LB的當(dāng)前元素不在線性表LA中,則將其插入到LC中。算法如下:8void unionList(List LA,List LB,List&LC)int lena,lenc,i;ElemType e;InitList(LC);for(i=1;i=ListLength(LA);i+)/*將LA的所有元素插入到Lc中*/GetElem(LA,i,e);ListInsert(LC,i,e);lena=ListLength(LA);/*求線性表的長度*/lenB=ListLen
5、gth(LB);9for(i=1;i=lenb;i+)GetElem(LB,i,e);/*取LB中第i個數(shù)據(jù)元素賦給e*/if (!LocateElem(LA,e)ListInsert(LC,+lenc,e);/*LA中不存在和e相同者,則插入到LC中*/10 由于LocateElem(LA,e)運(yùn)算的時間復(fù)雜度為O(ListLength(LA),所以本算法的時間復(fù)雜度為:O(ListLength(LA)*ListLength(LB)。112.2 線性表的順序存儲2.2.1 線性表的順序存儲順序表2.2.2 順序表基本運(yùn)算的實現(xiàn)122.2.1 線性表的順序存儲順序表 線性表的順序存儲結(jié)構(gòu)就是:
6、把線性表中的所有元素按照其邏輯順序依次存儲到從計算機(jī)存儲器中指定存儲位置開始的一塊連續(xù)的存儲空間中。這樣,線性表中第一個元素的存儲位置就是指定的存儲位置,第i+1個元素(1in-1)的存儲位置緊接在第i個元素的存儲位置的后面。線性表 邏輯結(jié)構(gòu)順序表 存儲結(jié)構(gòu)13 假定線性表的元素類型為ElemType,則每個元素所占用存儲空間大小(即字節(jié)數(shù))為sizeof(ElemType),整個線性表所占用存儲空間的大小為:n*sizeof(ElemType)其中,n表示線性表的長度。14順序表示意圖15 在定義一個線性表的順序存儲類型時,需要定義一個數(shù)組來存儲線線表中的所有元素和定義一個整型變量來存儲線性
7、表的長度。假定數(shù)組用dataMaxSize表示,長度整型變量用length表示,并采用結(jié)構(gòu)體類型表示,則元素類型為通用類型標(biāo)識符ElemType的線性表的順序存儲類型可描述如下:16 typedef struct ElemType dataMaxSize;int length;SqList;/*順序表類型*/其中,data成員存放元素,length成員存放線性表的實際長度。說明:由于C/C+中數(shù)組的下標(biāo)從0開始,線性表的第i個元素ai存放順序表的第i-1位置上。為了清楚,將ai在邏輯序列中的位置稱為邏輯位序,在順序表中的位置稱為物理位序。172.2.2 順序表基本運(yùn)算的實現(xiàn) 一旦采用順序表存儲
8、結(jié)構(gòu),我們就可以用C/C+語言實現(xiàn)線性表的各種基本運(yùn)算。為了方便,假設(shè)ElemType為char類型,使用如下自定義類型語句:typedef char ElemType;181.建立順序表其方法是將給定的含有n個元素的數(shù)組的每個元素依次放入到順序表中,并將n賦給順序表的長度成員。算法如下:void CreateList(SqList*&L,ElemType a,int n)/*建立順序表*/int i;L=(SqList*)malloc(sizeof(SqList);for(i=0;idatai=ai;L-length=n;192.順序表基本運(yùn)算算法(1)初始化線性表InitList(L)該運(yùn)
9、算的結(jié)果是構(gòu)造一個空的線性表L。實際上只需將length成員設(shè)置為0即可。void InitList(SqList*&L)/引用型指針 L=(SqList*)malloc(sizeof(SqList);/*分配存放線性表的空間*/L-length=0;本算法的時間復(fù)雜度為O(1)。順序表L20 (2)銷毀線性表DestroyList(L)該運(yùn)算的結(jié)果是釋放線性表L占用的內(nèi)存空間。void DestroyList(SqList*&L)free(L);本算法的時間復(fù)雜度為O(1)。21 (3)判定是否為空表ListEmpty(L)該運(yùn)算返回一個值表示L是否為空表。若L為空表,則返回1,否則返回0。
10、int ListEmpty(SqList*L)return(L-length=0);本算法的時間復(fù)雜度為O(1)。22 (4)求線性表的長度ListLength(L)該運(yùn)算返回順序表L的長度。實際上只需返回length成員的值即可。int ListLength(SqList*L)return(L-length);本算法的時間復(fù)雜度為O(1)。23 (5)輸出線性表DispList(L)該運(yùn)算當(dāng)線性表L不為空時,順序顯示L中各元素的值。void DispList(SqList*L)int i;if(ListEmpty(L)return;for(i=0;ilength;i+)printf(%c,L
11、-datai);printf(n);24 本算法中基本運(yùn)算為for循環(huán)中的printf語句,故時間復(fù)雜度為:O(L-length)或O(n)25 (6)求某個數(shù)據(jù)元素值GetElem(L,i,e)該運(yùn)算返回L中第 i(1iListLength(L)個元素的值,存放在e中。int GetElem(SqList*L,int i,ElemType&e)if(iL-length)return 0;e=L-datai-1;return 1;本算法的時間復(fù)雜度為O(1)。26 (7)按元素值查找LocateElem(L,e)該運(yùn)算順序查找第1個值域與e相等的元素的位序。若這樣的元素不存在,則返回值為0。i
12、nt LocateElem(SqList*L,ElemType e)int i=0;while(ilength&L-datai!=e)i+;if(i=L-length)return 0;else return i+1;27 本算法中基本運(yùn)算為while循環(huán)中的i+語句,故時間復(fù)雜度為:O(L-length)或O(n)28 (8)插入數(shù)據(jù)元素ListInsert(L,i,e)該 運(yùn) 算 在 順 序 表 L的 第 i個 位 置(1iListLength(L)+1)上插入新的元素e。思路:如果i值不正確,則顯示相應(yīng)錯誤信息;否則將順序表原來第i個元素及以后元素均后移一個位置,騰出一個空位置插入新元素
13、,順序表長度增1。29 int ListInsert(SqList*&L,int i,ElemType e)int j;if(iL-length+1)return 0;i-;/*將順序表邏輯位序轉(zhuǎn)化為elem下標(biāo)即物理位序*/for(j=L-length;ji;j-)L-dataj=L-dataj-1;/*將datai及后面元素后移一個位置*/L-datai=e;L-length+;/*順序表長度增1*/return 1;a0ai-1aian-1邏輯位序1 i i+1 n MaxSize 30 對于本算法來說,元素移動的次數(shù)不僅與表長L.length=n有關(guān),而且與插入位置i有關(guān):當(dāng)i=n+1
14、時,移動次數(shù)為0;當(dāng)i=1時,移動次數(shù)為n,達(dá)到最大值。在線性表sq中共有n+1個可以插入元素的地方。假設(shè)pi(=)是在第i個位置上插入一個元素的概率,則在長度為n的線性表中插入一個元素時所需移動元素的平均次數(shù)為:因此插入算法的平均時間復(fù)雜度為O(n)。31 (9)刪除數(shù)據(jù)元素ListDelete(L,i,e)刪除順序表L中的第i(1iListLength(L)個元素。思路:如果i值不正確,則顯示相應(yīng)錯誤信息;否則將線性表第i個元素以后元素均向前移動一個位置,這樣覆蓋了原來的第i個元素,達(dá)到刪除該元素的目的,最后順序表長度減1。32int ListDelete(SqList*&L,int i,
15、ElemType&e)int j;if(iL-length)return 0;i-;/*將順序表邏輯位序轉(zhuǎn)化為elem下標(biāo)即物理位序*/e=L-datai;for(j=i;jlength-1;j+)L-dataj=L-dataj+1;/*將datai之后的元素后前移一個位置*/L-length-;/*順序表長度減1*/return 1;a0ai-1aian-1邏輯位序1 i i+1 n MaxSize 33 對于本算法來說,元素移動的次數(shù)也與表長n和刪除元素的位置i有關(guān):當(dāng)i=n時,移動次數(shù)為0;當(dāng)i=1時,移動次數(shù)為n-1。在線性表sq中共有n個元素可以被刪除。假設(shè)pi(pi=)是刪除第i個
16、位置上元素的概率,則在長度為n的線性表中刪除一個元素時所需移動元素的平均次數(shù)為:=因此刪除算法的平均時間復(fù)雜度為O(n)。34 例2.2 設(shè)計一個算法,將x插入到一個有序(從小到大排序)的線性表(順序存儲結(jié)構(gòu)即順序表)的適當(dāng)位置上,并保持線性表的有序性。解:先通過比較在順序表L中找到存放x的位置i,然后將x插入到L.datai中,最后將順序表的長度增1。35 void Insert(SqList*&L,ElemType x)int i=0,j;while(ilength&L-datailength-1;j=i;j-)L-dataj+1=L-dataj;L-datai=x;L-length+;查
- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
24.9 積分
下載 | 加入VIP,下載共享資源 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 數(shù)據(jù)結(jié)構(gòu) 線性 PPTPPT 課件