

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù) 據(jù) 結(jié) 構(gòu) 課 程 設(shè) 計(jì)</p><p> 設(shè)計(jì)題目: 圖的鄰接表存儲(chǔ)及其應(yīng)用 </p><p> 課題名稱圖的鄰接表存儲(chǔ)及其應(yīng)用</p><p> 院 系年級(jí)專業(yè)</p><p> 學(xué) 號(hào)</p><p> 課題設(shè)計(jì)目的與設(shè)計(jì)意義課題設(shè)計(jì)目的:一、是讓我們通過實(shí)習(xí)
2、掌握《數(shù)據(jù)結(jié)構(gòu)》中的知識(shí)。對(duì)于《圖的遍歷》這一課題來說,所要求掌握的數(shù)據(jù)結(jié)構(gòu)知識(shí)主要有:圖的鄰接表存貯結(jié)構(gòu)、隊(duì)列的基本運(yùn)算實(shí)現(xiàn)、鄰接表的算法實(shí)現(xiàn)、圖的廣度優(yōu)先搜索、圖的深度優(yōu)先搜索算法實(shí)現(xiàn)。 二、是通過實(shí)習(xí)鞏固并提高實(shí)習(xí)者的C語言知識(shí),并初步了解C++的知識(shí),提高編程能力與專業(yè)水平。2、課題設(shè)計(jì)意義:一、通過對(duì)鄰接表表示圖及深廣度優(yōu)先遍歷程序的編寫,對(duì)數(shù)據(jù)結(jié)構(gòu)的理解更為加深。二、培養(yǎng)了我們獨(dú)立設(shè)計(jì)程序與解決問
3、題的能力,培養(yǎng)了我們團(tuán)隊(duì)協(xié)作集成程序模塊及調(diào)試能力。三、培養(yǎng)了學(xué)生初步的軟件設(shè)計(jì)及軟件測試的能力。指導(dǎo)教師:年 月 日</p><p><b> 目 錄</b></p><p> 第一章 課程設(shè)計(jì)目的1</p><p> 第二章 課程設(shè)計(jì)內(nèi)容和要求1</p><p> 2.1課程設(shè)計(jì)內(nèi)容1&l
4、t;/p><p> 2.1.1圖的鄰接表的建立與輸出1</p><p> 2.1.2 圖的遍歷的實(shí)現(xiàn)1</p><p> 2.2 運(yùn)行環(huán)境1</p><p> 第三章 課程設(shè)計(jì)分析2</p><p><b> 3.1圖的存儲(chǔ)2</b></p><p> 3
5、.2 圖的遍歷2</p><p> 3.2.1 圖的深度優(yōu)先遍歷2</p><p> 3.2.2 圖的廣度優(yōu)先遍歷2</p><p> 第四章 算法(數(shù)據(jù)結(jié)構(gòu))描述3</p><p> 4.1 圖的存儲(chǔ)結(jié)構(gòu)的建立。3</p><p> 4.1.1 定義鄰接表的邊結(jié)點(diǎn)類型以及鄰接表類型3</p
6、><p> 4.1.2 初始化圖的鄰接表3</p><p> 4.1.3 建立并輸出圖的鄰接表3</p><p> 4.2 圖的遍歷5</p><p> 4.2.1 深度優(yōu)先遍歷圖的鄰接表5</p><p> 4.2.2 廣度優(yōu)先遍歷圖的鄰接表6</p><p><b>
7、; 第五章 源代碼7</b></p><p> 第六章 運(yùn)行結(jié)果分析13</p><p> 第七章 結(jié)束語17</p><p> 第八章 參考文獻(xiàn)19</p><p> 第一章 課程設(shè)計(jì)目的</p><p> 本學(xué)期我們對(duì)《數(shù)據(jù)結(jié)構(gòu)》這門課程進(jìn)行了學(xué)習(xí)。這門課程是一門實(shí)踐性非常強(qiáng)的課程,
8、為了讓大家更好地理解與運(yùn)用所學(xué)知識(shí),提高動(dòng)手能力,我們進(jìn)行了此次課程設(shè)計(jì)實(shí)習(xí)。這次課程設(shè)計(jì)不但要求實(shí)習(xí)者掌握《數(shù)據(jù)結(jié)構(gòu)》中的各方面知識(shí),還要求實(shí)習(xí)者具備一定的C語言基礎(chǔ)和編程能力。</p><p> 具體說來,這次課程設(shè)計(jì)主要有兩大方面目的。</p><p> 一是讓實(shí)習(xí)者通過實(shí)習(xí)掌握《數(shù)據(jù)結(jié)構(gòu)》中的知識(shí)。對(duì)于《圖的遍歷》這一課題來說,所要求掌握的數(shù)據(jù)結(jié)構(gòu)知識(shí)主要有:圖的鄰接表存貯結(jié)構(gòu)
9、、隊(duì)列的基本運(yùn)算實(shí)現(xiàn)、鄰接表的算法實(shí)現(xiàn)、圖的廣度優(yōu)先搜索周游算法實(shí)現(xiàn)、圖的深度優(yōu)先搜索周游算法實(shí)現(xiàn)。</p><p> 二是通過實(shí)習(xí)鞏固并提高實(shí)習(xí)者的C語言知識(shí),并初步了解Visual C++的知識(shí),提高其編程能力與專業(yè)水平。</p><p> 第二章 課程設(shè)計(jì)內(nèi)容和要求</p><p><b> 2.1課程設(shè)計(jì)內(nèi)容</b></p&
10、gt;<p> 該課題要求以鄰接表的方式存儲(chǔ)圖,輸出鄰接表,并要求實(shí)現(xiàn)圖的深度、廣度兩種遍歷。</p><p> 2.1.1圖的鄰接表的建立與輸出</p><p> 對(duì)任意給定的圖(頂點(diǎn)數(shù)和邊數(shù)自定),并且對(duì)有向圖與無向圖都應(yīng)進(jìn)行討論,根據(jù)鄰接表的存儲(chǔ)結(jié)構(gòu)建立圖的鄰接表并輸出之。盡量用圖形化的方式輸出鄰接表。</p><p> 2.1.2 圖的
11、遍歷的實(shí)現(xiàn)</p><p> 圖的遍歷包括圖的廣度優(yōu)先遍歷與深度優(yōu)先遍歷。對(duì)于廣度優(yōu)先遍歷應(yīng)利用隊(duì)列的五種基本運(yùn)算(置空隊(duì)列、進(jìn)隊(duì)、出隊(duì)、取隊(duì)頭元素、判隊(duì)空)來實(shí)現(xiàn)。首先建立一空隊(duì)列,從初始點(diǎn)出發(fā)進(jìn)行訪問,當(dāng)被訪問時(shí)入隊(duì),訪問完出隊(duì)。并以隊(duì)列是否為空作為循環(huán)控制條件。對(duì)于深度優(yōu)先遍歷則采用遞歸或非遞歸算法來實(shí)現(xiàn)。</p><p><b> 2.2 運(yùn)行環(huán)境</b>
12、</p><p> 該程序的運(yùn)行環(huán)境為Windows xp系統(tǒng),Microsoft Visual C++6.0版本。</p><p> 第三章 課程設(shè)計(jì)分析</p><p><b> 3.1圖的存儲(chǔ)</b></p><p> 本課題要求采取鄰接表的存儲(chǔ)結(jié)構(gòu)。鄰接表是一種鏈?zhǔn)降拇鎯?chǔ)結(jié)構(gòu),在鄰接表中,對(duì)圖中每個(gè)頂點(diǎn)建
13、立一個(gè)單鏈表,第i個(gè)單鏈表中的結(jié)點(diǎn)表示依附于頂點(diǎn)Vi的邊(對(duì)有向圖是以頂點(diǎn)Vi為尾的在圖中的位置,鏈域(nextarc)指示下一條?。?。每個(gè)結(jié)點(diǎn)由3個(gè)域組成,其中鄰接點(diǎn)域(adjvex)指示與頂點(diǎn)Vi鄰接的點(diǎn)在圖中的位置,鏈域(nextarc)指示下一條邊或弧的結(jié)點(diǎn);數(shù)據(jù)域(info)存儲(chǔ)和邊或弧相關(guān)的信息,如權(quán)值等。</p><p> 所以一開始必須先定義鄰接表的邊結(jié)點(diǎn)類型以及鄰接表類型,并對(duì)鄰接表進(jìn)行初始化
14、,然后根據(jù)所輸入的相關(guān)信息,包括圖的頂點(diǎn)數(shù)、邊數(shù)、是否為有向,以及各條邊的起點(diǎn)與終點(diǎn)序號(hào),建立圖的鄰接表。此時(shí)要分兩種情況:有向圖與無向圖。對(duì)于無向圖,一條邊的兩的個(gè)頂點(diǎn),互為鄰接點(diǎn),所以在存儲(chǔ)時(shí),應(yīng)向起點(diǎn)的單鏈表表頭插入一邊結(jié)點(diǎn),即終點(diǎn)。同時(shí)將終點(diǎn)的單鏈表表頭插入一邊結(jié)點(diǎn),即起點(diǎn)。對(duì)于有向圖,只能向起點(diǎn)的單鏈表的表頭插入一個(gè)邊結(jié)點(diǎn),即終點(diǎn)。但不能反過來。至于鄰接表的輸出,由于不了解C++中的繪圖操作,故采用for語句輸出各結(jié)點(diǎn),并配合
15、一些符號(hào)完成鄰接表的輸出。</p><p><b> 3.2 圖的遍歷</b></p><p> 3.2.1 圖的深度優(yōu)先遍歷</p><p> 假設(shè)初始狀態(tài)是圖中所有頂點(diǎn)未曾被訪問,深度優(yōu)先遍歷可以從圖的初始點(diǎn)出發(fā),訪問初始點(diǎn),然后依次從v未被訪問的鄰接點(diǎn)出發(fā)深度優(yōu)先遍歷圖,直至圖中所有和v有路徑相通的頂點(diǎn)都被訪問到;若此時(shí)仍有頂點(diǎn)未被
16、訪問到,則從另一個(gè)未被訪問的頂點(diǎn)出發(fā),重復(fù)上述過程,直至所有點(diǎn)都被訪問到為止。這是一個(gè)遞歸的過程。所以在實(shí)現(xiàn)深度優(yōu)先遍歷的過程中必須遞歸調(diào)用深度優(yōu)先搜索函數(shù)。而且在深度優(yōu)先搜索函數(shù)中必須設(shè)一標(biāo)志數(shù)組以標(biāo)記結(jié)點(diǎn)是否被訪問。</p><p> 具體過程應(yīng)為:先訪問初始點(diǎn)Vi,并標(biāo)志其已被訪問。此時(shí)定義一指向邊結(jié)點(diǎn)的指針p,并建立一個(gè)while()循環(huán),以指針?biāo)笇?duì)象不為空為控制條件,當(dāng)Vi的鄰接點(diǎn)未被訪問時(shí),遞歸調(diào)
17、用深度優(yōu)先遍歷函數(shù)訪問之。然后將p指針指向下一個(gè)邊結(jié)點(diǎn)。這樣就可以完成圖的深度優(yōu)先遍歷了。</p><p> 3.2.2 圖的廣度優(yōu)先遍歷</p><p> 廣度優(yōu)先搜索遍歷類似于樹的按層次遍歷的過程。假設(shè)從圖中某頂點(diǎn)v出發(fā),在訪問了v之后訪問它們的鄰接點(diǎn),并使“先被訪問的頂點(diǎn)的鄰接點(diǎn)”先于“后被訪問的頂點(diǎn)的鄰接點(diǎn)的鄰接點(diǎn)”被訪問,直到圖中所有已被訪問的頂點(diǎn)的鄰接點(diǎn)都被訪問到。若此時(shí)圖
18、中尙有頂點(diǎn)未被訪問,則另選圖中一個(gè)未曾被訪問的頂點(diǎn)作起始點(diǎn),重復(fù)上述過程,直到圖中所有頂點(diǎn)都被訪問到為止。換句話說,廣度優(yōu)先搜索遍歷圖的過程是以v為起始點(diǎn),由近及遠(yuǎn),依次訪問和v有路徑相通且路徑長度為1,2,……的頂點(diǎn)。</p><p> 所以要實(shí)現(xiàn)算法必須先建立一個(gè)元素類型為整形的空隊(duì)列,并定義隊(duì)首與隊(duì)尾指針,同時(shí)也要定義一個(gè)標(biāo)志數(shù)組以標(biāo)記結(jié)點(diǎn)是否被訪問。同樣,也是從初始點(diǎn)出發(fā)開始訪問,訪問初始點(diǎn),標(biāo)志其已被
19、訪問,并將其入隊(duì)。當(dāng)隊(duì)列非空時(shí)進(jìn)行循環(huán)處理。當(dāng)結(jié)點(diǎn)被訪問時(shí)對(duì)其進(jìn)行標(biāo)志,并入隊(duì)列。通過while()循環(huán),并以是否被訪問為控制條件,訪問所有結(jié)點(diǎn),完成圖的廣度優(yōu)先遍歷。</p><p> 第四章 算法(數(shù)據(jù)結(jié)構(gòu))描述</p><p> 4.1 圖的存儲(chǔ)結(jié)構(gòu)的建立。</p><p> 4.1.1 定義鄰接表的邊結(jié)點(diǎn)類型以及鄰接表類型</p><
20、;p> struct edgenode{</p><p> int adjvex; //該弧所指向的頂點(diǎn)的位置</p><p> 4.1.2 初始化圖的鄰接表</p><p> 需建立一個(gè)鄰接表初始化函數(shù)對(duì)圖的鄰接表進(jìn)行初始化。即建立一個(gè)所有邊結(jié)點(diǎn)都為空的鄰#include<stdio.h></p>
21、<p> 4.1.3 建立并輸出圖的鄰接表</p><p> 首先必須輸入圖的相關(guān)信息,包括圖的頂點(diǎn)數(shù)、邊數(shù)。圖分為有向圖和無向圖。對(duì)于無向圖,各條邊的起點(diǎn)和終點(diǎn)互為鄰接點(diǎn)。所以必須把起點(diǎn)添加到終點(diǎn)的鄰接點(diǎn)域中,并把終點(diǎn)添加到起點(diǎn)的鄰接點(diǎn)域中。而對(duì)于有向圖,只能是將弧頭添加到弧尾的鄰接點(diǎn)域中。最后是輸出鄰接表,即對(duì)于每個(gè)頂點(diǎn),輸出其鄰接點(diǎn)。由于不了解C++中繪圖函數(shù)的用法,所以利用一些符號(hào)來達(dá)到圖
22、形化的效果。鄰接表建立和輸出的程序如下:</p><p> void creat_ljbiao(topnode gl[],int n,int e)//無向圖鄰接表的建立</p><p><b> {</b></p><p> int i,j,k;</p><p> edgenode *p;</p>
23、<p> getchar();</p><p> printf("\n請(qǐng)輸入%d個(gè)頂點(diǎn)的元素:",n);</p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> scanf("%c",&gl[i]
24、.topvex);</p><p> gl[i].link=NULL;</p><p><b> }</b></p><p> printf("\n請(qǐng)輸入要鄰接的倆個(gè)頂點(diǎn)的下標(biāo):\n");</p><p> for(k=0;k<e;k++)</p><p><
25、;b> {</b></p><p> scanf("%d%d",&i,&j);</p><p> p=(edgenode *)malloc(sizeof(edgenode));</p><p> p->adjvex=j;</p><p> p->next=gl[i].
26、link;</p><p> gl[i].link=p;</p><p> p=(edgenode *)malloc(sizeof(edgenode));</p><p> p->adjvex=i;</p><p> p->next=gl[j].link;</p><p> gl[j].link=
27、p;</p><p><b> }</b></p><p><b> }</b></p><p> void print_ljbiao(topnode gl[],int n)//鄰接表的輸出</p><p><b> {</b></p><p>
28、<b> int i;</b></p><p> edgenode *p;</p><p> printf("\n建立后的鄰接表為:\n");</p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><
29、p> printf("%c\t",gl[i].topvex);</p><p> p=gl[i].link;</p><p><b> while(p)</b></p><p><b> {</b></p><p> printf("%d\t"
30、,p->adjvex);</p><p> p=p->next;</p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p><b> }<
31、/b></p><p><b> 4.2 圖的遍歷</b></p><p> 4.2.1 深度優(yōu)先遍歷圖的鄰接表</p><p> 假設(shè)初始狀態(tài)是圖中所有頂點(diǎn)未曾被訪問,深度優(yōu)先遍歷可以從圖的初始點(diǎn)出發(fā),訪問初始點(diǎn),然后依次從v未被訪問的鄰接點(diǎn)出發(fā)深度優(yōu)先遍歷圖,直至圖中所有和v有路徑相通的頂點(diǎn)都被訪問到;若此時(shí)仍有頂點(diǎn)未被訪問到,
32、則從另一個(gè)未被訪問的頂點(diǎn)出發(fā),重復(fù)上述過程,直至所有點(diǎn)都被訪問到為止。這是一個(gè)遞歸的過程。所以在實(shí)現(xiàn)深度優(yōu)先遍歷的過程中必須遞歸調(diào)用深度優(yōu)先搜索函數(shù)。而且在深度優(yōu)先搜索函數(shù)中必須設(shè)一標(biāo)志數(shù)組以標(biāo)記結(jié)點(diǎn)是否被訪問。</p><p> 具體過程應(yīng)為:先訪問初始點(diǎn)Vi,并標(biāo)志其已被訪問。此時(shí)定義一指向邊結(jié)點(diǎn)的指針p,并建立一個(gè)while()循環(huán),以指針?biāo)笇?duì)象不為空為控制條件,當(dāng)Vi的鄰接點(diǎn)未被訪問時(shí),遞歸調(diào)用深度優(yōu)
33、先遍歷函數(shù)訪問之。然后將p指針指向下一個(gè)邊結(jié)點(diǎn)。這樣就可以完成圖的深度優(yōu)先遍歷了。</p><p> 深度優(yōu)先遍歷的相關(guān)算法如下:</p><p> int visited_lj[20]={0};</p><p> void DFSL(topnode gl[],int i) //鄰接表的深度優(yōu)先遍歷</p><p><b&
34、gt; {</b></p><p> edgenode *p;</p><p> printf("%c",gl[i].topvex);</p><p> visited_lj[i]=1;</p><p> p=gl[i].link;</p><p> while(p!=NUL
35、L)</p><p><b> {</b></p><p> if(visited_lj[p->adjvex]==0)</p><p> DFSL(gl,p->adjvex);</p><p> p=p->next;</p><p><b> }</b&
36、gt;</p><p><b> }</b></p><p> 4.2.2 廣度優(yōu)先遍歷圖的鄰接表</p><p> 圖的廣度優(yōu)先遍歷是從初始點(diǎn)出發(fā),訪問初始點(diǎn),再訪問初始點(diǎn)的鄰接點(diǎn)。當(dāng)初始點(diǎn)的所有鄰接點(diǎn)都被訪問過時(shí),再依次訪問各鄰接點(diǎn)的鄰接點(diǎn)。如此循環(huán)下去。算法的實(shí)現(xiàn)必須依靠輔助隊(duì)列,結(jié)點(diǎn)被訪問后,對(duì)其進(jìn)行標(biāo)記,并將結(jié)點(diǎn)入隊(duì)列。<
37、/p><p> 廣度優(yōu)先遍歷的相關(guān)代碼如下:</p><p> int visited_ljb[20]={0};</p><p> void BFSL(topnode gl[],int k)//鄰接表的廣度遍歷</p><p><b> {</b></p><p><b> int
38、 i;</b></p><p> edgenode *p;</p><p> linkqueue Q;</p><p> setnull(&Q);</p><p> printf("%c",gl[k].topvex);</p><p> visited_ljb[k]=1
39、;</p><p> enqueue(&Q,k);</p><p> while(!empty(&Q))</p><p><b> {</b></p><p> i=dequeue(&Q);</p><p> p=gl[i].link;</p>&l
40、t;p> while(p!=NULL)</p><p><b> {</b></p><p> if(!visited_ljb[p->adjvex])</p><p><b> {</b></p><p> printf("%c",gl[p->adjv
41、ex].topvex);</p><p> visited_ljb[p->adjvex]=1;</p><p> enqueue(&Q,p->adjvex);</p><p><b> }</b></p><p> p=p->next;</p><p><b
42、> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 第五章 源代碼</b></p><p> 程序 圖的存儲(chǔ)與遍歷</p><p> #include<
43、;stdio.h></p><p> #include<stdlib.h></p><p> typedef int datatype; //datatype可為任何類型,這里假設(shè)為int</p><p> typedef char vextype; //頂點(diǎn)的數(shù)據(jù)類型,vextype可為任何類型,這里假設(shè)為char</p>
44、;<p> typedef struct pnode</p><p><b> {</b></p><p> datatype data; //定義鏈表的數(shù)據(jù)域</p><p> struct pnode *next; //定義鏈表的指針域</p><p> }linklist;</p
45、><p> typedef struct</p><p><b> {</b></p><p> linklist *front,*rear; //用linklist類型定義隊(duì)頭和隊(duì)尾</p><p> }linkqueue;</p><p> linkqueue *q; //q是鏈
46、隊(duì)列指針</p><p> ypedef struct node</p><p><b> {</b></p><p> int adjvex; //鄰接點(diǎn)域</p><p> truct node *next; //鏈域</p><p> }edgenode; //邊表結(jié)點(diǎn)
47、</p><p> typedef struct</p><p><b> {</b></p><p> vextype topvex; //頂點(diǎn)信息</p><p> edgenode *link; //邊表頭指針</p><p> }topnode; //頂點(diǎn)表結(jié)點(diǎn)<
48、/p><p> topnode gl[20];</p><p> void setnull(linkqueue *q)//建立一個(gè)空隊(duì)列</p><p><b> {</b></p><p> q->front=(linklist *)malloc(sizeof(linklist));</p>&
49、lt;p> q->front->next=NULL;</p><p> q->rear=q->front;</p><p><b> }</b></p><p> int empty(linkqueue *q)//判斷隊(duì)列是否為空</p><p><b> {</b
50、></p><p> if(q->front==q->rear)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p&
51、gt;<b> }</b></p><p> void enqueue(linkqueue *q,datatype x)//讓元素入棧</p><p><b> {</b></p><p> q->rear->next=(linklist *)malloc(sizeof(linklist));</
52、p><p> q->rear=q->rear->next;</p><p> q->rear->data=x;</p><p> q->rear->next=NULL;</p><p><b> }</b></p><p> int dequeue(
53、linkqueue *q)//讓元素出棧</p><p><b> {</b></p><p> linkqueue *s;</p><p> if(empty(q))</p><p><b> {</b></p><p> printf("隊(duì)為空!&qu
54、ot;);</p><p> return NULL;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> s=q->front;</p>
55、<p> q->front=q->front->next;</p><p><b> free(s);</b></p><p> return(q->front->data);</p><p><b> }</b></p><p> }void c
56、reat_ljbiao(topnode gl[],int n,int e)//無向圖鄰接表的建立</p><p><b> {</b></p><p> int i,j,k;</p><p> edgenode *p;</p><p> getchar();</p><p> print
57、f("\n請(qǐng)輸入%d個(gè)頂點(diǎn)的元素:",n);</p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> scanf("%c",&gl[i].topvex);</p><p> gl[i].link=NULL;&
58、lt;/p><p><b> }</b></p><p> printf("\n請(qǐng)輸入要鄰接的倆個(gè)頂點(diǎn)的下標(biāo):\n");</p><p> for(k=0;k<e;k++)</p><p><b> {</b></p><p> scanf(&
59、quot;%d%d",&i,&j);</p><p> p=(edgenode *)malloc(sizeof(edgenode));</p><p> p->adjvex=j;</p><p> p->next=gl[i].link;</p><p> gl[i].link=p;</p&
60、gt;<p> p=(edgenode *)malloc(sizeof(edgenode));</p><p> p->adjvex=i;</p><p> p->next=gl[j].link;</p><p> gl[j].link=p;</p><p><b> }</b><
61、;/p><p><b> }</b></p><p> void print_ljbiao(topnode gl[],int n)//鄰接表的輸出</p><p><b> {</b></p><p><b> int i;</b></p><p>
62、 edgenode *p;</p><p> printf("\n建立后的鄰接表為:\n");</p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> printf("%c\t",gl[i].topvex);<
63、;/p><p> p=gl[i].link;</p><p><b> while(p)</b></p><p><b> {</b></p><p> printf("%d\t",p->adjvex);</p><p> p=p->ne
64、xt;</p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> int visited_lj[20]=
65、{0};</p><p> void DFSL(topnode gl[],int i)//鄰接表的深度遍歷</p><p><b> {</b></p><p> edgenode *p;</p><p> printf("%c",gl[i].topvex);</p><p
66、> visited_lj[i]=1;</p><p> p=gl[i].link;</p><p> while(p!=NULL)</p><p><b> {</b></p><p> if(visited_lj[p->adjvex]==0)</p><p> DFSL(
67、gl,p->adjvex);</p><p> p=p->next;</p><p><b> }</b></p><p><b> }</b></p><p> int visited[20]={0};</p><p> int visited_ljb
68、[20]={0};</p><p> void BFSL(topnode gl[],int k)//鄰接表的廣度遍歷</p><p><b> {</b></p><p><b> int i;</b></p><p> edgenode *p;</p><p>
69、linkqueue Q;</p><p> setnull(&Q);</p><p> printf("%c",gl[k].topvex);</p><p> visited_ljb[k]=1;</p><p> enqueue(&Q,k);</p><p> while(
70、!empty(&Q))</p><p><b> {</b></p><p> i=dequeue(&Q);</p><p> p=gl[i].link;</p><p> while(p!=NULL)</p><p><b> {</b></
71、p><p> if(!visited_ljb[p->adjvex])</p><p><b> {</b></p><p> printf("%c",gl[p->adjvex].topvex);</p><p> visited_ljb[p->adjvex]=1;</p&g
72、t;<p> enqueue(&Q,p->adjve </p><p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p><p><b> }</b></p>
73、<p><b> }</b></p><p> int visited_jz[20]={0};</p><p> void creat_yljbiao(topnode gl[],int n,int e)//有向圖鄰接表的建立</p><p><b> {</b></p><p>
74、 int i,j,k;</p><p> edgenode *p;</p><p> getchar();</p><p> printf("\n請(qǐng)輸入%d個(gè)頂點(diǎn)的元素:",n);</p><p> for(i=0;i<n;i++)</p><p><b> {</b
75、></p><p> scanf("%c",&gl[i].topvex);</p><p> gl[i].link=NULL;</p><p><b> }</b></p><p> printf("\n請(qǐng)輸入要鄰接的倆個(gè)頂點(diǎn)的下標(biāo):\n");</p&g
76、t;<p> for(k=0;k<e;k++)</p><p><b> {</b></p><p> scanf("%d%d",&i,&j);</p><p> p=(edgenode *)malloc(sizeof(edgenode));</p><p>
77、; p->adjvex=j;</p><p> p->next=gl[i].link;</p><p> gl[i].link=p;</p><p><b> }</b></p><p><b> }</b></p><p> void main()&
78、lt;/p><p><b> {</b></p><p> int i=1,j,n,e;</p><p> int k=1,m=1,l=1,t=1;</p><p><b> graph ga;</b></p><p> topnode *gl;</p>
79、<p> printf("*****************************鄰接表表示圖的基本操作*****************************\n");</p><p><b> while(i)</b></p><p> { printf("\n\t\t\t\t\t菜單:\n");&l
80、t;/p><p> printf("\n\t\t\t\t1: 無向圖的操作\n\n\t\t\t\t2: 有向圖的操作\n\n\t\t\t\t0: 結(jié)束圖的操作\n\n請(qǐng)選擇你需要操作的菜單序號(hào):");</p><p> scanf("%d",&i);</p><p><b> switch(i)
81、</b></p><p><b> {</b></p><p> case 1://無向圖的基本運(yùn)算</p><p><b> while(k)</b></p><p><b> { </b></p><p> printf(
82、"\n1:無向圖鄰接表的建立\n2:無向圖鄰接表的輸出\n3:無向圖鄰接表的深度遍歷 \n4:無向圖鄰接表的廣度遍歷\n\n請(qǐng)選擇你需要操作無向圖的序號(hào):");</p><p> scanf("%d",&k);</p><p><b> switch(k)</b></p><p><b&
83、gt; {</b></p><p> case 1:printf("\n請(qǐng)輸入頂點(diǎn)數(shù)和邊數(shù):");</p><p> scanf("%d%d",&n,&e);</p><p> creat_ljbiao(&gl,n,e); break;</p><p>
84、 case 2:print_ljbiao(&gl,n); break;</p><p> case 3:printf("\n請(qǐng)輸入要遍歷的起始位置:"); scanf("%d",&j);</p><p> printf("\n鄰接表深度遍歷后的結(jié)果為:");</p><p&
85、gt; DFSL(&gl,j); break;</p><p> case 4:printf("\n請(qǐng)輸入要遍歷的起始位置:"); scanf("%d",&j);</p><p> printf("\n鄰接表廣度遍歷后的結(jié)果為:");</p><p> BFSL(&am
86、p;gl,j); break;</p><p><b> }</b></p><p> printf("\n\n0:結(jié)束無向圖的操作\n1:繼續(xù)無向圖的操作\n");</p><p> scanf("%d",&k);</p><p> } break;&l
87、t;/p><p> case 2://有向圖的基本運(yùn)算</p><p><b> while(l)</b></p><p> { printf("\n1:有向圖鄰接表的建立\n2:有向圖鄰接表的輸出\n3:有向圖鄰接表的深度遍歷\n4:有向圖鄰接表的廣度遍歷\n\n請(qǐng)選擇你需要操作有向圖的序號(hào):");</p
88、><p> scanf("%d",&l);</p><p><b> switch(l)</b></p><p><b> {</b></p><p> case 1:printf("\n請(qǐng)輸入頂點(diǎn)數(shù)和邊數(shù):");</p><p
89、> scanf("%d%d",&n,&e);</p><p> creat_yljbiao(&gl,n,e);</p><p><b> break;</b></p><p> case 2:print_ljbiao(&gl,n);</p><p><
90、;b> break;</b></p><p> case 3:printf("\n請(qǐng)輸入要遍歷的起始位置:");</p><p> scanf("%d",&l);</p><p> printf("\n鄰接表深度遍歷后的結(jié)果為:");</p><p>
91、; DFSL(&gl,l);</p><p><b> break;</b></p><p> case 4:printf("\n請(qǐng)輸入要遍歷的起始位置:");</p><p> scanf("%d",&l);</p><p> printf("
92、\n鄰接表廣度遍歷后的結(jié)果為:");</p><p> BFSL(&gl,l);</p><p><b> break;</b></p><p><b> }</b></p><p> printf("\n\n0:結(jié)束有向圖的操作\n1:繼續(xù)有向圖的操作\n&qu
93、ot;);</p><p> scanf("%d",&l);</p><p><b> }break;</b></p><p><b> } </b></p><p><b> } </b></p><p><
94、b> }</b></p><p> 第六章 運(yùn)行結(jié)果分析</p><p> 當(dāng)然在編譯程序的過程中出現(xiàn)了一些錯(cuò)誤,經(jīng)過對(duì)程序的反復(fù)檢查,最后一一的找出了錯(cuò)誤的地方,并予以改正。下面就是無向圖G1和有向圖G2為例的程序運(yùn)行結(jié)果。</p><p> 圖 1 G 1
95、 圖2 G 2</p><p> 1 無向圖的建立如 圖1.1 所示</p><p> 圖1.1無向圖的建立</p><p> 2 無向圖的輸出如 圖1.2 所示</p><p> 圖 1.2 無向圖的輸出</p><p> 3 無向鄰接圖的深度和廣度遍歷的運(yùn)行結(jié)果如 圖 1.3 所示</p
96、><p> 圖1.3 無向鄰接圖的深度和廣度遍歷</p><p> 4 有向圖的建立如 圖 2.1 所示</p><p> 圖 2.1 有向圖的建立</p><p> 5 有向圖鄰接表的輸出結(jié)果如 圖 2.2 所示</p><p> 圖 2.2有向圖鄰接表的輸出</p><p>
97、 6 有向圖鄰接表的深度遍歷和廣度遍歷結(jié)果如 圖2.3 所示</p><p> 圖 2.3 有向圖鄰接表的深度遍歷和廣度遍歷</p><p><b> 第七章 結(jié)束語</b></p><p> 轉(zhuǎn)眼,為期兩周的《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)實(shí)習(xí)即將結(jié)束了。在這次實(shí)習(xí)中,自己的C語言知識(shí)和數(shù)據(jù)結(jié)構(gòu)知識(shí)得到了鞏固,編程能力也有了一定的提高。同時(shí)也
98、學(xué)會(huì)了解決問題的方法??偨Y(jié)起來,自己主要有以下幾點(diǎn)體會(huì):</p><p> 1.必須牢固掌握基礎(chǔ)知識(shí)。由于C語言是大一所學(xué)知識(shí),有所遺忘,且未掌握好這學(xué)期所學(xué)的《數(shù)據(jù)結(jié)構(gòu)》這門課,所以在實(shí)習(xí)之初感到棘手。不知如何下手,但在后來的實(shí)習(xí)過程中自己通過看書和課外資料,并請(qǐng)教其他同學(xué),慢慢地對(duì)C語言和數(shù)據(jù)結(jié)構(gòu)知識(shí)有所熟悉。這時(shí)才逐漸有了思路。所以,這次實(shí)習(xí)之后,我告誡自己:今后一定要牢固掌握好專業(yè)基礎(chǔ)知識(shí)。</p
99、><p> 2.必須培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度。自己在編程時(shí)經(jīng)常因?yàn)橐恍╊愃朴凇吧倭朔痔?hào)”的小錯(cuò)誤而導(dǎo)致錯(cuò)誤,不夠認(rèn)真細(xì)致,這給自己帶來了許多麻煩。編程是一件十分嚴(yán)謹(jǐn)?shù)氖虑?,容不得馬虎。所以在今后自己一定要培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度。我想這不僅是對(duì)于程序設(shè)計(jì),做任何事都應(yīng)如此。</p><p> 3.這次課程設(shè)計(jì)也讓我充分認(rèn)識(shí)到《數(shù)據(jù)結(jié)構(gòu)》這門課的重要性。它給我們一個(gè)思想和大綱,讓我們?cè)诰幊虝r(shí)容易找到思路
100、,不至于無章可循。同時(shí)它也有廣泛的實(shí)際應(yīng)用。</p><p> 總之,在這次實(shí)習(xí)中,自己的C語言以及數(shù)據(jù)結(jié)構(gòu)知識(shí)得到提高,編程能力也得到了提高。</p><p><b> 第八章 參考文獻(xiàn)</b></p><p> 譚浩強(qiáng) .C程序設(shè)計(jì) . 北京:清華大學(xué)出版社,2006.</p><p> 徐孝凱 . 數(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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)庫課程設(shè)計(jì)---數(shù)據(jù)庫
- 數(shù)據(jù)庫課程設(shè)計(jì)--學(xué)生課程數(shù)據(jù)庫的設(shè)計(jì)與實(shí)現(xiàn)
- 數(shù)據(jù)庫課程設(shè)計(jì)--數(shù)據(jù)庫設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)--數(shù)據(jù)庫原理及應(yīng)用課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)---學(xué)生選題數(shù)據(jù)庫的設(shè)計(jì)與實(shí)現(xiàn)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)---網(wǎng)上拍賣數(shù)據(jù)庫設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)--bbs系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)--學(xué)生選題數(shù)據(jù)庫的設(shè)計(jì)與實(shí)現(xiàn)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)
- 數(shù)據(jù)庫課程設(shè)計(jì)--cd唱片數(shù)據(jù)庫設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-----圖的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷
- 數(shù)據(jù)庫原理課程設(shè)計(jì)---個(gè)人事物管理數(shù)據(jù)庫課程設(shè)計(jì)
- 《圖的建立與遍歷》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論