數(shù)據(jù)結(jié)構(gòu)第二章線性表_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)第二章線性表_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)第二章線性表_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)第二章線性表_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)第二章線性表_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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)介

第二章線性表(Linearlist)邏輯結(jié)構(gòu)與基本運(yùn)算1順序表2單鏈表與雙向鏈表3線性表應(yīng)用4madebyXiong’enLiuSchoolofComputer&InformationScience,FAFU1邏輯結(jié)構(gòu)與基本運(yùn)算L=(a1,a2,…,ai,…,an)

線性表邏輯結(jié)構(gòu)非空表中有且僅有一個(gè)第一個(gè)元素非空表中有且僅有一個(gè)最后一個(gè)元素除第一個(gè)元素之外,每個(gè)元素均有且僅有一個(gè)前趨除最后一個(gè)元素外,每個(gè)元素均有且僅有一個(gè)后繼#基本運(yùn)算的操作體現(xiàn)邏輯結(jié)構(gòu)特點(diǎn)線性表基本運(yùn)算初始化initiate(L),建立一個(gè)空表求表長(zhǎng)length(L),返回元素個(gè)數(shù)取第i個(gè)元素get(L,i),其中1≤i≤length(L)元素定位locate(L,e),返回元素的存儲(chǔ)位置插入元素insertion(L,i,e),其中1≤i≤length(L)+1刪除元素deletion(L,i),其中1≤i≤length(L)判表空empty(L)置表空clear(L),清空表求前趨prior(L,e)求后繼next(L,e)問(wèn)題1:在線性表L中的元素a之前插入元素b。問(wèn)題2:刪除線性表L中的元素a。

線性表的應(yīng)用問(wèn)題---通過(guò)基本運(yùn)算實(shí)現(xiàn)insertion(L,a,b)變換成insertion(L,locate(L,a),b)deletion(L,a)變換成

deletion(L,locate(L,a))2順序表(sequentiallist)

一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的元素

順序表數(shù)據(jù)類型#defineM?//?maybe1024forexampletypedef struct { …… //accordingtotheproblem }element;typedef struct { elementdata[M]; intlen;

}sqList;

voidinitiate(sqList&L) //初始化順序表

{ L.len=0; }//-------------------------------------------------// intlength(constsqList&L) //求表長(zhǎng)

{ returnL.len; }//-------------------------------------------------// voidclear(sqList&L) //置表空

{ L.len=0; }//-------------------------------------------------// boolempty(constsqList&L) //判表空

{ if(L.len==0)returntrue; returnfalse; }

elementget(constsqList&L,inti)//

取第i個(gè)元素

{ if(i<1||i>L.len)returnNULL; returnL.data[i-1]; } intlocate(constsqList&L,elemente) //

元素定位

{ intp=0; while(p<L.len&&L.data[p]!=e) p++; if(p<L.len)returnp; return-1; }以上算法的時(shí)間復(fù)雜度T(n)=O(1)順序表其它涉及遍歷的算法時(shí)間復(fù)雜度T(n)=O(n)...順序表第i個(gè)元素之前插入新元素e1e2e3...eiei+1...enenen-1ei+1eie012i-1inn-1nlenn+1data

boolinsertion(sqList&L,inti,elementa) //插入元素

{ if(i<1||i>L.len+1)returnfalse; for(intj=L.len;j>=i;j--) L.data[j]=L.data[j-1]; L.data[i-1]=a; L.len++; returntrue; }//------------------------------------------------------------// booldeletion(sqList&L,inti) //元素刪除

{ if(i<1||i>L.len)returnfalse; for(intj=i;j<L.len;j++) L.data[j-1]=L.data[j]; L.len--; returnture; }順序表元素插入算法時(shí)間復(fù)雜度重復(fù)的基本操作---元素的移動(dòng)T(n)=O(n)元素刪除算法的時(shí)間復(fù)雜度T(n)=O(n)問(wèn)題3:順序表元素插入或刪除算法的時(shí)間效率高嗎?問(wèn)題4:實(shí)現(xiàn)insert(L,a,b)及deletion(L,a)【例2.1】運(yùn)用基本運(yùn)算算法實(shí)現(xiàn)清除順序表中的重復(fù)元素。

voidpurge(sqList&L) { inti=0,j; while(i<L.len-1) { j=i+1; while(j<L.len) if(L.data[i]==L.data[j])

deletion(L,j+1); elsej++; i++; } }T(n)=O(n3)3單鏈表與雙向鏈表(linkedlist)3.1單鏈表(singlylinkedlist)

每個(gè)結(jié)點(diǎn)附設(shè)1個(gè)指向后繼結(jié)點(diǎn)的指針僅為現(xiàn)有元素分配結(jié)點(diǎn)空間,元素刪除時(shí)釋放結(jié)點(diǎn)元素插入或刪除時(shí),不改變其它結(jié)點(diǎn)存儲(chǔ)位置單鏈表結(jié)點(diǎn)數(shù)據(jù)類型

typedef structnode { elementdata; structnode*next; }linknode;

linknode*initiate() //初始化單鏈表

{ linknode*p; p=newlinknode; p->next=NULL; returnp; } boolempty(linknode*hp) //判空表

{ if(hp->next==NULL)returntrue; returnfalse; }

單鏈表遍歷,T(n)=O(n)//-------------------------------------------------// intlength(linknode*hp) //求表長(zhǎng)

{ intn=0; hp=hp->next; while(hp) //while(hp!=NULL) { n++; hp=hp->next; } returnn; } elementget(linknode*hp,inti) //取第i個(gè)元素

{ intj=1; hp=hp->next; while(hp&&j<i) { hp=hp->next; j++; } if(hp==NULL||j!=i)returnNULL; returnhp->data; }//-------------------------------------------------// linknode*locate(linknode*hp,elemente)//定位

{ hp=hp->next; while(hp&&hp->data!=e) hp=hp->next; returnhp; }單鏈表元素結(jié)點(diǎn)插入

boolinsertion(linknode*hp,inti,elemente) //單鏈表元素插入

{ intj=0; linknode*p=hp,*q; while(p!=NULL&&j<i-1)//定位前趨

{ p=p->next; j++; } if(p==NULL||j!=i-1)returnfalse; q=newlinknode; q->data=e; q->next=p->next;

p->next=q; returntrue; }問(wèn)題5:?jiǎn)捂湵砼c順序表元素插入T(n)=O(n),哪個(gè)實(shí)際效率更高?問(wèn)題6:如何實(shí)現(xiàn)單鏈表建立過(guò)程?單鏈表元素結(jié)點(diǎn)刪除

booldeletion(linknode*hp,inti)//刪除元素

{ intj=0; linknode*p=hp,*q; while(p->next!=NULL&&j<i-1)//定位前趨

{ p=p->next; j++; } if(p->next==NULL||j!=i-1)returnfalse; q=p->next;

p->next=q->next;//p->next=p->next->next; deleteq; returntrue; }問(wèn)題7:實(shí)現(xiàn)算法(指定元素的插入或刪除) ①boolinsertion(linknode*hp,elementa,elementb); ②booldeletion(linknode*hp,elementa);【例3.1】將兩個(gè)遞增有序的單鏈表合并成一個(gè)遞增有序的表。

linknode*merge(linknode*ha,linknode*hb) { linknode*q=ha,*pa=ha->next,*pb=hb->next; while(pa!=NULL&&pb!=NULL) if(pa->data<=pb->data) { q->next=pa; q=pa; pa=pa->next; } else { q->next=pb; q=pb; pb=pb->next; } if(pa!=NULL)q->next=pa; elseq->next=pb; deletehb; returnha; }linknode*merge(linknode*ha,linknode*hb) //改進(jìn)版{ linknode*q=ha,*pa=ha->next,*pb=hb->next; while(pa&&pb) { while(pa&&pa->data<=pb->data) { q=pa; pa=pa->next; } q->next=pb; while(pb&&pb->data<pa->data) { q=pb; pb=pb->next; } q->next=pa; } if(pa)q->next=pa; elseq->next=pb; deletehb; returnha;}3.2雙向鏈表(doublelinkedlist)問(wèn)題8:?jiǎn)捂湵砬笄摆呥\(yùn)算及其T(n)雙向鏈表結(jié)點(diǎn)數(shù)據(jù)類型

typedef structnode { elementdata; structnode*prior,*next; }dlinknode;

dlinknode*initiate() //初始化雙向循環(huán)鏈表

{ dlinknode*p; p=newdlinknode; p->prior=p->next=p; returnp; } boolempty(dlinknode*hp) //雙向循環(huán)鏈表判空表

{ if(hp->next==hp)returntrue; //if(hp->prior==hp)returntrue; returnfalse; }//-------------------------------------------------// dlinknode*locate(dlinknode*hp,elemente) //雙向循環(huán)鏈表元素定位

{ dlinknode*p=hp->next; //p=hp->prior; while(p!=hp&&p->data!=e) p=p->next; //p=p->prior; if(p!=hp)returnp; returnNULL; }雙向鏈表元素結(jié)點(diǎn)插入

boolinsertion(dlinknode*hp,inti,elemente) //雙向循環(huán)鏈表元素插入

{ intj=0; dlinknode*p=hp,*q; while(p!=hp&&j<i-1)//定位前趨

{ p=p->next; j+

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論