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

下載本文檔

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

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)本演示文稿可能包含觀眾討論和即席反應(yīng)。使用PowerPoint可以跟蹤演示時(shí)的即席反應(yīng),在幻燈片放映中,右鍵單擊鼠標(biāo)請(qǐng)選擇“會(huì)議記錄”選擇“即席反應(yīng)”選項(xiàng)卡必要時(shí)輸入即席反應(yīng)單擊“確定”撤消此框此動(dòng)作將自動(dòng)在演示文稿末尾創(chuàng)建一張即席反應(yīng)幻燈片,包括您的觀點(diǎn)。

6/15/20231數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第1頁(yè)。第2章

線性表

2.1線性表的概念及運(yùn)算2.2線性表的順序存儲(chǔ)2.3線性表的鏈?zhǔn)酱鎯?chǔ)2.4一元多項(xiàng)式的表示及相加6/15/20232數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第2頁(yè)。2.1線性表的概念及運(yùn)算2.1.1線性表的邏輯結(jié)構(gòu)

2.1.2線性表的抽象數(shù)據(jù)類型定義

6/15/20233數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第3頁(yè)。線性表的定義線性表(LinearList)是由n(n≥0)個(gè)類型相同的數(shù)據(jù)元素a1,a2,…,an組成的有限序列,記做(a1,a2,…,ai-1,ai,ai+1,…,an)。

數(shù)據(jù)元素之間是一對(duì)一的關(guān)系,即每個(gè)數(shù)據(jù)元素最多有一個(gè)直接前驅(qū)和一個(gè)直接后繼。線性表的邏輯結(jié)構(gòu)圖為:

6/15/20234數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第4頁(yè)。線性表的特點(diǎn)同一性:線性表由同類數(shù)據(jù)元素組成,每一個(gè)ai必須屬于同一數(shù)據(jù)對(duì)象。有窮性:線性表由有限個(gè)數(shù)據(jù)元素組成,表長(zhǎng)度就是表中數(shù)據(jù)元素的個(gè)數(shù)。有序性:線性表中相鄰數(shù)據(jù)元素之間存在著序偶關(guān)系<ai,ai+1>。

6/15/20235數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第5頁(yè)。2.1.2線性表的抽象數(shù)據(jù)類型定義抽象數(shù)據(jù)類型定義

:ADTLinearList{

數(shù)據(jù)元素:D={ai|ai∈D0,i=1,2,…,n

n≥0,D0為某一數(shù)據(jù)對(duì)象}

關(guān)系:S={<ai,ai+1>|ai,ai+1∈D0,i=1,2,…,n-1}基本操作:(1)InitList(L)操作前提:L為未初始化線性表。 操作結(jié)果:將L初始化為空表。(2)DestroyList(L)操作前提:線性表L已存在。操作結(jié)果:將L銷毀。(3)ClearList(L)操作前提:線性表L已存在

。操作結(jié)果:將表L置為空表。

………}ADT

LinearList6/15/20236數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第6頁(yè)。2.2線性表的順序存儲(chǔ)2.2.1線性表的順序存儲(chǔ)結(jié)構(gòu)

2.2.2線性表順序存儲(chǔ)結(jié)構(gòu)上的基本運(yùn)算

6/15/20237數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第7頁(yè)。順序存儲(chǔ)結(jié)構(gòu)的定義

線性表的順序存儲(chǔ)是指用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表中的各個(gè)元素,使得線性表中在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲(chǔ)在相鄰的物理存儲(chǔ)單元中,即通過(guò)數(shù)據(jù)元素物理存儲(chǔ)的相鄰關(guān)系來(lái)反映數(shù)據(jù)元素之間邏輯上的相鄰關(guān)系。采用順序存儲(chǔ)結(jié)構(gòu)的線性表通常稱為順序表。假設(shè)線性表中每個(gè)元素占k個(gè)單元,第一個(gè)元素的地址為loc(a1),則第k個(gè)元素的地址為:

loc(ai)=loc(a1)+(i-1)×k 6/15/20238數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第8頁(yè)。順序存儲(chǔ)結(jié)構(gòu)示意圖存儲(chǔ)地址

內(nèi)存空間狀態(tài)

邏輯地址

Loc(a1)a11Loc(a1)+(2-1)ka2

2…

……loc(a1)+(i-1)kai

i…

……loc(a1)+(n-1)kan

n...

loc(a1)+(maxlen-1)k

空閑6/15/20239數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第9頁(yè)。順序存儲(chǔ)結(jié)構(gòu)的C語(yǔ)言定義#define maxsize=線性表可能達(dá)到的最大長(zhǎng)度;typedefstruct{ElemTypeelem[maxsize];/*線性表占用的數(shù)組空間*/intlast;

/*記錄線性表中最后一個(gè)元素在數(shù)組elem[]

中的位置(下標(biāo)值),空表置為-1*/}SeqList;

注意區(qū)分元素的序號(hào)和數(shù)組的下標(biāo),如a1的序號(hào)為1,而其對(duì)應(yīng)的數(shù)組下標(biāo)為0。6/15/202310數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第10頁(yè)。2.2.2線性表順序存儲(chǔ)結(jié)構(gòu)的基本運(yùn)算線性表的基本運(yùn)算:查找操作

插入操作

刪除操作順序表合并算法線性表順序存儲(chǔ)結(jié)構(gòu)的優(yōu)缺點(diǎn)分析6/15/202311數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第11頁(yè)。查找操作線性表的兩種基本查找運(yùn)算按序號(hào)查找GetData(L,i):要求查找線性表L中第i個(gè)數(shù)據(jù)元素,其結(jié)果是L.elem[i-1]或L->elem[i-1]。按內(nèi)容查找Locate(L,e):

要求查找線性表L中與給定值e相等的數(shù)據(jù)元素,其結(jié)果是:若在表L中找到與e相等的元素,則返回該元素在表中的序號(hào);若找不到,則返回一個(gè)“空序號(hào)”,如-1。線性表的查找運(yùn)算算法描述為:6/15/202312數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第12頁(yè)。線性表的查找運(yùn)算intLocate(SeqListL,ElemTypee){ i=0;/*i為掃描計(jì)數(shù)器,初值為0,即從第一個(gè)元素開始比較*/while((i<=L.last)&&(L.elem[i]!=e)

)i++;/*順序掃描表,直到找到值為key的元素,或掃描到表尾而沒找到*/if(i<=L.last)return(i);/*若找到值為e的元素,則返回其序號(hào)*/

else return(-1);/*若沒找到,則返回空序號(hào)*/}6/15/202313數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第13頁(yè)。插入操作

線性表的插入運(yùn)算是指在表的第i(1≤i≤n+1)個(gè)位置,插入一個(gè)新元素e,使長(zhǎng)度為n的線性表(e1,…,ei-1,ei,…,en)變成長(zhǎng)度為n+1的線性表(e1,…,ei-1,e,ei,…,en)。

線性表的插入運(yùn)算算法。6/15/202314數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第14頁(yè)。插入算法示意圖

已知:線性表

(4,9,15,28,30,30,42,51,62),需在第4個(gè)元素之前插入一個(gè)元素“21”。則需要將第9個(gè)位置到第4個(gè)位置的元素依次后移一個(gè)位置,然后將“21”插入到第4個(gè)位置,序號(hào)移動(dòng)元素插入元素12345678109491528303042516249152830304262514915212830304262516/15/202315數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第15頁(yè)。插入運(yùn)算intInsList(SeqList*L,inti,ElemTypee){intk;if((i<1)||(i>L->last+2))/*首先判斷插入位置是否合法*/{printf(“插入位置i值不合法”);return(ERROR);}if(L->last>=maxsize-1){printf(“表已滿無(wú)法插入”);return(ERROR);}for(k=L->last;k>=i-1;k--)/*為插入元素而移動(dòng)位置*/L->elem[k+1]=L->elem[k];L->elem[i-1]=e;/*在C語(yǔ)言中數(shù)組第i個(gè)元素的下標(biāo)為i-1*/

L->last++;return(OK);}

算法演示(此處連接算法演示程序)。6/15/202316數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第16頁(yè)。刪除操作

線性表的刪除運(yùn)算是指將表的第i(1≤i≤n)個(gè)元素刪去,使長(zhǎng)度為n的線性表

(e1,…,ei-1,ei,ei+1,…,en),變成長(zhǎng)度為n-1的線性表(e1,…,ei-1,

ei+1,…,en)。

算法思路示意

算法實(shí)現(xiàn)6/15/202317數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第17頁(yè)。刪除算法示意

將線性表(4,9,15,21,28,30,30,42,51,62)中的第5個(gè)元素刪除。

序號(hào)123456781094915212830304262514915213030425162刪除28后6/15/202318數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第18頁(yè)。刪除算法

intDelList(SeqList*L,inti,ElemType*e)/*在順序表L中刪除第i個(gè)數(shù)據(jù)元素,并用指針參數(shù)e返回其值*/{intk;if((i<1)||(i>L->last+1)){printf(“刪除位置不合法!”);return(ERROR);}*e=L->elem[i-1];

/*將刪除的元素存放到e所指向的變量中*/for(k=i;i<=L->last;k++)L->elem[k-1]=L->elem[k];/*將后面的元素依次前移*/L->last--;return(OK);}

6/15/202319數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第19頁(yè)。合并算法已知

:有兩個(gè)順序表LA和LB,其元素均為非遞減有序排列,編寫一個(gè)算法,將它們合并成一個(gè)順序表LC,要求LC也是非遞減有序排列。

算法思想:設(shè)表LC是一個(gè)空表,為使LC也是非遞減有序排列,可設(shè)兩個(gè)指針i、j分別指向表LA和LB中的元素,若LA.elem[i]>LB.elem[j],則當(dāng)前先將LB.elem[j]插入到表LC中,若LA.elem[i]≤LB.elem[j],當(dāng)前先將LA.elem[i]插入到表LC中,如此進(jìn)行下去,直到其中一個(gè)表被掃描完畢,然后再將未掃描完的表中剩余的所有元素放到表LC中。算法實(shí)現(xiàn)此處連接算法演示6/15/202320數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第20頁(yè)。順序表合并算法實(shí)現(xiàn)voidmerge(SeqList*LA,SeqList*LB,SeqList*LC){i=0;j=0;k=0;while(i<=LA->last&&j<=LB->last)if(LA->elem[i]<=LB->elem[j])

{

LC->elem[k]=LA->elem[i];i++;k++;}

else

{

LC->elem[k]=LB->elem[j];j++;k++;}while(i<=LA->last)

/*當(dāng)表LA長(zhǎng)則將表LA余下的元素賦給表LC*/

{

LC->elem[k]=LA->elem[i];

i++;k++;}while(j<=LB->last)/*當(dāng)表LB長(zhǎng)則將表LB余下的元素賦給表LC*/

{

LC->elem[k]=LB->elem[j];

j++;k++;}

LC->last=LA->last+LB->last;}6/15/202321數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第21頁(yè)。順序存儲(chǔ)結(jié)構(gòu)的優(yōu)點(diǎn)和缺點(diǎn)優(yōu)點(diǎn):1.無(wú)需為表示結(jié)點(diǎn)間的邏輯關(guān)系而增加額外的存儲(chǔ)空間;

2.可方便地隨機(jī)存取表中的任一元素。

缺點(diǎn):1.插入或刪除運(yùn)算不方便,除表尾的位置外,在表的其它位置上進(jìn)行插入或刪除操作都必須移動(dòng)大量的結(jié)點(diǎn),其效率較低;

2.由于順序表要求占用連續(xù)的存儲(chǔ)空間,存儲(chǔ)分配只能預(yù)先進(jìn)行靜態(tài)分配。因此當(dāng)表長(zhǎng)變化較大時(shí),難以確定合適的存儲(chǔ)規(guī)模。6/15/202322數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第22頁(yè)。2.3線性表的鏈?zhǔn)酱鎯?chǔ)鏈表定義:

采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的線性表稱為鏈表?,F(xiàn)在我們從兩個(gè)角度來(lái)討論鏈表:1.從實(shí)現(xiàn)角度看,鏈表可分為動(dòng)態(tài)鏈表和靜態(tài)鏈表;2.從鏈接方式的角度看,鏈表可分為單鏈表、循環(huán)鏈表和雙鏈表。

6/15/202323數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第23頁(yè)。2.3.1單鏈表

2.3.2單鏈表上的基本運(yùn)算

2.3.3循環(huán)鏈表

2.3.4雙向鏈表

*2.3.5靜態(tài)鏈表

2.3.6順序表和鏈表的比較鏈表6/15/202324數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第24頁(yè)。2.3.1單鏈表

結(jié)點(diǎn)(Node)為了正確地表示結(jié)點(diǎn)間的邏輯關(guān)系,必須在存儲(chǔ)線性表的每個(gè)數(shù)據(jù)元素值的同時(shí),存儲(chǔ)指示其后繼結(jié)點(diǎn)的地址(或位置)信息,這兩部分信息組成的存儲(chǔ)映象叫做結(jié)點(diǎn)(Node)。單鏈表:鏈表中的每個(gè)結(jié)點(diǎn)只有一個(gè)指針域,我們將這種鏈表稱為單鏈表。單鏈表包括兩個(gè)域:數(shù)據(jù)域用來(lái)存儲(chǔ)結(jié)點(diǎn)的值;指針域用來(lái)存儲(chǔ)數(shù)據(jù)元素的直接后繼的地址(或位置)。頭指針:指向鏈表頭結(jié)點(diǎn)的指針。6/15/202325數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第25頁(yè)。單鏈表的示例圖頭指針H存儲(chǔ)地址數(shù)據(jù)域指針域1D437B1313C119HNULL25F3731A737G1943E25316/15/202326數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第26頁(yè)。帶頭結(jié)點(diǎn)的單鏈表示意圖有時(shí)為了操作的方便,還可以在單鏈表的第一個(gè)結(jié)點(diǎn)之前附設(shè)一個(gè)頭結(jié)點(diǎn)。帶頭結(jié)點(diǎn)的空單鏈表

帶頭結(jié)點(diǎn)的單鏈表

∧Ha1a2…Han

∧6/15/202327數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第27頁(yè)。單鏈表的存儲(chǔ)結(jié)構(gòu)描述typedefstructNode/*結(jié)點(diǎn)類型定義*/{ElemTypedata;

structNode*next;}Node,*LinkList;/*LinkList為結(jié)構(gòu)指針類型*/

6/15/202328數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第28頁(yè)。2.3.2單鏈表上的基本運(yùn)算線性表的基本運(yùn)算:建立單鏈表

單鏈表查找

單鏈表插入操作

單鏈表刪除

算法應(yīng)用示例:求單鏈表的長(zhǎng)度

求兩個(gè)集合的差

6/15/202329數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第29頁(yè)。建立單鏈表頭插法建表

算法描述:從一個(gè)空表開始,重復(fù)讀入數(shù)據(jù),生成新結(jié)點(diǎn),將讀入數(shù)據(jù)存放到新結(jié)點(diǎn)的數(shù)據(jù)域中,然后將新結(jié)點(diǎn)插入到當(dāng)前鏈表的表頭結(jié)點(diǎn)之后,直至讀入結(jié)束標(biāo)志為止。c1∧sL∧L

ci-1∧c2c1∧cis…c1∧6/15/202330數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第30頁(yè)。頭插法建表算法LinklistCreateFromHead(){LinkListL;Node

*s;intflag=1;

/*設(shè)置一個(gè)標(biāo)志,初值為1,當(dāng)輸入“$”時(shí),flag為0,建表結(jié)束*/L=(Linklist)malloc(sizeof(Node));/*為頭結(jié)點(diǎn)分配存儲(chǔ)空間*/

L->next=NULL;while(flag){c=getchar();if(c!=’$’)/*為讀入的字符分配存儲(chǔ)空間*/{s=(Node*)malloc(sizeof(Node));s->data=c;s->next=L->next;L->next=s;}else

flag=0;}}

6/15/202331數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第31頁(yè)。尾插法建表C1

∧sr∧Lc1rsc2∧Lc1∧rsL6/15/202332數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第32頁(yè)。尾插法建表算法LinklistCreateFromTail()/*將新增的字符追加到鏈表的末尾*/{LinkListL;Node*r,*s;intflag=1;

L=(Node*)malloc(sizeof(Node));/*為頭結(jié)點(diǎn)分配存儲(chǔ)空間*/L->next=NULL;r=L;/*r指針始終動(dòng)態(tài)指向鏈表的當(dāng)前表尾*/while(flag)/*標(biāo)志,初值為1。輸入“$”時(shí)flag為0,建表結(jié)束*/

{ c=getchar();

if(c!=’$’){s=(Node*)malloc(sizeof(Node));s->data=c;r->next=s;r=s}else{flag=0;r->next=NULL;}}}6/15/202333數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第33頁(yè)。單鏈表查找按序號(hào)查找

算法描述:設(shè)帶頭結(jié)點(diǎn)的單鏈表的長(zhǎng)度為n,要查找表中第i個(gè)結(jié)點(diǎn),則需要從單鏈表的頭指針L出發(fā),從頭結(jié)點(diǎn)(L->next)開始順著鏈域掃描,用指針p指向當(dāng)前掃描到的結(jié)點(diǎn),初值指向頭結(jié)點(diǎn)(pL->next),用j做記數(shù)器,累計(jì)當(dāng)前掃描過(guò)的結(jié)點(diǎn)數(shù)(初值為0),當(dāng)j=i時(shí),指針p所指的結(jié)點(diǎn)就是要找的第i個(gè)結(jié)點(diǎn)。算法實(shí)現(xiàn),算法演示。 6/15/202334數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第34頁(yè)。按序號(hào)查找算法實(shí)現(xiàn)/*在帶頭結(jié)點(diǎn)的單鏈表L中查找第i個(gè)結(jié)點(diǎn),若找到(1≤i≤n),則返回該結(jié)點(diǎn)的存儲(chǔ)位置;否則返回NULL*/Node*Get(LinkListL,inti){Node*p;

p=L;j=0;/*從頭結(jié)點(diǎn)開始掃描*/while((p->next!=NULL)&&(j<i){p=p->next;j++;/*掃描下一結(jié)點(diǎn)*/}/*已掃描結(jié)點(diǎn)計(jì)數(shù)器*/if(i==j)returnp;/*找到了第i個(gè)結(jié)點(diǎn)*/elsereturnNULL;/*找不到,i≤0或i>n*/}6/15/202335數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第35頁(yè)。按值查找

算法描述:按值查找是指在單鏈表中查找是否有結(jié)點(diǎn)值等于e的結(jié)點(diǎn),若有的話,則返回首次找到的其值為e的結(jié)點(diǎn)的存儲(chǔ)位置,否則返回NULL。查找過(guò)程從單鏈表的頭指針指向的頭結(jié)點(diǎn)出發(fā),順著鏈逐個(gè)將結(jié)點(diǎn)的值和給定值e作比較。算法實(shí)現(xiàn),算法演示。單鏈表查找6/15/202336數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第36頁(yè)。按值查找算法實(shí)現(xiàn)/*在帶頭結(jié)點(diǎn)的單鏈表L中查找其結(jié)點(diǎn)值等于key的結(jié)點(diǎn),若找到則返回該結(jié)點(diǎn)的位置p,否則返回NULL*/Node*Locate(LinkListL,ElemTypekey){Node*p;p=L->next;/*從表中第一個(gè)結(jié)點(diǎn)比較*/while(p!=NULL)if(p->data!=key) p=p->next;elsebreak;/*找到結(jié)點(diǎn)key,退出循環(huán)*/returnp;}6/15/202337數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第37頁(yè)。單鏈表插入操作算法描述:

要在帶頭結(jié)點(diǎn)的單鏈表L中第i個(gè)數(shù)據(jù)元素之前插入一個(gè)數(shù)據(jù)元素e,需要首先在單鏈表中找到第i-1個(gè)結(jié)點(diǎn)并由指針pre指示,然后申請(qǐng)一個(gè)新的結(jié)點(diǎn)并由指針s指示,其數(shù)據(jù)域的值為e,并修改第i-1個(gè)結(jié)點(diǎn)的指針使其指向s,然后使s結(jié)點(diǎn)的指針域指向第i個(gè)結(jié)點(diǎn)。esa1……an∧ai-1aiespreLa1……an∧preai-1ai6/15/202338數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第38頁(yè)。單鏈表插入操作算法實(shí)現(xiàn)voidInsList(LinkListL,inti,ElemTypee){/*在帶頭結(jié)點(diǎn)的單鏈表L中第i個(gè)結(jié)點(diǎn)之前插入值為e的新結(jié)點(diǎn)。*/

Node*pre,*s;

pre=L;intk=0;while(pre!=NULL&&k<i-1)/*先找到第i-1個(gè)數(shù)據(jù)元素的存儲(chǔ)位置,使指針Pre指向它*/

{pre=pre->next;

k=k+1;}if(k!=i-1){printf(“插入位置不合理!”);return;}s=(Node*)malloc(sizeof(Node));/*為e申請(qǐng)一個(gè)新的結(jié)點(diǎn)*/s->data=e;/*將待插入結(jié)點(diǎn)的值e賦給s的數(shù)據(jù)域*/s->next=pre->next;pre->next=s;}

6/15/202339數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第39頁(yè)。單鏈表刪除算法描述: 欲在帶頭結(jié)點(diǎn)的單鏈表L中刪除第i個(gè)結(jié)點(diǎn),則首先要通過(guò)計(jì)數(shù)方式找到第i-1個(gè)結(jié)點(diǎn)并使p指向第i-1個(gè)結(jié)點(diǎn),而后刪除第i個(gè)結(jié)點(diǎn)并釋放結(jié)點(diǎn)空間。pa1…ai-1ai…an∧pa1…L…an∧ai-1aiai+1rL6/15/202340數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第40頁(yè)。單鏈表刪除算法實(shí)現(xiàn)voidDelList(LinkListL,inti,ElemType*e)/*在帶頭結(jié)點(diǎn)的單鏈表L中刪除第i個(gè)元素,并保存其值到變量*e中*/{

Node*p,*r;p=L;intk=0;

while(p->next!=NULL&&k<i-1)/*尋找被刪除結(jié)點(diǎn)i的前驅(qū)結(jié)點(diǎn)*/{p=p->next;k=k+1;}if(k!=i-1)/*即while循環(huán)是因?yàn)閜->next=NULL而跳出的*/{printf(“刪除結(jié)點(diǎn)的位置i不合理!”);returnERROR;}r=p->next;p->next=p->next->next/*刪除結(jié)點(diǎn)r*/free(r);/*釋放被刪除的結(jié)點(diǎn)所占的內(nèi)存空間*/}6/15/202341數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第41頁(yè)。求單鏈表的長(zhǎng)度

算法描述:可以采用“數(shù)”結(jié)點(diǎn)的方法來(lái)求出單鏈表的長(zhǎng)度,用指針p依次指向各個(gè)結(jié)點(diǎn),從第一個(gè)元素開始“數(shù)”,一直“數(shù)”到最后一個(gè)結(jié)點(diǎn)(p->next=NULL)。

int ListLength(LinkListL)/*L為帶頭結(jié)點(diǎn)的單鏈表*/{Node*p;p=L->next; j=0;/*用來(lái)存放單鏈表的長(zhǎng)度*/while(p!=NULL){ p=p->next;j++;}returnj;}算法演示鏈接。6/15/202342數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第42頁(yè)。兩個(gè)有序單鏈表的合并有兩個(gè)單鏈表LA和LB,其元素均為非遞減有序排列,編寫一個(gè)算法,將它們合并成一個(gè)單鏈表LC,要求LC也是非遞減有序排列。要求:利用新表LC利用現(xiàn)有的表LA和LB中的元素結(jié)點(diǎn)空間,而不需要額外申請(qǐng)結(jié)點(diǎn)空間。例如LA=(2,2,3),LB=(1,3,3,4),則LC=(1,2,2,3,3,3,4)。

【算法描述】要求利用現(xiàn)有的表LA和LB中的結(jié)點(diǎn)空間來(lái)建立新表LC,可通過(guò)更改結(jié)點(diǎn)的next域來(lái)重建新的元素之間的線性關(guān)系,為保證新表仍然遞增有序,可以利用尾插入法建立單鏈表的方法,只是新建表中的結(jié)點(diǎn)不用malloc,而只需要從表LA和LB中選擇合適的點(diǎn)插入到新表LC中即可。6/15/202343數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第43頁(yè)。6/15/202344數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第44頁(yè)。兩個(gè)有序單鏈表的合并的算法實(shí)現(xiàn)LinkListMergeLinkList(LinkListLA,LinkListLB)/*將遞增有序的單鏈表LA和LB合并成一個(gè)遞增有序的單鏈表LC*/{Node*pa,*pb;LinkListLC;/*將LC初始置空表。pa和pb分別指向兩個(gè)單鏈表LA和LB中的第一個(gè)結(jié)點(diǎn),r初值為L(zhǎng)C*/pa=LA->next;pb=LB->next;LC=LA;LC->next=NULL;r=LC; /*初始化操作*/6/15/202345數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第45頁(yè)。兩個(gè)有序單鏈表的合并的算法實(shí)現(xiàn)(續(xù))/*當(dāng)兩個(gè)表中均未處理完時(shí),比較選擇將較小值結(jié)點(diǎn)插入到新表LC中。*/

while(pa!=NULL&&pb!=NULL) {if(pa->data<=pb->data){r->next=pa;r=pa;pa=pa->next;}else{r->next=pb;r=pb;pb=pb->next;}}if(pa)/*若表LA未完,將表LA中后續(xù)元素鏈到新表LC表尾*/r->next=pa;else /*否則將表LB中后續(xù)元素鏈到新表LC表尾*/r->next=pb;free(LB);return(LC);}/*MergeLinkList*/6/15/202346數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第46頁(yè)。2.3.3循環(huán)鏈表

循環(huán)鏈表(CircularLinkedList)

是一個(gè)首尾相接的鏈表。特點(diǎn):將單鏈表最后一個(gè)結(jié)點(diǎn)的指針域由NULL改為指向頭結(jié)點(diǎn)或線性表中的第一個(gè)結(jié)點(diǎn),就得到了單鏈形式的循環(huán)鏈表,并稱為循環(huán)單鏈表。在循環(huán)單鏈表中,表中所有結(jié)點(diǎn)被鏈在一個(gè)環(huán)上。

帶頭結(jié)點(diǎn)循環(huán)單鏈表示意圖。6/15/202347數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第47頁(yè)。帶頭結(jié)點(diǎn)的循環(huán)單鏈表示意圖

La1……ai-1aianLa1……ai-1aianrear*(rear->next)*rear空鏈表帶頭結(jié)點(diǎn)的一般形式

帶尾結(jié)點(diǎn)的一般形式

6/15/202348數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第48頁(yè)。循環(huán)單鏈表合并為一個(gè)循環(huán)單鏈表

已知:有兩個(gè)帶頭結(jié)點(diǎn)的循環(huán)單鏈表LA、LB,編寫一個(gè)算法,將兩個(gè)循環(huán)單鏈表合并為一個(gè)循環(huán)單鏈表,其頭指針為L(zhǎng)A。 算法思想:先找到兩個(gè)鏈表的尾,并分別由指針p、q指向它們,然后將第一個(gè)鏈表的尾與第二個(gè)表的第一個(gè)結(jié)點(diǎn)鏈接起來(lái),并修改第二個(gè)表的尾Q,使它的鏈域指向第一個(gè)表的頭結(jié)點(diǎn)。

6/15/202349數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第49頁(yè)。循環(huán)單鏈表合并算法實(shí)現(xiàn)LinkListmerge_1(LinkListLA,LinkListLB)/*此算法將兩個(gè)鏈表的首尾連接起來(lái)*/{Node*p,*q;p=LA;q=LB;while(p->next!=LA)p=p->next; /*找到表LA的表尾*/while(q->next!=LB)q=q->next; /*找到表LB的表尾*/q->next=LA;/*修改表LB的尾指針,使之指向表LA的頭結(jié)點(diǎn)*/p->next=LB->next;/*修改表LA的尾指針,使之指向表LB中的第一個(gè)結(jié)點(diǎn)*/ free(LB);return(LA);}6/15/202350數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第50頁(yè)。2.3.4雙向鏈表

雙向鏈表:在單鏈表的每個(gè)結(jié)點(diǎn)里再增加一個(gè)指向其前趨的指針域prior。這樣形成的鏈表中就有兩條方向不同的鏈,我們稱之為雙

(向)鏈表

(DoubleLinkedList)。雙向鏈表的結(jié)構(gòu)定義:

typedefstructDnode {ElemTypedata;

structDNode*prior,*next;

}DNode, *DoubleList;6/15/202351數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第51頁(yè)。雙鏈表的結(jié)構(gòu)定義雙鏈表的結(jié)點(diǎn)結(jié)構(gòu)后繼指針域priordatanext前驅(qū)指針域數(shù)據(jù)域6/15/202352數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第52頁(yè)。雙向循環(huán)鏈表示意圖a1a2a3LL空的雙向循環(huán)鏈表

非空的雙向循環(huán)鏈表

6/15/202353數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第53頁(yè)。雙向鏈表的前插操作算法描述:欲在雙向鏈表第i個(gè)結(jié)點(diǎn)之前插入一個(gè)的新的結(jié)點(diǎn),則指針的變化情況如圖所示。es①②③④…bpa…6/15/202354數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第54頁(yè)。雙向鏈表的前插操作算法實(shí)現(xiàn)void

DlinkIns(DoubleListL,inti,ElemTypee)

{DNode*s,*p; …/*首先檢查待插入的位置i是否合法*/

…/*若位置i合法,則讓指針p指向它*/s=(DNode*)malloc(sizeof(DNode));if(s){s->data=e;s->prior=p->prior;p->prior->next=s;s->next=p;p->prior=s;returnTRUE;}

else

returnFALSE;}

算法演示連接。6/15/202355數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第55頁(yè)。雙向鏈表的刪除操作算法描述:欲刪除雙向鏈表中的第i個(gè)結(jié)點(diǎn),則指針的變化情況如圖所示。abcp②①……6/15/202356數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第56頁(yè)。雙向鏈表的刪除操作算法實(shí)現(xiàn)int

DlinkDel(DoubleListL,inti,ElemType*e)

{ DNode*p; …/*首先檢查待插入的位置i是否合法*/

…/*若位置i合法,則讓指針p指向它*/ *e=p->data; p->prior->next=p->next; p->next->prior=p->prior; free(p); returnTRUE;}6/15/202357數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第57頁(yè)。*2.3.5靜態(tài)鏈表基本概念:

游標(biāo)實(shí)現(xiàn)鏈表的方法:定義一個(gè)較大的結(jié)構(gòu)數(shù)組作為備用結(jié)點(diǎn)空間(即存儲(chǔ)池)。當(dāng)申請(qǐng)結(jié)點(diǎn)時(shí),每個(gè)結(jié)點(diǎn)應(yīng)含有兩個(gè)域:data域和next域。data域存放結(jié)點(diǎn)的數(shù)據(jù)信息,next域?yàn)橛螛?biāo)指示器,指示后繼結(jié)點(diǎn)在結(jié)構(gòu)數(shù)組中的相對(duì)位置(即數(shù)組下標(biāo))。數(shù)組的第0個(gè)分量可以設(shè)計(jì)成表的頭結(jié)點(diǎn),頭結(jié)點(diǎn)的next域指示了表中第一個(gè)結(jié)點(diǎn)的位置,為0表示靜態(tài)單鏈表的結(jié)束。我們把這種用游標(biāo)指示器實(shí)現(xiàn)的單鏈表叫做靜態(tài)單鏈表(StaticLinkedList)。靜態(tài)鏈表的結(jié)構(gòu)定義,靜態(tài)鏈表的插入和刪除操作示例?;静僮鳎撼跏蓟?、分配結(jié)點(diǎn)與結(jié)點(diǎn)回收、前插操作、刪除。

6/15/202358數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第58頁(yè)。靜態(tài)鏈表的結(jié)構(gòu)定義#defineMaxsize=鏈表可能達(dá)到的最大長(zhǎng)度typedefstruct{ElemTypedata;intcursor;}Component,StaticList[Maxsize];

6/15/202359數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第59頁(yè)。靜態(tài)鏈表的插入和刪除操作示例已知:線性表

a,b,c,d,f,g,h,i),Maxsize=110123456789100123456789101a2b3c4d9f6g8h8i0e51a2b3c4d9f6g7h8i0e51a2b3c4d5f6g7h8i0012345678910(a)初始化(b)插入e后(c)刪除h后6/15/202360數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第60頁(yè)。靜態(tài)鏈表初始化算法描述:初始化操作是指將這個(gè)靜態(tài)單鏈表初始化為一個(gè)備用靜態(tài)單鏈表。設(shè)space為靜態(tài)單鏈表的名字,av為備用單鏈表的頭指針,其算法如下:voidinitial(StaticListspace,int*av){intk;space[0]->cursor=0;/*設(shè)置靜態(tài)單鏈表的頭指針指向位置0*/for(k=0;k<Maxsize-1;k++) space[k]->cursor=k+1;/*連鏈*/space[Maxsize-1].cursor

=0;/*標(biāo)記鏈尾*/*av=1;/*設(shè)置備用鏈表頭指針初值*/}

6/15/202361數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第61頁(yè)。靜態(tài)鏈表分配結(jié)點(diǎn)與結(jié)點(diǎn)回收分配結(jié)點(diǎn)intgetnode(int*av)/*從備用鏈表摘下一個(gè)結(jié)點(diǎn)空間,分配給待插入靜態(tài)鏈表中的元素*/{inti=*av;*av=space[*av].cur;returni;}結(jié)點(diǎn)回收voidfreenode(int*av,intk)/*將下標(biāo)為k的空閑結(jié)點(diǎn)插入到備用鏈表*/{space[k].cursor=*av;*av=k;}6/15/202362數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第62頁(yè)。2.4一元多項(xiàng)式的表示及相加一元多項(xiàng)式可按升冪的形式寫成:Pn(x)=p0+p1xe1+p2xe2+…+pnxen,其中ei為第i項(xiàng)的指數(shù),pi是指數(shù)ei的項(xiàng)的系數(shù),(且1≤e1≤e2≤…≤en)假設(shè)Qm(x)是一個(gè)一元多項(xiàng)式,則它也可以用一個(gè)線性表Q來(lái)表示。即:Q=(q0,q1,q2,…,qm)若假設(shè)m<n,則兩個(gè)多項(xiàng)式相加的結(jié)果Rn(x)=Pn(x)+Qm(x),也可以用線性表R來(lái)表示:R=(p0+q0,p1+q1,,p2+q2,…,pm+qm

,pm+1,…,pn)6/15/202363數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第63頁(yè)。一元多項(xiàng)式的存儲(chǔ)一元多項(xiàng)式的順序存儲(chǔ)表示一元多項(xiàng)式的鏈?zhǔn)酱鎯?chǔ)表示6/15/202364數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第64頁(yè)。一元多項(xiàng)式的順序存儲(chǔ)表示1一元多項(xiàng)式Pn(x)的順序表示有兩種。法1、只存儲(chǔ)該一元多項(xiàng)式各項(xiàng)的系數(shù),每個(gè)系數(shù)所對(duì)應(yīng)的指數(shù)項(xiàng)則隱含在存儲(chǔ)系數(shù)的順序表的下標(biāo)中。即p[0]存系數(shù)p0,對(duì)應(yīng)為x0的系數(shù),p[1]存系數(shù)p1,對(duì)應(yīng)為x1的系數(shù),……p[n]存系數(shù)pn,對(duì)應(yīng)為xn的系數(shù)。采用這種存儲(chǔ)方法使得多項(xiàng)式的相加運(yùn)算的算法定義十分簡(jiǎn)單,只需將下標(biāo)相同的單元的內(nèi)容相加即可。適合于存儲(chǔ)表示非零系數(shù)多的多項(xiàng)式。6/15/202365數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第65頁(yè)。一元多項(xiàng)式的順序存儲(chǔ)表示2法2、采用只存儲(chǔ)非零項(xiàng)的方法,此時(shí)每個(gè)非零項(xiàng)需要存儲(chǔ):非零項(xiàng)系數(shù)和非零項(xiàng)指數(shù)。適合存儲(chǔ)表示非零項(xiàng)少的多項(xiàng)式。piei┋┋圖2.19一元多項(xiàng)式只存非零項(xiàng)存儲(chǔ)示意圖6/15/202366數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第66頁(yè)。一元多項(xiàng)式的鏈?zhǔn)酱鎯?chǔ)表示在鏈?zhǔn)酱鎯?chǔ)中,對(duì)一元多項(xiàng)式只存非零項(xiàng),則該多項(xiàng)式中每一非零項(xiàng)由兩部分構(gòu)成(指數(shù)項(xiàng)和系數(shù)項(xiàng)),用單鏈表存儲(chǔ)表示的結(jié)點(diǎn)結(jié)構(gòu)為:用單鏈表存儲(chǔ)多項(xiàng)式的結(jié)點(diǎn)結(jié)構(gòu)如下:

structPolynode { intcoef;intexp;Polynode*next;}Polynode,*Polylist;

系數(shù)coef指數(shù)exp指針next6/15/202367數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第67頁(yè)。建立一元多項(xiàng)式鏈?zhǔn)酱鎯?chǔ)的算法【算法思想】通過(guò)鍵盤輸入一組多項(xiàng)式的系數(shù)和指數(shù),用尾插法建立一元多項(xiàng)式的鏈表。以輸入系數(shù)0為結(jié)束標(biāo)志,并約定建立多項(xiàng)式鏈表時(shí),總是按指數(shù)從小到大的順序排列?!舅惴枋觥縋olylistpolycreate(){Polynode*head,*rear,*s; intc,e; rear=head=(Polynode*)malloc(sizeof(Polynode)); /*建立多項(xiàng)式的頭結(jié)點(diǎn),rear始終指向單鏈表的尾*/ scanf(“%d,%d”,&c,&e);/*鍵入多項(xiàng)式的系數(shù)和指數(shù)項(xiàng)*/ while(c!=0) /*若c=0,則代表多項(xiàng)式的輸入結(jié)束*/ {s=(Polynode*)malloc(sizeof(Polynode)); /*申請(qǐng)新的結(jié)點(diǎn)*/s->coef=c;s->exp=e;rear->next=s; /*在當(dāng)前表尾做插入*/rear=s; scanf(“%d,%d”,&c,&e);}rear->next=NULL;/*將表的最后一個(gè)結(jié)點(diǎn)的next置NULL,以示表結(jié)束*/return(head);}6/15/202368數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第68頁(yè)。一元多項(xiàng)式的單鏈表表示示意圖說(shuō)明:圖示分別為多項(xiàng)式

A(x)=7+3x+9x8+5x17 B(x)=8x+22x7-9x8

-17031517∧9881-1227-98∧

6/15/202369數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第69頁(yè)。兩個(gè)一元多項(xiàng)式相加運(yùn)算規(guī)則:兩個(gè)多項(xiàng)式中所有指數(shù)相同的項(xiàng)的對(duì)應(yīng)系數(shù)相加,若和不為零,則構(gòu)成“和多項(xiàng)式”中的一項(xiàng);所有指數(shù)不相同的項(xiàng)均復(fù)抄到“和多項(xiàng)式”中。算法實(shí)現(xiàn),算法演示若p->exp<q->exp,則結(jié)點(diǎn)p所指的結(jié)點(diǎn)應(yīng)

是“和多項(xiàng)式”中的一項(xiàng),令指針p后移;若p->exp>q->exp,則結(jié)點(diǎn)q所指的結(jié)點(diǎn)應(yīng)是“和多項(xiàng)式”中的一項(xiàng),將結(jié)點(diǎn)q插入在結(jié)點(diǎn)p之前,且令指針q在原來(lái)的鏈表上后移;若p->exp=q->exp,則將兩個(gè)結(jié)點(diǎn)中的系數(shù)相加,當(dāng)和不為零時(shí)修改結(jié)點(diǎn)p的系數(shù)域,釋放q結(jié)點(diǎn);若和為零,則和多項(xiàng)式中無(wú)此項(xiàng),從A中刪去p結(jié)點(diǎn),同時(shí)釋放p和q結(jié)點(diǎn)。6/15/202370數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第70頁(yè)。兩個(gè)多項(xiàng)式相加算法實(shí)現(xiàn)voidpolyadd(Polylistpolya;Polylistpolyb){

……/*p和q分別指向polya和polyb鏈表中的當(dāng)前計(jì)算結(jié)點(diǎn)*/

……/*pre指向和多項(xiàng)式鏈表中的尾結(jié)點(diǎn)*/whilep!=NULL&&q!=NULL)

{if

(p->exp<q->exp)

{…/*將p結(jié)點(diǎn)加入到和多項(xiàng)式中*/}elseif(p->exp==q->exp)

{…/*若指數(shù)相等,則相應(yīng)的系數(shù)相加。若系數(shù)為0則刪除p,q節(jié)點(diǎn)*/}

else{…/*將q結(jié)點(diǎn)加入到和多項(xiàng)式中*/}}

…../*將多項(xiàng)式polya或polyb中剩余的結(jié)點(diǎn)加入到和多項(xiàng)式中*/}6/15/202371數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第71頁(yè)。2.5順序表和鏈表的比較

1.基于空間的考慮

2.基于時(shí)間的考慮

3.基于語(yǔ)言的考慮

6/15/202372數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第72頁(yè)。線性表鏈?zhǔn)酱鎯?chǔ)方式的比較

操作名稱鏈表名稱找表頭結(jié)點(diǎn)找表尾結(jié)點(diǎn)找P結(jié)點(diǎn)前驅(qū)結(jié)點(diǎn)帶頭結(jié)點(diǎn)單鏈表LL->next時(shí)間耗費(fèi)O(1)一重循環(huán)時(shí)間耗費(fèi)O(n)順P結(jié)點(diǎn)的next域無(wú)法找到P結(jié)點(diǎn)的前驅(qū)帶頭結(jié)點(diǎn)循環(huán)單鏈表(頭指針)LL->next時(shí)間耗費(fèi)O(1)一重循環(huán)時(shí)間耗費(fèi)O(n)順P結(jié)點(diǎn)的next域可以找到P結(jié)點(diǎn)的前驅(qū)時(shí)間耗費(fèi)O(n)帶尾指針的循環(huán)單鏈表RR->nextO(1)R時(shí)間耗費(fèi)O(1)順P結(jié)點(diǎn)的next域可以找到P結(jié)點(diǎn)的前驅(qū)時(shí)間耗費(fèi)O(n)帶頭結(jié)點(diǎn)雙向循環(huán)鏈表LL->nextO(1)L->prior時(shí)間耗費(fèi)O(1)P->prior時(shí)間耗費(fèi)O(1)6/15/202373數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第73頁(yè)。2.6總結(jié)與提高

主要知識(shí)點(diǎn)

1、線性表的特征:線性表中每個(gè)數(shù)據(jù)元素有且僅有一個(gè)直接前驅(qū)和一個(gè)直接后繼,第一個(gè)結(jié)點(diǎn)無(wú)前驅(qū),最后一個(gè)結(jié)點(diǎn)無(wú)后繼。2、線性表存儲(chǔ)方式:線性表順序存儲(chǔ)(順序表):采用靜態(tài)分配方式,借助于C語(yǔ)言的數(shù)組類型,申請(qǐng)一組連續(xù)的地址空間,依次存放表中元素,其邏輯次序隱含在存儲(chǔ)順序之中。6/15/202374數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第74頁(yè)。2.6總結(jié)與提高線性表鏈?zhǔn)酱鎯?chǔ)(鏈表):采用動(dòng)態(tài)分配方式,借助于C語(yǔ)言的指針類型,動(dòng)態(tài)申請(qǐng)與動(dòng)態(tài)釋放地址空間,故鏈表中的各結(jié)點(diǎn)的物理存儲(chǔ)可以是不連續(xù)的。當(dāng)表長(zhǎng)度變化時(shí)僅需適當(dāng)變化指針的聯(lián)接,適合于表中元素個(gè)數(shù)動(dòng)態(tài)變化。3、單鏈表的操作特點(diǎn):⑴順鏈操作技術(shù)⑵指針保留技術(shù)4、鏈表處理中的相關(guān)技術(shù)6/15/202375數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第75頁(yè)。典型題例

例1:已知順序表L中的數(shù)據(jù)元素類型為int。設(shè)計(jì)算法將其調(diào)整為左右兩部分,左邊的元素(即排在前面的)均為奇數(shù),右邊所有元素(即排在后面的)均為偶數(shù),并要求算法的時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。6/15/202376數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第76頁(yè)。例1【問(wèn)題分析】初見此題,可能會(huì)想到額外申請(qǐng)1個(gè)順序表空間,之后依次從順序表L中選擇奇數(shù)放入新表前部分,選擇偶數(shù)放在新表的后半部分。但是題目要求空間復(fù)雜度為O(1),很顯然上述方法是不可行的。既然要求空間復(fù)雜度為O(1),說(shuō)明只能借助1個(gè)輔助空間。分析題目要求,其實(shí)我們只需要將位于表左半部分的偶數(shù)與位于表右半部分的奇數(shù)通過(guò)一個(gè)輔助變量進(jìn)行交換即可,為此我們可以設(shè)置兩個(gè)位置指示器i和j,i初值為0,j初值為L(zhǎng)->last,當(dāng)L->elem[i]為偶數(shù),L->elem[j]為奇數(shù)時(shí),則將L->elem[i]與L->elem[j]交換;否則,L->elem[i]為奇數(shù),i++,L->elem[j]為偶數(shù),j++。這樣既可以保證算法的時(shí)間復(fù)雜度為O(n),亦可保證空間復(fù)雜度為O(1)。6/15/202377數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第77頁(yè)?!舅惴枋觥?/p>

AdjustSqlist(SeqList*L)/*{inti=0,j=L->last;while(i<j){while(L->elem[i]%2!=0)i++;/*從表的左半部分開始檢測(cè),若為奇數(shù),則i加1,直到找到偶數(shù)為止*/while(L->elem[j]%2==0)j--;/*從表的右半部分開始檢測(cè),若為偶數(shù),則j減1,直到找到奇數(shù)為止*/if(i<j){t=L->elem[i];L->elem[i]=L->elem[j];L->elem[j]=t;}/*交換*/}}/*endofAdjustSqlist*/6/15/202378數(shù)據(jù)結(jié)構(gòu)線性表知識(shí)總結(jié)全文共85頁(yè),當(dāng)前為第78頁(yè)。例2:算法實(shí)現(xiàn)帶頭結(jié)點(diǎn)單鏈表的就地逆置問(wèn)題?!締?wèn)題分析】逆置就是使得表中內(nèi)容由原來(lái)的(a1,a2,…,ai-1,ai,ai+1,…,an)變?yōu)椋╝n,an-1,…,ai+1,ai,ai-1,…,a1)。就地逆置就是不需要額外申請(qǐng)結(jié)點(diǎn)空間,只需要利用原有的表中的節(jié)點(diǎn)空間。若對(duì)順序表中的元素進(jìn)行逆置,可以借助于“交換”前后

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論