版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)教材
李春葆數(shù)據(jù)結(jié)構(gòu)教程清華大學出版社嚴蔚敏數(shù)據(jù)結(jié)構(gòu)清華大學出版社參考書
李春葆數(shù)據(jù)結(jié)構(gòu)習題與解析(第2版或第3版)清華大學出版社第1頁概述模塊1:線性表模塊2:樹型結(jié)構(gòu)模塊3:圖型結(jié)構(gòu)模塊4:其它第2頁1.數(shù)據(jù)結(jié)構(gòu)定義
數(shù)據(jù)→數(shù)據(jù)元素→數(shù)據(jù)項數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)以及相互之間聯(lián)絡(luò)(或關(guān)系)。包含:(1)數(shù)據(jù)邏輯結(jié)構(gòu)。(2)數(shù)據(jù)存放結(jié)構(gòu)(物理結(jié)構(gòu))。(3)施加在該數(shù)據(jù)上運算。
概述第3頁
數(shù)據(jù)邏輯結(jié)構(gòu)是從邏輯關(guān)系上描述數(shù)據(jù),它與數(shù)據(jù)存放無關(guān),是獨立于計算機。數(shù)據(jù)存放結(jié)構(gòu)是邏輯結(jié)構(gòu)用計算機語言實現(xiàn)(亦稱為映象),它是依賴于計算機語言。數(shù)據(jù)運算是定義在數(shù)據(jù)邏輯結(jié)構(gòu)上,每種邏輯結(jié)構(gòu)都有一組對應(yīng)運算。但運算實現(xiàn)與數(shù)據(jù)存放結(jié)構(gòu)相關(guān)。程序=數(shù)據(jù)結(jié)構(gòu)+算法概述第4頁(1)線性結(jié)構(gòu)(2)樹形結(jié)構(gòu)(3)圖形結(jié)構(gòu)概述邏輯結(jié)構(gòu)主要有三大類:第5頁存放結(jié)構(gòu)分為以下四種:(1)次序存放方法(2)鏈式存放方法(3)索引存放方法(4)散列存放方法
概述第6頁2.算法
算法是對特定問題求解步驟一個描述,它是指令有限序列。概述第7頁算法五個主要特征:(1)有窮性(2)確定性(3)可行性(4)有輸入(5)有輸出
概述第8頁
算法時間復雜度:是指其基本運算在算法中重復執(zhí)行次數(shù)。
算法中基本運算次數(shù)T(n)是問題規(guī)模n某個函數(shù)f(n),記作:T(n)=O(f(n))記號“O”讀作“大O”,它表示隨問題規(guī)模n增大算法執(zhí)行時間增加率和f(n)增加率相同。
概述第9頁例分析以下程序段時間復雜度。i=1;while(i<=n)i=i*2;解:上述算法中基本操作是語句i=i*2,設(shè)其頻度為T(n),則有:2T(n)≤n即T(n)≤log2n=O(log2n)。所以,該程序段時間復雜度為O(log2n)。第10頁
算法空間復雜度:是對一個算法在運行過程中暫時占用存放空間大小量度。
對于空間復雜度為O(1)算法稱為原地工作或就地工作算法。
概述第11頁■遞歸定義3.算法設(shè)計方法:遞歸在定義一個算法時出現(xiàn)調(diào)用本算法成份,稱之為遞歸。概述第12頁■遞歸模型由遞歸出口和遞歸體組成比如,求二叉樹全部結(jié)點個數(shù):f(b)=0 b=NULLf(b)=f(b->lchild)+f(b->rchild)+1b≠NULL概述第13頁■遞歸算法設(shè)計①對原問題f(s)進行分析,假設(shè)出合理“較小問題”f(s');②假設(shè)f(s')是可解,在此基礎(chǔ)上確定f(s)解,即給出f(s)與f(s')之間關(guān)系;③確定一個特定情況(如f(1)或f(0))解,由此作為遞歸出口.概述第14頁bb->rchildb->lchild①假設(shè)出合理“較小問題”:假設(shè)左右子樹結(jié)點個數(shù)可求②求出f(s)與f(s‘)之間關(guān)系:f(b)=f(b->lchild)+f(b->rchild)+1③確定遞歸出口:f(NULL)=0概述第15頁intf(BTNode*b){if(b==NULL)return(0);elsereturn(f(b->lchild)+f(b->rchild)+1);}求解算法:概述第16頁例設(shè)計求f(n)=1+2+...+n遞歸算法解:f(n)為前n項之和,則f(n-1)=1+2+...+(n-1)假設(shè)f(n-1)可求,則f(n)=f(n-1)+n,所以:f(n)=1 當n=1f(n)=f(n-1)+n當n>1對應(yīng)遞歸算法以下:第17頁intf(intn){if(n==1)return(1);elsereturn(f(n-1)+n));}第18頁1.普通線性表線性表:含有相同特征數(shù)據(jù)元素一個有限序列。不是集合。模塊1:線性結(jié)構(gòu)邏輯結(jié)構(gòu)第19頁(1)次序表
typedefstruct{ ElemTypeelem[MaxSize]; /*存放次序表元素*/ intlength; /*存放次序表長度*/}SqList;存放結(jié)構(gòu)之一模塊1:線性結(jié)構(gòu)第20頁次序表基本運算實現(xiàn)
插入數(shù)據(jù)元素算法:元素移動次數(shù)不但與表長n相關(guān);插入一個元素時所需移動元素平均次數(shù)n/2。平均時間復雜度為O(n)。
模塊1:線性結(jié)構(gòu)第21頁
刪除數(shù)據(jù)元素算法:元素移動次數(shù)也與表長n相關(guān)。刪除一個元素時所需移動元素平均次數(shù)為(n-1)/2。刪除算法平均時間復雜度為O(n)。模塊1:線性結(jié)構(gòu)第22頁(2)鏈表
定義單鏈表結(jié)點類型:typedefstructLNode{ElemTypedata;structLNode*next; /*指向后繼結(jié)點*/}LinkList;存放結(jié)構(gòu)之二模塊1:線性結(jié)構(gòu)第23頁定義雙鏈表結(jié)點類型:typedefstructDNode {ElemTypedata;structDNode*prior; /*指向前驅(qū)結(jié)點*/structDNode*next; /*指向后繼結(jié)點*/}DLinkList;模塊1:線性結(jié)構(gòu)第24頁
■單鏈表基本運算實現(xiàn)
重點:(1)頭插法建表和尾插法建表算法,它是很多算法設(shè)計基礎(chǔ);(2)查找、插入和刪除操作。模塊1:線性結(jié)構(gòu)第25頁
頭插法建表該方法從一個空表開始,讀取字符數(shù)組a中字符,生成新結(jié)點,將讀取數(shù)據(jù)存放到新結(jié)點數(shù)據(jù)域中,然后將新結(jié)點插入到當前鏈表表頭上,直到結(jié)束為止。采取頭插法建表算法以下:模塊1:線性結(jié)構(gòu)第26頁voidCreateListF(LinkList*&L,ElemTypea[],intn){LinkList*s;inti;L=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建頭結(jié)點*/L->next=NULL;for(i=0;i<n;i++){s=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建新結(jié)點*/s->data=a[i];s->next=L->next; /*將*s插在原開始結(jié)點之前,頭結(jié)點之后*/L->next=s;}}模塊1:線性結(jié)構(gòu)第27頁adcbi=0i=1i=2i=3∧head采取頭插法建立單鏈表過程heada∧headda∧headcda∧headbcda∧第1步:建頭結(jié)點第2步:i=0,新建a結(jié)點,插入到頭結(jié)點之后第3步:i=1,新建d結(jié)點,插入到頭結(jié)點之后第4步:i=2,新建c結(jié)點,插入到頭結(jié)點之后第5步:i=3,新建b結(jié)點,插入到頭結(jié)點之后第28頁
尾插法建表
頭插法建立鏈表即使算法簡單,但生成鏈表中結(jié)點次序和原數(shù)組元素次序相反。若希望二者次序一致,可采取尾插法建立。該方法是將新結(jié)點插到當前鏈表表尾上,為此必須增加一個尾指針r,使其一直指向當前鏈表尾結(jié)點。采取尾插法建表算法以下:模塊1:線性結(jié)構(gòu)第29頁voidCreateListR(LinkList*&L,ElemTypea[],intn){LinkList*s,*r;inti;L=(LinkList*)malloc(sizeof(LinkList)); /*創(chuàng)建頭結(jié)點*/L->next=NULL;r=L;/*r一直指向終端結(jié)點,開始時指向頭結(jié)點*/for(i=0;i<n;i++){s=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建新結(jié)點*/s->data=a[i];r->next=s;/*將*s插入*r之后*/r=s;}r->next=NULL; /*終端結(jié)點next域置為NULL*/}第30頁adcbi=0i=1i=2i=3head頭結(jié)點adcbb∧采取尾插法建立單鏈表過程模塊1:線性結(jié)構(gòu)第31頁
例設(shè)C={a1,b1,a2,b2,…,an,bn}為一線性表,采取帶頭結(jié)點hc單鏈表存放,編寫一個算法,將其拆分為兩個線性表,使得:A={a1,a2,…,an},B={b1,b2,…,bn}模塊1:線性結(jié)構(gòu)第32頁
解:設(shè)拆分后兩個線性表都用帶頭結(jié)點單鏈表存放。先建立兩個頭結(jié)點*ha和*hb,它們用于存放拆分后線性表A和B,ra和rb分別指向這兩個單鏈表表尾,用p指針掃描單鏈表hc,將當前結(jié)點*p鏈到ha未尾,p沿next域下移一個結(jié)點,若不為空,則當前結(jié)點*p鏈到hb未尾,p沿next域下移一個結(jié)點,如此這么,直到p為空。最終將兩個尾結(jié)點next域置空。對應(yīng)算法以下:模塊1:線性結(jié)構(gòu)第33頁voidfun(LinkList*hc,LinkList*&ha,LinkList*&hb){LinkList*p=hc->next,*ra,*rb;ha=hc; /*ha頭結(jié)點利用hc頭結(jié)點*/ra=ha;/*ra一直指向ha末尾結(jié)點*/hb=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建hb頭結(jié)點*/rb=hb;/*rb一直指向hb末尾結(jié)點*/模塊1:線性結(jié)構(gòu)第34頁while(p!=NULL){ra->next=p;ra=p;/*將*p鏈到ha單鏈表未尾*/p=p->next;rb->next=p;rb=p; /*將*p鏈到hb單鏈表未尾*/p=p->next;}ra->next=rb->next=NULL;/*兩個尾結(jié)點next域置空*/}模塊1:線性結(jié)構(gòu)第35頁例已知線性表元素遞增有序,并以帶頭結(jié)點單鏈表作存放結(jié)構(gòu),設(shè)計一個高效算法,刪除表中全部值大于mink且小于maxk元素(若表中存在這么元素)。并分析所寫算法時間復雜度。模塊1:線性結(jié)構(gòu)第36頁
解:先在單鏈表中找到其data值則好大于mink結(jié)點*p,其前驅(qū)結(jié)點為*pre。繼續(xù)沿next鏈查找其值大于maxk結(jié)點,在這個過程中刪除*p結(jié)點。算法以下:
voiddelnode(SNode*h,ElemTypemaxk,ElemTypemink){ SNode*p,*pre; if(maxk>=mink) {pre=h; p=pre->next;模塊1:線性結(jié)構(gòu)第37頁while(p!=NULL&&p->data<=mink) {pre=p;p=p->next; } while(p!=NULL&&p->data<maxk)//刪除*p { pre->next=p->next; free(p); p=pre->next; } }}模塊1:線性結(jié)構(gòu)第38頁
■雙鏈表基本運算實現(xiàn)
重點:插入和刪除結(jié)點算法。模塊1:線性結(jié)構(gòu)第39頁
■循環(huán)鏈表基本運算實現(xiàn)
重點:判斷最終一個結(jié)點。模塊1:線性結(jié)構(gòu)第40頁例某線性表最慣用操作是在最終一個結(jié)點之后插入一個結(jié)點或刪除第一個結(jié)點,故采取
存放方式最節(jié)約運算時間。A.單鏈表 B.僅有頭結(jié)點單循環(huán)鏈表C.雙鏈表 D.僅有尾指針單循環(huán)鏈表模塊1:線性結(jié)構(gòu)第41頁例設(shè)計一個算法在單鏈表中查找元素值為e結(jié)點序號算法LocateElem(L,e)。思緒:在單鏈表L中從頭開始找第1個值域與e相等結(jié)點,若存在這么結(jié)點,則返回位置,不然返回0。
intLocateElem(LinkList*L,ElemTypee){ LinkList*p=L->next;intn=1; while(p!=NULL&&p->data!=e) {p=p->next;n++;} if(p==NULL)return(0); elsereturn(n);}第42頁解:本題答案為D。在有尾指針r單循環(huán)鏈表中在最終一個結(jié)點之后插入結(jié)點*s操作是:s->next=r->next;r->next=s;r=s。刪除第一個結(jié)點操作是:p=r->next;r->next=p->next;free(p)。其時間復雜度均為O(1)。模塊1:線性結(jié)構(gòu)第43頁2.棧
(1)棧定義棧是一個先進后出表?;具\算:進棧,出棧。邏輯結(jié)構(gòu)模塊1:線性結(jié)構(gòu)第44頁
例已知一個棧進棧序列是1,2,3,…,n,其輸出序列是p1,p2,…,pn,若p1=n,則pi值
。 (A)i (B)n-i (C)n-i+1 (D)不確定答:當p1=n時,輸出序列必是n,n-1,…,3,2,1,則有:p2=n-1,p3=n-2,…,pn=1推斷出pi=n-i+1,所以本題答案為C。第45頁
例設(shè)n個元素進棧序列是1,2,3,…,n,其輸出序列是p1,p2,…,pn,若p1=3,則p2值
。 (A)一定是2 (B)一定是1 (C)不可能是1 (D)以上都不對答:當p1=3時,說明1,2,3先進棧,馬上出棧3,然后可能出棧,即為2,也可能4或后面元素進棧,再出棧。所以,p2可能是2,也可能是4,…,n,但一定不能是1。所以本題答案為C。模塊1:線性結(jié)構(gòu)第46頁(2)次序棧typedefstruct{ ElemTypeelem[MaxSize];inttop; /*棧指針*/}SqStack;存放結(jié)構(gòu)之一模塊1:線性結(jié)構(gòu)第47頁??諚l件:s.top==-1棧滿條件:s.top==MaxSize-1進棧:top++;s.data[s.top]=e;出棧:e=s.data[s.top];s.top—;
次序棧4要素:模塊1:線性結(jié)構(gòu)第48頁(3)鏈棧
typedefstructlinknode{ ElemTypedata; /*數(shù)據(jù)域*/structlinknode*next; /*指針域*/}LiStack;存放結(jié)構(gòu)之二模塊1:線性結(jié)構(gòu)第49頁帶頭結(jié)點單鏈表來實現(xiàn)(也可不帶頭結(jié)點)棧空條件:s->next==NULL棧滿條件:?模塊1:線性結(jié)構(gòu)第50頁3.隊列
(1)隊列定義
隊列是一個先進先出表。隊列基本運算:進隊,出隊邏輯結(jié)構(gòu)模塊1:線性結(jié)構(gòu)第51頁(2)次序隊typedefstruct{ ElemTypeelem[MaxSize];intfront,rear;/*隊首和隊尾指針*/}SqQueue;
存放結(jié)構(gòu)之一模塊1:線性結(jié)構(gòu)第52頁隊空:q.front==q.rear隊滿:(q.rear+1)%MaxSize==q.front進隊:q.rear=(q.rear+1)%MaxSize;q.data[q.rear]=e;出隊:q.front=(q.front+1)%MaxSize;e=q.data[q.front];
環(huán)形隊列4要素:模塊1:線性結(jié)構(gòu)第53頁(3)鏈隊structqnode/*數(shù)據(jù)結(jié)點*/{ElemTypedata;structqnode*next;}QNode;typedefstruct/*頭結(jié)點*/{QNode*front;QNode*rear;}LiQueue;存放結(jié)構(gòu)之二模塊1:線性結(jié)構(gòu)第54頁(2)次序串
(3)鏈串
(4)串模式匹配算法(不作要求)4.串(1)串定義
串、子串、串相等、空串、空格串模塊1:線性結(jié)構(gòu)第55頁5.數(shù)組和稀疏矩陣
(1)數(shù)組定義相同類型數(shù)據(jù)元素、有限序列模塊1:線性結(jié)構(gòu)第56頁(2)數(shù)組存放結(jié)構(gòu)
以行序為主序:LOC(ai,j)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+(j-c2)]*k
以列序為主序LOC(ai,j)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+(i-c1)]*k
以數(shù)組A[c1..d1,c2..d2]為例模塊1:線性結(jié)構(gòu)第57頁(3)特殊矩陣壓縮存放■對稱矩陣
若一個n階方陣A[n][n]中元素滿足ai,j=aj,i(0≤i,j≤n-1),則稱其為n階對稱矩陣。
A[0..n-1][0..n-1]
B[0..n(n+1)/2]
i(i+1)/2+j 當i≥j時k=j(j+1)/2+i 當i<j時模塊1:線性結(jié)構(gòu)第58頁■三角矩陣
采取類似壓縮方法.模塊1:線性結(jié)構(gòu)第59頁(4)稀疏矩陣存放結(jié)構(gòu):■三元組表示■十字鏈表表示
各種表示基本思緒。非零元素遠小于元素總數(shù)。模塊1:線性結(jié)構(gòu)第60頁
■一個廣義表中所含元素個數(shù)稱為它長度.6.廣義表GL=(a,(a),(a,b,c,d),())長度為4。模塊1:線性結(jié)構(gòu)第61頁
■一個廣義表中括號嵌套最大次數(shù)為它深度.GL=(a,(a),(a,b,c,d),())深度為2。模塊1:線性結(jié)構(gòu)第62頁
■表第一個元素a1為廣義表GL表頭,其余部分(a2,…,ai,ai+1,…,an)為GL表尾.
GL=(a,(a),(a,b,c,d),())表頭為a,表尾為((a),(a,b,c,d),())模塊1:線性結(jié)構(gòu)第63頁模塊2:樹形結(jié)構(gòu)
(1)樹定義遞歸定義適合于表示層次結(jié)構(gòu)數(shù)據(jù)1.樹第64頁(2)樹表示法(邏輯表示方法)■樹形表示法■文氏圖表示法■凹入表示法■括號表示法模塊2:樹形結(jié)構(gòu)
第65頁(3)樹遍歷■先根遍歷算法■后根遍歷算法模塊2:樹形結(jié)構(gòu)
第66頁(4)樹和二叉樹相互轉(zhuǎn)換■樹二叉樹■二叉樹樹模塊2:樹形結(jié)構(gòu)
第67頁2.二叉樹
(1)二叉樹定義根、左子樹、右子樹完全二叉樹,滿二叉樹定義模塊2:樹形結(jié)構(gòu)
第68頁
性質(zhì)1非空二叉樹上葉結(jié)點數(shù)等于雙分支結(jié)點數(shù)加1。即n0=n2+1.
性質(zhì)2非空二叉樹上第i層上至多有2i-1個結(jié)點(i≥1)。(2)二叉樹性質(zhì)模塊2:樹形結(jié)構(gòu)
第69頁
性質(zhì)3高度為h二叉樹至多有2h-1個結(jié)點(h≥1)。
性質(zhì)4完全二叉樹性質(zhì)。
性質(zhì)5含有n個(n>0)結(jié)點完全二叉樹高度為
log2n+1
或
log2n
+1。(2)二叉樹性質(zhì)模塊2:樹形結(jié)構(gòu)
第70頁
例將一棵有99個結(jié)點完全二叉樹從根這一層開始,每一層從左到右依次對結(jié)點進行編號,根結(jié)點編號為1,則編號為49結(jié)點右孩子編號為
。
A.98B.99C.50D.不存在
答:D模塊2:樹形結(jié)構(gòu)
第71頁例
深度為5二叉樹至多有
個結(jié)點。
A.16B.32C.31D.10
答:相同滿度時滿二叉樹結(jié)點最多,h=5滿二叉樹結(jié)點個數(shù)=25-1=31。C。模塊2:樹形結(jié)構(gòu)
第72頁(3)二叉樹存放結(jié)構(gòu)
■二叉樹次序存放結(jié)構(gòu)模塊2:樹形結(jié)構(gòu)
ABCDEF1234567891011121314ABCDEF第73頁i2i2i+1左孩子右孩子第74頁■二叉鏈存放結(jié)構(gòu)
typedefstructnode{ ElemTypedata; /*數(shù)據(jù)元素*/ structnode*lchild;/*指向左孩子*/ structnode*rchild;/*指向右孩子*/}BTNode;第75頁ABC左孩子右孩子第76頁(4)二叉樹遍歷
■先序遍歷■中序遍歷■后序遍歷■層次遍歷通慣用遞歸算法實現(xiàn)通慣用隊列來實現(xiàn)模塊2:樹形結(jié)構(gòu)
第77頁例假設(shè)二叉樹采取二叉鏈存放結(jié)構(gòu)存放,試設(shè)計一個算法,輸出一棵給定二叉樹全部葉子結(jié)點。解:輸出一棵二叉樹全部葉子結(jié)點遞歸模型f()以下:f(b):不做任何事件 若b=NULLf(b):輸出*b結(jié)點data域若*b為葉子結(jié)點f(b):f(b->lchild);f(b->rchild) 其它情況模塊2:樹形結(jié)構(gòu)
第78頁
voidDispLeaf(BTNode*b){if(b!=NULL){ if(b->lchild==NULL&&b->rchild==NULL) printf("%c",b->data); DispLeaf(b->lchild); DispLeaf(b->rchild);}}模塊2:樹形結(jié)構(gòu)
先序遍歷思想第79頁例試設(shè)計判斷兩棵二叉樹是否相同算法,所謂二叉樹t1和t2是相同指是t1和t2都是空二叉樹;或者t1和t2根結(jié)點是相同,t1左子樹和t2左子樹是相同且t1右子樹與t2右子樹是相同。模塊2:樹形結(jié)構(gòu)
第80頁解本題遞歸模型以下:true 若t1=t2=NULLf(t1,t2)=false 若t1、t2之一為NULL,另一不為NULLf(t1->lchild,t2->lchild)&&f(t1->rchild,t2->rchild) 其它情況
對應(yīng)算法以下:模塊2:樹形結(jié)構(gòu)
第81頁intlike(BTNode*b1,BTNode*b2){ intlike1,like2; if(b1==NULL&&b2==NULL) return1; elseif(b1==NULL||b2==NULL) return0; else {like1=like(b1->lchild,b2->lchild); like2=like(b1->rchild,b2->rchild); return(like1&like2); }}模塊2:樹形結(jié)構(gòu)
后序遍歷思想第82頁例設(shè)計一個算法求二叉樹全部結(jié)點個數(shù)。解:對應(yīng)算法以下:intnodenum(BTNode*bt){if(bt!=NULL)return(nodenum(bt->lchild)+nodenum(bt->lchild)+1);elsereturn(0);}模塊2:樹形結(jié)構(gòu)
后序遍歷思想第83頁例設(shè)計一個算法釋放一棵二叉樹bt全部結(jié)點。解:算法以下:voidrelease(BSTNode*&bt){if(bt!=NULL){release(bt->lchild);release(bt->rchild);free(bt);}}模塊2:樹形結(jié)構(gòu)
后序遍歷思想第84頁(5)線索二叉樹
共有2n-(n-1)=n+1個空鏈域線索化模塊2:樹形結(jié)構(gòu)
線索化與某種遍歷方式相關(guān)第85頁3.哈夫曼樹(1)哈夫曼樹定義WPL最小,沒有單分支結(jié)點即n1=0模塊2:樹形結(jié)構(gòu)
第86頁(2)哈夫曼樹結(jié)構(gòu)過程(3)哈夫曼編碼結(jié)構(gòu)過程模塊2:樹形結(jié)構(gòu)
第87頁■頂點度、入度和出度■完全圖■子圖■路徑和路徑長度■連通、連通圖和連通分量■強連通圖和強連通分量■權(quán)和網(wǎng)
模塊3:圖形結(jié)構(gòu)(1)圖基本概念第88頁(2)圖存放結(jié)構(gòu)■鄰接矩陣存放方法
掌握兩種存放方法優(yōu)缺點,同一個功效在不一樣存放結(jié)構(gòu)上實現(xiàn)算法?!鲟徑颖泶娣欧椒K3:圖形結(jié)構(gòu)第89頁(3)圖遍歷
■深度優(yōu)先搜索遍歷
離初始點越遠越優(yōu)先訪問。1267354訪問序列:1,2,3,4,5,6,7模塊3:圖形結(jié)構(gòu)第90頁voidDFS(ALGraph*G,intv){ArcNode*p;Visited[v]=1;/*置已訪問標識*/printf("%d",v); /*輸出被訪問頂點編號*/p=G->adjlist[v].firstarc;while(p!=NULL){if(visited[p->adjvex]==0) DFS(G,p->adjvex);p=p->nextarc; }}模塊3:圖形結(jié)構(gòu)第91頁1267354■廣度優(yōu)先搜索遍歷
離初始點越近越優(yōu)先訪問。訪問序列:1,2,6,7,3,5,4模塊3:圖形結(jié)構(gòu)第92頁voidBFS(ALGraph*G,intv){ ArcNode*p; intqueue[MAXV],front=0,rear=0; intvisited[MAXV];intw,i; for(i=0;i<G->n;i++)visited[i]=0; printf("%2d",v); visited[v]=1; /*置已訪問標識*/ rear=(rear+1)%MAXV; queue[rear]=v;/*v進隊*/模塊3:圖形結(jié)構(gòu)第93頁 while(front!=rear)/*若隊列不空時循環(huán)*/ { front=(front+1)%MAXV; w=queue[front];/*出隊并賦給w*/ p=G->adjlist[w].firstarc; while(p!=NULL) {if(visited[p->adjvex]==0) {printf("%2d",p->adjvex); visited[p->adjvex]=1; rear=(rear+1)%MAXV; queue[rear]=p->adjvex; } p=p->nextarc; } }}模塊3:圖形結(jié)構(gòu)第94頁例試以鄰接表為存放結(jié)構(gòu),分別寫出基于DFS和BPS遍歷算法來判別頂點i和頂點j(i≠j)之間是否有路徑。解:先置全局變量visited[]為0,然后從頂點i開始進行某種遍歷,遍歷之后,若visited[j]=0,說明頂點i與頂點j之間沒有路徑;不然說明它們之間存在路徑。模塊3:圖形結(jié)構(gòu)第95頁基于DFS遍歷算法以下:intvisited[MaxVertexNum];intDFSTrave(ALGraph*G,inti,intj){intk;for(k=0;k<G->n;k++)visited[k]=0;DFS(G,i);//從頂點i開始進行深度優(yōu)先遍歷if(visited[j]==0)return0;elsere
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 血液制品質(zhì)量監(jiān)控技術(shù)-洞察分析
- 2023-2024年項目管理人員安全培訓考試題含答案(培優(yōu)B卷)
- 2023年項目安全培訓考試題【培優(yōu)】
- 2023-2024年項目管理人員安全培訓考試題附參考答案【綜合題】
- 2023年-2024年安全管理人員安全教育培訓試題帶答案(精練)
- 音樂教育在線教學資源-洞察分析
- 心電監(jiān)護設(shè)備用戶體驗-洞察分析
- 施工現(xiàn)場抑制粉塵措施
- 土方開挖工程質(zhì)量安全文明施工和環(huán)境保護措施
- 施工總體進度計劃及保障措施
- 智研咨詢發(fā)布-中國醫(yī)學影像診斷中心行業(yè)現(xiàn)狀、發(fā)展環(huán)境及投資前景分析報告
- 員工宿舍固定資產(chǎn)管理制度
- 2023中國人工智能系列白皮書-大模型技術(shù)(2023版)
- 2024中考語文《朝花夕拾》歷年真題專練(學生版+解析版)
- 智慧水務(wù)行業(yè)發(fā)展報告2024-2025
- 2024年7月國家開放大學??啤渡鐣{(diào)查研究與方法》期末紙質(zhì)考試試題及答案
- 《陸上風力發(fā)電建設(shè)工程質(zhì)量監(jiān)督檢查大綱》
- 自來水外管網(wǎng)維修工程施工組織設(shè)計方案
- 醫(yī)學針灸推拿學考研模擬習題及參考答案
- 2024年包頭職業(yè)技術(shù)學院單招職業(yè)適應(yīng)性測試題庫及答案1套
- 人教部編版八年級數(shù)學上冊期末考試卷及答案一
評論
0/150
提交評論