版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第二章 線性表,線性表是最簡單常用的數(shù)據(jù)結(jié)構(gòu),順序存儲(chǔ)結(jié)構(gòu) 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)也是應(yīng)用中最常用的存儲(chǔ)方法,這一部分內(nèi)容和方法掌握了,有助于理解和掌握后續(xù)章節(jié)的內(nèi)容,如棧隊(duì)列串是特殊的線性表,數(shù)組和廣義表是線性表的擴(kuò)展;有助于理解和掌握樹和圖等復(fù)雜的數(shù)據(jù)結(jié)構(gòu) 存儲(chǔ)結(jié)構(gòu)和圖等復(fù)雜結(jié)構(gòu)的操作算法,因?yàn)闃浜蛨D的存儲(chǔ)結(jié)構(gòu)大多或是這兩種存儲(chǔ)結(jié)構(gòu)的擴(kuò)充,或是它們的組合,因此這一章的內(nèi)容非常重要,同學(xué)們要很好地學(xué)習(xí)理解和掌握。,第二章 線性表,第二章 線性表 2.1 線性表概念及基本操作 2.2 線性表的順序存儲(chǔ)和實(shí)現(xiàn) 2.3 線性表的鏈?zhǔn)酱鎯?chǔ)和實(shí)現(xiàn) 2.3.1 線性鏈表 2.3.2 循環(huán)鏈表 2.3.3 雙向鏈表
2、 2.4 一元多項(xiàng)式的表示及相加,第二章 線性表,在本課程介紹的幾種數(shù)據(jù)結(jié)構(gòu)中,線性表是最常簡單的,也是最常用的數(shù)據(jù)結(jié)構(gòu),線性表在實(shí)際應(yīng)用大量使用,并不是一個(gè)陌生的概念。,線性表是n 個(gè)類型相同數(shù)據(jù)元素的有限序列, 通常記作(a1, a2, a3, , an )。,2. 1 線性表的類型定義,例1、數(shù)學(xué)中的數(shù)列(11,13,15,17,19,21) 例2、英文字母表(A, B, C, D, E Z )。 例3、某單位的電話號(hào)碼簿。,一 線性表的邏輯結(jié)構(gòu),2.1 線性表的類型定義,說明:設(shè) A=(a1, a2, . , ai -1, ai , ai+1, , an )是一線性表 1) 線性表的數(shù)
3、據(jù)元素可以是各種各樣的,但同一線性表中的元素必須 是同一類型的; 2) 在表中 ai-1 領(lǐng)先于ai ,ai 領(lǐng)先于ai+1 ,稱ai-1 是ai 的直接前驅(qū),ai+1 是 ai 的直接后繼; 3) 在線性表中,除第一個(gè)元素和最后一個(gè)元素之外,其他元素都有且僅有一個(gè)直接前驅(qū),有且僅有一個(gè)直接后繼,具有這種結(jié)構(gòu)特征的數(shù)據(jù)結(jié)構(gòu)稱為線性結(jié)構(gòu)。線性表是一種線性數(shù)據(jù)結(jié)構(gòu); 4) 線性表中元素的個(gè)數(shù)n 稱為線性表的長度,n=0 時(shí)稱為空表; 5) ai是線性表的第i 個(gè)元素,稱i 為數(shù)據(jù)元素ai 的序號(hào),每一個(gè)元素在線性表中的位置,僅取決于它的序號(hào);,2.1 線性表的類型定義,線性表的其他表示方式 二元組
4、表示 L= ,其中D= a1,a2, a3, . an S= R R=, , 圖示表示,頂點(diǎn):表示數(shù)據(jù) 邊:表示是數(shù)據(jù)間的順序結(jié)構(gòu)關(guān)系,2.1 線性表的類型定義,ADT List 數(shù)據(jù)對(duì)象: D=ai| ai ElemSet i=1,2,3.,n, n 0 數(shù)據(jù)關(guān)系: R1=| ai-1,aiD, i=1,2,3.,n, n 0 基本操作: 初始化操作: InitList( 返回空表: ListEmpty(L), 若L為空表,返回TRUE,否則FALSE 元素計(jì)數(shù): ListLength(L),返回L中元素個(gè)數(shù) 返回位序: LocateElem(L,e, compare( ) ,返回L中第1個(gè)
5、與e滿足compare( )的數(shù)據(jù)元素的位序.若這樣的數(shù)據(jù)元素不存在,返回0 GetElem(L, i , ,2.2 線性表的順序存儲(chǔ)和實(shí)現(xiàn),順序表的類型定義 #define LIST_INIT_SIZE 100 / 線性表存儲(chǔ)空間的初始分配量 #define LISTINCREMENT 10 / 線性表存儲(chǔ)空間的分配增量 typedef struct ElemType * elem; /線性表存儲(chǔ)空間基址 int length; /當(dāng)前線性表長度 int listsize; /當(dāng)前分配的線性表存儲(chǔ)空間大小 /(以sizeof(ElemType)為單位) SqList;,SqList :類型名
6、, SqList類型的變量是結(jié)構(gòu)變量,它的三個(gè)域分別是: *elem:存放線性表元素的一維數(shù)組基址;其存儲(chǔ)空間在初始化操作(建空表)時(shí)動(dòng)態(tài)分配; length:存放線性表的表長; listsize:用于存放當(dāng)前分配(存放線性表元素)的存儲(chǔ)空間的大小。,2.2 線性表的順序存儲(chǔ)和實(shí)現(xiàn),存放線性表元素 的一維數(shù)組,設(shè) A = (a1,a2 , a3 , . an )是一線性表,L是SqList 類型的結(jié)構(gòu)變量,用于存放線性表A,則L在內(nèi)存中的狀態(tài)如圖所示:,順序表通過 元素的存儲(chǔ)順序 反映線性表元素間的邏輯關(guān)系,2.2 線性表的順序存儲(chǔ)和實(shí)現(xiàn),二、順序表的基本操作算法 插入 insert(v, x
7、, i) 功能:在順序表v 中的第 i ( 1link=NULL; p-link=q;p=q; return(head); ,插入結(jié)點(diǎn),q=(NODE *)malloc(sizeof(NODE); q-data=a; q-link=p-link; p-link=q;,head,y,x,p,head,3 插入操作 Insert_link(NODE *head, int x, int i) 功能:在線性鏈表的第i個(gè)元素結(jié)點(diǎn)之前插入一個(gè)新元素結(jié)點(diǎn)x; 插入操作圖示:,2. 3. 1 線性鏈表,插入前,插入后,head,head,2. 3. 1 線性鏈表,插入操作主要步驟: 1)查找鏈表L的第 i-1
8、個(gè)元素結(jié)點(diǎn); 2)為新元素建立結(jié)點(diǎn); 3)修改第 i-1個(gè)元素結(jié)點(diǎn)的指針和新元素結(jié)點(diǎn)指針完成插入;,Int insert_link(NODE *head,int x, int i) NODE *p,*s;int j; p=head;j=0; while (p!=NULL) ,刪除結(jié)點(diǎn),q=p-link; p-link=q-link; free(q);,head,y,x,q,head,p,p,2. 3. 1 線性鏈表,刪除操作主要步驟: 1)查找鏈表的第 i-1個(gè)元素結(jié)點(diǎn),使指針p指向它, 將指針q指向第i個(gè)結(jié)點(diǎn); 2)修改第 i-1個(gè)元素結(jié)點(diǎn)指針,使其指向第i個(gè)元素結(jié)點(diǎn)的后繼; 3) 回收q指
9、針?biāo)傅牡趇個(gè)結(jié)點(diǎn)空間;,2. 3. 1 線性鏈表,刪除前,刪除后,p,p,q,q,在線性鏈表中刪除第i個(gè)結(jié)點(diǎn) Int delete_link(NODE *head, int i) NODE *p,*q;int j; p=head;j=0; while (p!=NULL) ,2.3.1 線性鏈表,三 線性鏈表的其他操作的實(shí)現(xiàn),例:將兩個(gè)遞增有序線性鏈表歸并成一個(gè)遞減有序表。 設(shè)線性表A、B分別用頭指針為head_a 、 head_b 的兩個(gè)帶頭結(jié)點(diǎn)的線性鏈表存儲(chǔ), 歸并后的遞減有序表頭指針為head, 將兩表數(shù)據(jù)較小的結(jié)點(diǎn)依次取出插入到新表,利用基本操作 直接對(duì)鏈表進(jìn)行操作,2.3.1 線性鏈
10、表,線性鏈表歸并操作圖示,7,3,n,9,5,2,n,7,head_a,head_b,7,9,head,3,8,5,NODE * merge_link( NODE *head_a, NODE *head_b) NODE *p, *q, *head; head=(NODE *)malloc(sizeof (NODE); head-link=NULL; p=head_a-link; q=head_b-link; while(p!=NULL) ,while(p!=NULL) head_a-link=p-link;p-link=head-link; head-link=p; p=head_a-link
11、; while(q!=NULL) head_b-link=q-link;q-link=head-link; head-link=q; q=head_b-link; free(head_a); free(head_b); return(head); ,2. 3. 1 線性鏈表小結(jié),線性鏈表是線性表的一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),線性鏈表的特點(diǎn) 1 通過保存直接后繼元素的存儲(chǔ)位置來表示 數(shù)據(jù)元素之間的邏輯關(guān)系; 2 插入刪除操作通過修改結(jié)點(diǎn)的指針實(shí)現(xiàn); 3 不能隨機(jī)存取元素;,1 循環(huán)鏈表的概念 循環(huán)鏈表是線性表的另一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),它的特點(diǎn)是將線性鏈表的最后一個(gè)結(jié)點(diǎn)的指針指向鏈表的第一個(gè)結(jié)點(diǎn) 2 循環(huán)鏈表圖
12、示,2. 3.2 單向循環(huán)鏈表,(a)非空表 (b)空表,2. 3.2 單向 循環(huán)鏈表,說明 在解決某些實(shí)際問題時(shí)循環(huán)鏈表可能要比線性鏈表方便些。如將一個(gè)鏈表鏈在另一個(gè)鏈表的后面; 循環(huán)鏈表與線性鏈表操作的主要差別是算法中循環(huán)結(jié)束的條件不是p或p-link是否為NULL,而是它們是否等于首指針; 對(duì)循環(huán)鏈表,有時(shí)不給出頭指針,而是給出尾指針,a,a1,an,給出尾指針的循環(huán)鏈表,2. 3.2 單向 循環(huán)鏈表,b,a,a1,an,b1,bn,q,q,p,p,p=a-link; q=b-link; a-link=q-link; b-link=p; free(q);,約瑟夫回環(huán)問題 Void lea
13、d (NODE * head, int m) NODE *p, *q; int i; p=head; q=NULL; i=1; while(p-link!=p) while(ilink!=p) i+; q=p; p=p-link; if (p-link!=p) i=1; printf( “%d”, p-data); q-link=p-link; q=p; p=p-link; free(q); else printf(“%d”, p-data); ,1 雙向鏈表的概念,2. 3.3 雙向鏈表,(a)結(jié)點(diǎn)圖示,存儲(chǔ)數(shù)據(jù)元素,存儲(chǔ)后繼結(jié)點(diǎn) 的地址,存儲(chǔ)前趨結(jié)點(diǎn) 的地址,雙向鏈表中,每個(gè)結(jié)點(diǎn)有兩個(gè)指針
14、域,一個(gè)指向直接后繼元素結(jié)點(diǎn),另一個(gè)指向直接前趨元素結(jié)點(diǎn)。,2. 3.3 雙向鏈表,2 雙向鏈表圖示,head,Struct node int data struct node * llink, *rlink; ,在雙向鏈表中刪除結(jié)點(diǎn)時(shí)指針變化情況,在雙向鏈表中插入一個(gè)結(jié)點(diǎn)時(shí)指針的變化情況,p,p,2. 3.3 雙向鏈表,3、雙向鏈表的基本操作算法,2. 3.3 雙向鏈表,1)插入操作算法 (在p 所指結(jié)點(diǎn)之后插入q 結(jié)點(diǎn)的過程 ) q=(NODE *)malloc(sizeof (NODE); q-data=x; q-rlink=p-rlink; q-llink=p; p-rlink=q;
15、(q-rlink)-llink=q;,2. 3.3 雙向鏈表,2)刪除操作算法 (p-llink)-rlink=p-rlink; (p-rlink)-llink=p-llink; free(p);,2. 4 一元多項(xiàng)式的表示及相加,計(jì)算機(jī) 領(lǐng)域: P= (p0, p1, p2 , pn) Q= (q0, q1, q2, qm) R= (p0+q0, p1+q1, , pm+qm, pm+1, , pn ),P (x) = p0 + p1 x + p2 x2 + + pn xn Q (x) = q0 + q1 x + q2 x2+ + qm xm 不失一般性,設(shè)mindex index : p
16、所指結(jié)點(diǎn)應(yīng)為和多項(xiàng)式中的結(jié)點(diǎn) p-index = q-index :將p所指結(jié)點(diǎn)的系數(shù)“加”到q所指結(jié) 點(diǎn)的系數(shù)上相加; p-index q-index : 從表bh中刪除q 所指結(jié)點(diǎn),并將其 插入到ah表p所指結(jié)點(diǎn)之前;,一元多項(xiàng)式的相加算法(算法2.8),void polyadd(NODE *ah, NODE * bh) NODE *pre_p, *p, *q, *temp; char comp; pre_p=ah; p=ah-next; q=bh-next; while (p!=NULL) break; case =: /兩者的指數(shù)值相等 p-coef+=q-coef ; if (p-c
17、oef =0. 0) / 合并后系數(shù)為0 pre_p-next=p-next; free(p); else pre_p=p; p=pre_p-next; temp=q; q=q-next; free(temp); break; case : /多項(xiàng)式A中當(dāng)前結(jié)點(diǎn)的指數(shù)值大 temp=q-next; q-next=p; pre_p-next=q; pre_p=q; q=temp; ,續(xù),if (q!=NULL) pre_p-next=q; free(bh); char compare ( int n1, int n2 ) if (n1); ,第二章 線性表小結(jié),本章學(xué)習(xí)了線性表的順序存儲(chǔ)結(jié)構(gòu)順序表,鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),線性鏈表,循環(huán)鏈表, 雙向鏈表,以及在這兩種存儲(chǔ)結(jié)構(gòu)下如何實(shí)現(xiàn)線性表的基本操作。這里再一次需要強(qiáng)調(diào):本課程不僅要從概念和方法上了解每一種數(shù)據(jù)結(jié)構(gòu)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 妊娠期合并精神疾病的管理策略
- 妊娠ITP精準(zhǔn)醫(yī)療策略探索
- 天然高分子降解產(chǎn)物對(duì)神經(jīng)再生的促進(jìn)策略
- 大數(shù)據(jù)驅(qū)動(dòng)的社區(qū)慢病高危人群動(dòng)態(tài)管理
- 科學(xué)考試真題及答案
- 多重耐藥菌所致慢性氣道感染的抗菌降階梯策略
- 多語言O(shè)SCE考核術(shù)語的本地化策略
- 招工平臺(tái)考試模板及答案
- 2025年高職物業(yè)管理(物業(yè)管理法規(guī))試題及答案
- 2025年高職藏醫(yī)學(xué)(藏藥應(yīng)用)試題及答案
- 2026年共青團(tuán)中央所屬單位高校畢業(yè)生公開招聘66人備考題庫及參考答案詳解
- 2026年6級(jí)英語模擬真題及答案
- 2025內(nèi)蒙古鄂爾多斯市委政法委所屬事業(yè)單位引進(jìn)高層次人才3人考試題庫含答案解析(奪冠)
- 2025年全國單獨(dú)招生考試綜合試卷(附答案) 完整版2025
- 2025-2026學(xué)年外研版八年級(jí)上冊(cè)英語期末模擬考試題(含答案)
- 洗衣液宣傳課件
- “五個(gè)帶頭”方面對(duì)照發(fā)言材料二
- 在線網(wǎng)課學(xué)習(xí)課堂《人工智能(北理 )》單元測試考核答案
- RB/T 218-2017檢驗(yàn)檢測機(jī)構(gòu)資質(zhì)認(rèn)定能力評(píng)價(jià)機(jī)動(dòng)車檢驗(yàn)機(jī)構(gòu)要求
- GB/T 24128-2009塑料防霉性能試驗(yàn)方法
- GB/T 14689-2008技術(shù)制圖圖紙幅面和格式
評(píng)論
0/150
提交評(píng)論