第2章線性表第3節(jié)_第1頁
第2章線性表第3節(jié)_第2頁
第2章線性表第3節(jié)_第3頁
第2章線性表第3節(jié)_第4頁
第2章線性表第3節(jié)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

會計學(xué)1第2章線性表第3節(jié)循環(huán)鏈表的優(yōu)點(diǎn):假設(shè)有兩個鏈表,要想將這兩個鏈表連接起來,若是單鏈表需要找到前一個鏈表的最后一個結(jié)點(diǎn),時間復(fù)雜度為O(n),而對指向尾結(jié)點(diǎn)的單循環(huán)鏈表而言,只需要改變一個指針就可以了,時間復(fù)雜度為O(1)合并鏈表la,lb的基本操作為:(1)la,lb為單鏈表(帶頭結(jié)點(diǎn))

p=la->next;

while(p->next!=NULL)p=p->next;p->next=lb->next(合并后以la為頭指針)(2)la,lb為指向尾結(jié)點(diǎn)的單循環(huán)鏈表(帶頭結(jié)點(diǎn))

p=la->next;la->next=lb->next->next;lb->next=p;第1頁/共20頁

2.雙向鏈表(DoublyLinkedList)typedefstructDuLNode{ElemTypedata;

//數(shù)據(jù)域

structDuLNode*prior;

//指向前驅(qū)的指針域

structDuLNode*next;

//

指向后繼的指針域}DuLNode,*DuLinkList;對指向雙向鏈表任一結(jié)點(diǎn)的指針d,有下面的關(guān)系:d->next->prior=d->prior->next=d即當(dāng)前結(jié)點(diǎn)后繼的前趨是自身,當(dāng)前結(jié)點(diǎn)前趨的后繼也是自身定義:每個結(jié)點(diǎn)中有兩個指針域,其一指向直接后繼,另一指向直接前趨。

問題:執(zhí)行前插操作或刪除操作時,如何操作?第2頁/共20頁雙向鏈表的操作特點(diǎn):“查詢”和單鏈表相同。“插入”和“刪除”時需要同時修改兩個方向上的指針。雙向鏈表的優(yōu)點(diǎn):可以克服單鏈表的單向性的缺點(diǎn)。查找前驅(qū)很方便。第3頁/共20頁ai-1aies->next=p;s->prior=p->prior;p->prior->next=s;p->prior=s;psai-1ai插入第4頁/共20頁ai-1刪除aiai+1p->prior->next=p->next;p->next->prior=p->prior;ai-1第5頁/共20頁3.雙向循環(huán)鏈表空表非空表a1a2…...an第6頁/共20頁構(gòu)造一個完整的鏈表結(jié)構(gòu)//節(jié)點(diǎn)結(jié)構(gòu)

typedefstructLnode{Elemtypedata;structLnode*next;}*Link;//鏈表結(jié)構(gòu)

typedefstruct{Linkhead,tail;intlen;}linklist;第7頁/共20頁

2.4有序表定義:若線性表中的數(shù)據(jù)元素之間可以相互比較,并且數(shù)據(jù)元素在線性表中依值非遞減或非遞增有序排列,即ai>=ai+1或ai<=ai+1.如何在順序有序表中插入一個元素仍然保持有序第8頁/共20頁(12,23,34,45,56,67,78,89,98,45)例如:若

e=45,

q指向

若e=88,

則q指向表示值為88的元素應(yīng)插入在該指針?biāo)附Y(jié)點(diǎn)之后。

2.4有序表第9頁/共20頁1.順序有序表中插入一個元素仍然保持有序voidOrdInsert(SqList*L,ElemTypex){i=L->length-1;//從最后一個元素起進(jìn)行查找比較while(i>=0&&x<L->elem[i]){L->elem[i+1]=L->elem[i];i--;}L->elem[i+1]=x;L->length++;}

2.4有序表第10頁/共20頁2.順序有序表中刪除值相同的多余元素voidpurge(SqList*L)//表必須不是空表{i=0;j=1;//設(shè)新的La表為只有一個元素表

while(j<L->length){if(L->elem[i]!=L->elem[j])L->elem[++i]=L->elem[j];j++;}L->length=i+1;}voidpurge(SqList*L)//表可以是空表也可以不是空表{i=-1;j=0;//設(shè)新的La表為只有一個元素表

while(j<L->length){if(j==0||L->elem[i]!=L->elem[j])L->elem[++i]=L->elem[j];j++;}L->length=i+1;}

2.4有序表第11頁/共20頁3.指向尾結(jié)點(diǎn)的循環(huán)有序鏈表求并集(帶頭結(jié)點(diǎn)),原兩個表不存在la為交集表的頭指針voidunion_OL(LinkList&La,LinkList&Lb){pa=La->next->next;pb=Lb->next->next;rc=La->next;while(pa!=La->next&&pb!=Lb->next){if(pa->data<pb->data){rc->next=pa;rc=pa;pa=pa->next;}elseif(pa->data>pb->data){rc->next=pb;rc=pb;pb=pb->next;}else{rc->next=pa;rc=pa;pa=pa->next;qb=pb;pb=pb->next;deleteqb;}}if(pb==Lb->next)rc->next=pa;else{rc->next=pb;pb=Lb->next;Lb->next=La->next;La=Lb;}deletepb;}

2.4有序表第12頁/共20頁3.指向尾結(jié)點(diǎn)的循環(huán)有序鏈表求并集(帶頭結(jié)點(diǎn)),原兩個表不存在la為交集表的頭指針(算法改進(jìn))voidunion_OL_1(LinkList&La,LinkList&Lb){La->next->data=MAX;Lb->next->data=MAX;pa=La->next->next;pb=Lb->next->next;rc=La->next;while(pa!=La->next||pb!=Lb->next){if(pa->data<pb->data){rc->next=pa;rc=pa;pa=pa->next;}elseif(pa->data>pb->data){rc->next=pb;rc=pb;pb=pb->next;}else{rc->next=pa;rc=pa;pa=pa->next;qb=pb;pb=pb->next;deleteqb;}}rc->next=La;//封閉鏈環(huán)

deleteLb->next;//釋放B表的表頭}

2.4有序表第13頁/共20頁4.有序單鏈表判斷兩個集合是否相等boolisequal_OL(LinkListA,LinkListB){pa=A->next;pb=B->next;while(pa&&pb&&pa->data==pb->data){pa=pa->next;pb=pb->next;}if(pa==NULL&&pb==NULL)returnTRUE;elsereturnFALSE;}時間復(fù)雜度為O(n)

2.4有序表第14頁/共20頁基于空間的考慮

在鏈表中的每個結(jié)點(diǎn),除了數(shù)據(jù)域外,還要額外設(shè)置指針(或光標(biāo))域,從存儲密度來講,這是不經(jīng)濟(jì)的。所謂存儲密度(StorageDensity),是指結(jié)點(diǎn)數(shù)據(jù)本身所占的存儲量和整個結(jié)點(diǎn)結(jié)構(gòu)所占的存儲量之比,存儲密度越大,存儲空間的利用率就越高。當(dāng)線性表的長度變化不大,易于事先確定其大小時,為了節(jié)約存儲空間,宜采用順序表作為存儲結(jié)構(gòu)。2.基于查找時間的考慮

順序表是由向量實(shí)現(xiàn)的,它是一種隨機(jī)存取結(jié)構(gòu),對表中任一結(jié)點(diǎn)都可以在O(1)時間內(nèi)直接地存取,而鏈表中的結(jié)點(diǎn),需從頭指針起順著鏈找才能取得。因此,若線性表的操作主要是進(jìn)行查找,很少做插入和刪除時,宜采用順序表做存儲結(jié)構(gòu)。2.5順序表和鏈表的綜合比較第15頁/共20頁2.線性表有兩種存儲結(jié)構(gòu):順序表,鏈表。問題:(1)如果有n個線性表同時并存,并且在處理過程中各表的長度會動態(tài)變化,線性表的總數(shù)也會自動地改變。在此情況下,應(yīng)選用哪種存儲結(jié)構(gòu)?為什么?(2)若線性表的總數(shù)基本穩(wěn)定,且很少進(jìn)行插入和刪除,但要求以最快的速度存取線性表中的元素,那么應(yīng)采用哪種存儲結(jié)構(gòu)?為什么?2.5順序表和鏈表的綜合比較答:(1)選鏈?zhǔn)酱鎯Y(jié)構(gòu)。它可動態(tài)申請內(nèi)存空間,不受表長度(即表中元素個數(shù))的影響,插入、刪除時間復(fù)雜度為O(1)。

(2)選順序存儲結(jié)構(gòu)。順序表可以隨機(jī)存取,時間復(fù)雜度為O(1)。對于頻繁進(jìn)行插入和刪除的線性表,宜采用鏈表做存儲結(jié)構(gòu)。若表的插入和刪除主要發(fā)生在表的首尾兩端,則宜采用尾指針表示的單循環(huán)鏈表。

第16頁/共20頁第17頁/共20頁本課題目:實(shí)驗二線性表的鏈?zhǔn)酱鎯?shí)驗實(shí)驗?zāi)康模赫莆真湵淼亩x及操作的C++語言實(shí)現(xiàn)方法實(shí)驗重點(diǎn):鏈表的操作的C++語言實(shí)現(xiàn)方法實(shí)驗難點(diǎn):鏈表的操作的C++語言實(shí)現(xiàn)方法實(shí)驗內(nèi)容:1建立頭文件,包含數(shù)據(jù)類型定義和基本操作。2建立程序文件利用鏈表完成基本的刪除,插入,查找等各種功能。3上機(jī)基本步驟:DEFINE宏定義INCLUDE語句類型定義編寫實(shí)現(xiàn)各個功能的函數(shù)編寫調(diào)用各個函數(shù)的主程序(main函數(shù))2.3線性表的鏈?zhǔn)奖硎竞蛯?shí)現(xiàn)上機(jī)實(shí)習(xí)第18頁/共20頁voidListInsert_L(LinkList&L,L

溫馨提示

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

評論

0/150

提交評論