版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題 目 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p> 學(xué)生姓名 </p><p> 指導(dǎo)教師
2、 </p><p> 學(xué) 院 信息科學(xué)與工程學(xué)院 </p><p> 專業(yè)班級 </p><p> 學(xué) 號 </p><p> 完成時(shí)間 2011年07月
3、 </p><p><b> 目 錄</b></p><p> 第一章、需求分析2</p><p> 第二章、概要設(shè)計(jì)2</p><p> 2.1設(shè)定圖的抽象數(shù)據(jù)類型2</p><p> 2.2設(shè)定隊(duì)列的抽象數(shù)據(jù)類型3</p><p>
4、 2.3本程序包含的功能模塊3</p><p> 第三章、詳細(xì)設(shè)計(jì)3</p><p> 3.1頂點(diǎn)、邊和圖的類型6</p><p><b> 3.2隊(duì)列類型8</b></p><p> 3.3主程序和其他偽碼算法9</p><p> 第四章、調(diào)試分析9</p>
5、<p> 第五章、用戶手冊9</p><p> 第六章、測試結(jié)果10</p><p> 第七章、心得體會10</p><p> 附:源程序代碼11</p><p><b> 圖遍歷的演示</b></p><p> 題目:試設(shè)計(jì)一個程序,演示在連通的無向圖上訪問全部結(jié)點(diǎn)
6、的操作</p><p><b> 第一章、需求分析</b></p><p> 1、以鄰接多重表為存儲結(jié)構(gòu);</p><p> 2、實(shí)現(xiàn)連通和非連通的無向圖的深度優(yōu)先和廣度優(yōu)先遍歷;</p><p> 3、要求利用棧實(shí)現(xiàn)無向圖的深度優(yōu)先遍歷;</p><p> 4、以用戶指定的結(jié)點(diǎn)為起點(diǎn),
7、分別輸出每種遍歷下的結(jié)點(diǎn)訪問序列和生成樹的邊集;</p><p> 5、用凹入表打印生成樹;</p><p> 6、求出從一個結(jié)點(diǎn)到另外一個結(jié)點(diǎn),但不經(jīng)過另外一個指定結(jié)點(diǎn)的所有簡單路徑;</p><p> 6、本程序用C語言編寫,在C-Free3.5環(huán)境下通過。</p><p><b> 第二章、概要設(shè)計(jì)</b>
8、</p><p> 1、設(shè)定圖的抽象數(shù)據(jù)類型:</p><p> ADT Graph{</p><p> 數(shù)據(jù)對象V:V是具有相同特性的數(shù)據(jù)元素的集合,稱為點(diǎn)集.</p><p><b> 數(shù)據(jù)關(guān)系R:</b></p><p><b> R={VR}</b><
9、/p><p> VR={(v,w)|v,w屬于V,(v,w)表示v和w之間存在的路徑}</p><p><b> 基本操作P:</b></p><p> CreatGraph(&G,V,VR)</p><p> 初始條件:V是圖的頂點(diǎn)集,VR是圖中弧的集合.</p><p> 操作結(jié)
10、果:按V和VR是定義構(gòu)造圖G.</p><p> DestroyGraph(&G)</p><p><b> 初始條件:圖G存在</b></p><p><b> 操作結(jié)果:銷毀圖G</b></p><p> LocateVex(G,u)</p><p>
11、初始條件: 圖G存在,u和G中頂點(diǎn)有相同的特征</p><p> 操作結(jié)果:若圖G中存在頂點(diǎn)u,則返回該頂點(diǎn)在圖中的位置;否則返回其他信息</p><p> GetVex(G,v)</p><p> 初始條件: 圖G存在,v是G中頂點(diǎn)</p><p> 操作結(jié)果:返回v的值</p><p> FirstAjv
12、ex(G,v)</p><p> 初始條件: 圖G存在,v是G中頂點(diǎn)</p><p> 操作結(jié)果:返回v的第一個鄰接頂點(diǎn),若頂在圖中沒有鄰接頂點(diǎn),則返回為空</p><p> NextAjvex(G,v,w)</p><p> 初始條件: 圖G存在,v是G中頂點(diǎn),w是v的鄰接頂點(diǎn)</p><p> 操作結(jié)果:
13、返回v的下一個鄰接頂點(diǎn),若w是v的最后一個鄰接頂點(diǎn),則返回空</p><p> DeleteVexx(&G,v)</p><p> 初始條件: 圖G存在,v是G中頂點(diǎn)</p><p> 操作結(jié)果:刪除頂點(diǎn)v已經(jīng)其相關(guān)的弧</p><p> DFSTraverse(G,visit())</p><p>
14、 初始條件: 圖G存在,visit的頂點(diǎn)的應(yīng)用函數(shù)</p><p> 操作結(jié)果: 對圖進(jìn)行深度優(yōu)先遍歷,在遍歷過程中對每個結(jié)點(diǎn)調(diào)用visit函數(shù)一次,一旦visit失敗,則操作失敗</p><p> BFSTraverse(G,visit())</p><p> 初始條件: 圖G存在,visit的頂點(diǎn)的應(yīng)用函數(shù)</p><p> 操作
15、結(jié)果:對圖進(jìn)行廣度優(yōu)先遍歷,在遍歷過程中對每個結(jié)點(diǎn)調(diào)用visit函數(shù)一次,一旦visit失敗,則操作失敗</p><p> }ADT Graph</p><p> 2、設(shè)定隊(duì)列的抽象數(shù)據(jù)類型:</p><p> ADT Queue{</p><p> 數(shù)據(jù)對象:D={ai|ai屬于Elemset,i=1,2….,n,n>=0}&
16、lt;/p><p> 數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai屬于D,i=1,2,…,n}</p><p> 約定ai為端為隊(duì)列頭,an為隊(duì)列尾</p><p><b> 基本操作:</b></p><p> InitQueue(&Q)</p><p> 操作
17、結(jié)果:構(gòu)造一個空隊(duì)列Q</p><p> DestryoQueue(&Q)</p><p> 初始條件:隊(duì)列Q已存在。</p><p> 操作結(jié)果:隊(duì)列Q被銷毀,不再存在。</p><p> EnQueue(&Q,e)</p><p> 初始條件:隊(duì)列Q已經(jīng)存在</p><
18、p> 操作結(jié)果:插入元素e為Q的新的隊(duì)尾元素</p><p> DeQueue(&Q,&E)</p><p> 初始條件:Q為非空隊(duì)列</p><p> 操作結(jié)果:刪除Q的隊(duì)尾元素,并用e返回其值</p><p> QueueEmpty(Q)</p><p> 初始條件:隊(duì)列已經(jīng)存在&
19、lt;/p><p> 操作結(jié)果:若隊(duì)列為空,則返回TRUE,否則返回FLASE</p><p> }ADT Queue</p><p> 3、本程序包含四個模塊:</p><p><b> 主程序模塊</b></p><p> void main ()</p><p>
20、;<b> {</b></p><p><b> 手動構(gòu)造一個圖;</b></p><p> 進(jìn)行深度優(yōu)先遍歷圖;</p><p> 進(jìn)行廣度優(yōu)先遍歷圖;</p><p><b> };</b></p><p> 手動構(gòu)造一個圖-自己輸入圖的
21、頂點(diǎn)和邊生成一個圖;</p><p> 進(jìn)行深度優(yōu)先遍歷圖-打出遍歷的結(jié)點(diǎn)序列和邊集;</p><p> 進(jìn)行廣度優(yōu)先遍歷圖-打出遍歷的結(jié)點(diǎn)序列和邊集;</p><p><b> 第三章、詳細(xì)設(shè)計(jì)</b></p><p><b> 頂點(diǎn),邊和圖類型</b></p><p&
22、gt; #define MAX_INFO 10 /* 相關(guān)信息字符串的最大長度+1 */</p><p> #define MAX_VERTEX_NUM 20 /* 圖中頂點(diǎn)數(shù)的最大值*/</p><p> int visited[MAX_VERTEX_NUM]; /*全局變量,訪問標(biāo)志數(shù)組 */</p><p> t
23、ypedef char InfoType; /*相關(guān)信息類型*/</p><p> typedef char VertexType; /* 字符類型 */</p><p> typedef enum{unvisited,visited}VisitIf;</p><p> typedef struct EBox
24、 /*邊結(jié)點(diǎn)類型*/ </p><p> { </p><p> int mark; /*訪問標(biāo)記 */ </p><p> int ivex,jvex;
25、 /*該邊依附的兩個頂點(diǎn)位置*/</p><p> struct EBox *ilink,*jlink; /*分別指向依附這兩個頂點(diǎn)的下一條邊 */</p><p><b> }EBox; </b></p><p> typedef struct VexBox
26、 /*頂點(diǎn)結(jié)點(diǎn)類型*/ </p><p><b> {</b></p><p> char data[MAX_LEN]; </p><p> EBox *fistedge; /*指向第一條依附該頂點(diǎn)的邊*/ </p><p> }VexBox;
27、 </p><p> typedef struct</p><p><b> { </b></p><p> VexBox list[MAX_VERTEX_NUM]; </p><p> int vexnum,edgenum; /*無向圖當(dāng)前頂點(diǎn)數(shù)和邊數(shù) */ &l
28、t;/p><p> }AMLGraph; </p><p><b> 圖的基本操作如下:</b></p><p> int LocateVex(AMLGraph G,VertexType u);</p><p> // 查G和u有相同特征的頂點(diǎn),若存在則返回該頂點(diǎn)在無向圖中位置;否則返回-1。</p>
29、<p> VertexType& GetVex(AMLGraph G,int v);</p><p> //以v返回鄰接多重表中序號為i的頂點(diǎn)。</p><p> int FirstAdjVex(AMLGraph G,VertexType v);</p><p> //返回v的第一個鄰接頂點(diǎn)的序號。若頂點(diǎn)在G中沒有鄰接頂點(diǎn),則返回-1。
30、</p><p> int NextAdjVex(AMLGraph G,VertexType v,VertexType w);</p><p> //返回v的(相對于w的)下一個鄰接頂點(diǎn)的序號若w是v的最后一個鄰接點(diǎn),則返回-1。</p><p> void CreateGraph(AMLGraph &G);</p><p>
31、 //采用鄰接多重表存儲結(jié)構(gòu),構(gòu)造無向圖G。</p><p> Status DeleteArc(AMLGraph &G,VertexType v,VertexType w);</p><p> //在G中刪除邊<v,w>。</p><p> Status DeleteVex(AMLGraph &G,VertexType v);&l
32、t;/p><p> //在G中刪除頂點(diǎn)v及其相關(guān)的邊。</p><p> void DestroyGraph(AMLGraph &G);</p><p><b> //銷毀一個圖</b></p><p> void Display(AMLGraph G);</p><p> //輸出
33、無向圖的鄰接多重表G。</p><p> void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType));</p><p> //從start頂點(diǎn)起,(利用棧非遞歸)深度優(yōu)先遍歷圖G。</p><p> void BFSTraverse(AMLGraph G,VertexType st
34、art,int(*Visit)(VertexType));</p><p> //從start頂點(diǎn)起,廣度優(yōu)先遍歷圖G。void MarkUnvizited(AMLGraph G);//置邊的訪問標(biāo)記為未被訪問。其中部分操作的算法如下: void CreateGraph(AMLGraph *p) /*創(chuàng)建無向圖 */</p><p&g
35、t; { </p><p> int i,j,k; </p><p> EBox *q; </p><p> printf("\n\t\t\t請輸入圖的結(jié)點(diǎn)個數(shù)和邊的個數(shù):"); </p><p> /*輸入圖的結(jié)點(diǎn)數(shù)和邊數(shù)*/&l
36、t;/p><p> scanf("%d,%d",&p->vexnum,&p->edgenum); </p><p> for(i=1;i<=p->vexnum;i++) </p><p> { printf("\n\t\t\t請輸入結(jié)點(diǎn)%d的名稱:",i);/*輸入頂點(diǎn)數(shù)據(jù)信
37、息*/</p><p> scanf("%s",p->list[i].data); </p><p> p->list[i].fistedge=NULL; /*初始化指針*/ </p><p><b> } </b></p><p&g
38、t; for(k=0;k<p->edgenum;k++) /*輸入各邊并構(gòu)造多重鏈表*/ </p><p> { printf("\n\t\t\t請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):");</p><p> scanf("%d,%d",&i,&j);</p><p>
39、 q=(EBox *)malloc(sizeof(EBox));</p><p> q->mark=0; /*對邊結(jié)點(diǎn)賦值*/</p><p> q->ivex=i;</p><p> q->ilink=p->list[i].fistedge;</p>&l
40、t;p> q->jvex=j;</p><p> q->jlink=p->list[j].fistedge;</p><p> p->list[i].fistedge=p->list[j].fistedge=q; /*完成邊在鏈頭的插入*/</p><p><b> }</b></p>
41、<p> printf("\n");</p><p><b> }</b></p><p> void DFS(AMLGraph *p, int v) </p><p> { /*對第v個頂點(diǎn)的深度優(yōu)先遍歷 */</p>
42、<p><b> int w; </b></p><p> EBox *q; </p><p> visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p><p> printf("%s ",p->list[v].data);&l
43、t;/p><p> for(q=p->list[v].fistedge;q!=NULL;) </p><p> {if(q->ivex==v)</p><p> {w=q->jvex; q=q->jlink;} </p><p><b> else </b></p>&
44、lt;p> {w=q->ivex; q=q->ilink;} </p><p> if(!visited[w]) DFS(p,w); /*對尚未訪問的點(diǎn)調(diào)用DFS*/</p><p><b> } </b></p><p><b> }</b></p>
45、<p> void DFSTraverse(AMLGraph *p,int n) </p><p> { /*深度優(yōu)先遍歷 */</p><p><b> int v;</b></p><p> printf("\n
46、\t\t\t");</p><p> for(v=1;v<=p->vexnum;v++) </p><p> visited[v]=0; *訪問標(biāo)志數(shù)組初始化*/ </p><p> DFS(p,n); /*對起
47、始頂點(diǎn)調(diào)用DFS*/ </p><p> for(v=1;v<=p->vexnum;v++) </p><p> if(!visited[v]) DFS(p,v); /*對尚未訪問的頂點(diǎn)調(diào)用DFS*/</p><p> printf("\n"); </p>
48、<p><b> } </b></p><p><b> 2、隊(duì)列類型</b></p><p> typedef int QelemType;</p><p> typedef struct QNode{</p><p> QElemType data;</p&
49、gt;<p> struct QNode *next;</p><p> }QNode,*QueuePtr;</p><p> typedef struct{</p><p> QueuePtr front;</p><p> QueuePtr rear; /* 隊(duì)頭、隊(duì)尾指針 */</p><p&
50、gt; }LinkQueue;</p><p> 隊(duì)列的基本操作如下:Status InitQueue(LinkQueue &Q);//構(gòu)造一個空隊(duì)列Q。Status DestroyQueue(LinkQueue &Q);//銷毀隊(duì)列Q(無論空否均可)。Status QueueEmpty(LinkQueue Q);//若Q為空隊(duì)列,則返回1,否則返回-1。Status EnQue
51、ue(LinkQueue &Q,QElemType e);//插入元素e為Q的新的隊(duì)尾元素。Status DeQueue(LinkQueue &Q,QElemType &e);//若隊(duì)列不空,刪除Q的隊(duì)頭元素,用e返回其值,并返回1,否則返回-1。</p><p> 其中部分操作的算法如下:</p><p> void BFS(AMLGraph *p,in
52、t v) </p><p> { /*對第v個頂點(diǎn)進(jìn)行廣度優(yōu)先遍歷*/ </p><p> int u,w; </p><p> EBox *x; </p><p> typedef struct queue</p><p>
53、;<b> { </b></p><p><b> int m; </b></p><p> struct queue *next; </p><p> }Q; /*輔助隊(duì)列Q*/ </p><p&g
54、t; Q *head,*tail,*q; </p><p> head=tail=(Q *)malloc(sizeof(Q)); </p><p> tail->next=NULL; </p><p> visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p>&l
55、t;p> printf("%s ",p->list[v].data);</p><p> tail->m=v; /*v入隊(duì)列 */ </p><p> tail->next=(Q *)malloc(sizeof(Q)); </p><p> ta
56、il=tail->next; </p><p> tail->next=NULL; </p><p> while(head!=tail)</p><p><b> { </b></p><p> q=head; </p><p> head=head->
57、;next; </p><p> u=q->m; /*對頭元素出隊(duì)并置為u*/ </p><p> free(q); </p><p> for(x=p->list[u].fistedge;x!=NULL;) </p><p> { if(x->
58、;ivex==u) {w=x->jvex;x=x->ilink;}</p><p> else {w=x->ivex;x=x->jlink;} </p><p> if(!visited[w])</p><p><b> { </b></p><p> visited[w]=
59、1; </p><p> printf("%s ",p->list[w].data);</p><p> tail->m=w; /*w入隊(duì)列*/</p><p> tail=tail->next=(Q *)malloc(sizeof(Q)); </p&
60、gt;<p> tail->next=NULL; </p><p> } /*if*/</p><p> } /*for */</p><p> } /*while*/</p><p> } /*BFS*/</
61、p><p> void BFSTraverse(AMLGraph *p,int n) </p><p> { printf("\n\t\t\t"); /*廣度優(yōu)先遍歷*/</p><p><b> int v;</b></p><p>
62、 for(v=1;v<=p->vexnum;v++) </p><p> visited[v]=0; /*訪問標(biāo)志數(shù)組初始化*/ </p><p> BFS(p,n); /*對起始頂點(diǎn)調(diào)用BFS*/ </p><p>
63、for(v=1;v<=p->vexnum;v++) </p><p> if(!visited[v]) BFS(p,v);</p><p> printf("\n"); /*對未訪問頂點(diǎn)調(diào)用BFS*/</p><p><b> }</b></p>
64、<p> 3、主程序和其他偽碼算法 void main (){顯示菜單;輸入功能選擇鍵;switch(flag){case 1:手動構(gòu)造一個圖;case 2:進(jìn)行深度優(yōu)先遍歷圖;case 3:進(jìn)行廣度優(yōu)先遍歷圖; case 4:退出程序;}算法代碼</p><p> main() /*主函數(shù) */ &l
65、t;/p><p> { int x,n; </p><p> AMLGraph graph,*p; </p><p><b> p=&graph;</b></p><p> system("color 1f");</p><p> printf(&qu
66、ot;\t\t\t****** 圖的深度和廣度優(yōu)先遍歷 *******\n");</p><p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t****** ********\n"
67、);</p><p> printf("\n");</p><p><b> while(1)</b></p><p> { printf("\n");</p><p> printf("\t\t\t ~~~~~~~~ 功能菜單
68、 ~~~~~~~ \n");</p><p> printf("\n");</p><p> printf("\t\t\t*********************************************\n");</p><p> printf("\t\t\t*
69、 1.創(chuàng)建圖 *\n");</p><p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t* 2.深度優(yōu)先遍歷圖 *\n&q
70、uot;);</p><p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t* 3.廣度優(yōu)先遍歷圖 *\n");</p><p> prin
71、tf("\t\t\t* *\n");</p><p> printf("\t\t\t* 4.退出系統(tǒng) *\n");</p><p> printf("\t\t\t*
72、 *\n");</p><p> printf("\t\t\t*********************************************\n");</p><p> printf("\n\t\t\t請輸入選擇的功能編號(1-4):"); </p>&l
73、t;p> scanf("%d",&n);</p><p> if(n<0 || n>4)</p><p><b> {</b></p><p> printf("\n\n\t\t\t你輸入的功能號錯誤,請重新輸入,按Enter鍵繼續(xù)??!");</p><
74、;p> getchar();</p><p> getchar();</p><p><b> continue;</b></p><p><b> }</b></p><p><b> switch(n)</b></p><p><
75、;b> {</b></p><p> case 1: system("color 3f");</p><p> CreateGraph(p);break;</p><p> case 2: { system("color 79");</p><p> printf(&
76、quot;\n\t\t\t請輸入起始遍歷結(jié)點(diǎn):");</p><p> scanf("%d",&x); </p><p> printf("\n\t\t\t深度優(yōu)先遍歷結(jié)果為:"); </p><p> printf("\n");</p><p> DF
77、STraverse(p,x);</p><p> printf("\n");</p><p><b> } break;</b></p><p> case 3: { system("color 2E");</p><p> printf("\n\t\t\t請
78、輸入起始遍歷結(jié)點(diǎn):");</p><p> scanf("%d",&x); </p><p> printf("\n\t\t\t廣度優(yōu)先遍歷結(jié)果為:"); </p><p> printf("\n");</p><p> BFSTraverse(p,x);&
79、lt;/p><p> printf("\n"); </p><p><b> } break;</b></p><p> case 4: printf("\n\n\t\t\t謝謝你的使用!\n\n\n");</p><p><b> exit(0);</b
80、></p><p> }/*switch */ </p><p> } /*while */</p><p> } /*main */</p><p> 第四章、調(diào)試分析1、本程序以鄰接多重表為存儲結(jié)構(gòu)。這個程序涉及到圖的生成和圖的深度以及廣度遍歷,文件的保存和讀取,還有棧和隊(duì)列的操
81、作,另外還有森林的生成和打印,路徑的尋找。2、本程序不僅可以進(jìn)行連通無向圖的遍歷,還可以進(jìn)行非連通圖的遍歷。為了方便顯示和理解,現(xiàn)在暫且用一個大寫字母表示一個頂點(diǎn)。邊還可以附加信息,但為了方便操作,暫且不輸入信息。已經(jīng)先把圖的相關(guān)信息保存在了文本文檔里,所以要測試時(shí)直接從文件導(dǎo)入,可以減少用手輸入的麻煩,同時(shí)也可以減少輸入的錯誤。3、由于構(gòu)造圖時(shí),后輸入的邊是插在先輸入的邊的前面。所以在輸入邊時(shí),可以按字母從大到小的順序輸入。那么顯
82、示圖的時(shí)候就可以按字母從小到大的順序顯示。4、程序定義了一個二倍頂點(diǎn)長的數(shù)組存放輸入的邊,以便程序可以把它保存到文件里。故耗費(fèi)了一定的內(nèi)存空間。 第五章、用戶手冊1、本程序的運(yùn)行環(huán)境DOS操作系統(tǒng),GTraverse.exe2、進(jìn)入演示程序后即顯示一個有功能選擇的界面,如下:3、選擇操作1:程序就提示分別輸入無向圖的頂點(diǎn)數(shù),邊數(shù),邊的信息,頂點(diǎn)和邊的值:輸入完成后</p
83、><p> 5、選擇操作3:系統(tǒng)提示輸入遍歷圖的起始點(diǎn),程序運(yùn)行后,首先顯示廣度優(yōu)先遍歷的訪問結(jié)點(diǎn)序列。</p><p> 6、選擇操作4:退出程序。</p><p> 第六章、測試結(jié)果1、數(shù)據(jù)可以任意輸入,但是頂點(diǎn)數(shù)不要太多,不然占用太多內(nèi)存,會導(dǎo)致死機(jī)。2、遍歷一個連通的無向圖,如遍歷以下這個連通無向圖:</p><p> 1)
84、選擇操作1,分別進(jìn)行以下操作:</p><p> 請輸入圖的結(jié)點(diǎn)個數(shù)和邊的個數(shù):4,5</p><p> 請輸入結(jié)點(diǎn)1的名稱:A </p><p> 請輸入結(jié)點(diǎn)2的名稱:B</p><p> 請輸入結(jié)點(diǎn)3的名稱:C</p><p> 請輸入結(jié)點(diǎn)4的名稱:D</p><p> 請輸入互
85、相有關(guān)聯(lián)的兩個結(jié)點(diǎn):1,2</p><p> 請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):1,3</p><p> 請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):1,4</p><p> 請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):2,4</p><p> 請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):3,4</p><p> 2) 選擇操作2,輸出圖的信息如下:</p
86、><p> 請輸入起始遍歷結(jié)點(diǎn):1</p><p> 深度優(yōu)先遍歷結(jié)果為:A B D C</p><p> 3) 選擇操作3,輸出圖的信息如下:</p><p> 請輸入起始遍歷結(jié)點(diǎn):1</p><p> 廣度優(yōu)先遍歷結(jié)果為:A B C D</p><p> 第七章、心得體會這道題的完
87、成,花了一個星期時(shí)間,因?yàn)槲乙粋€多學(xué)期沒接觸C語言和數(shù)據(jù)結(jié)構(gòu)首先我把基本功能完成后來逐步地增加了許多功能。把本來只能遍歷連通圖的功能上,改進(jìn)為可以遍歷非連通圖。通過這道設(shè)計(jì)題,使我更深刻的理解數(shù)據(jù)結(jié)構(gòu)及其重要作用,對數(shù)據(jù)結(jié)構(gòu)有了一個新的認(rèn)識,深刻的認(rèn)識到數(shù)據(jù)結(jié)構(gòu)對于我們學(xué)習(xí)計(jì)算機(jī)的重要性和其深遠(yuǎn)但是意義.同時(shí),通過這次課程設(shè)計(jì),也加強(qiáng)我的動手能力和思維能力,可以將自己所學(xué)的知識用于實(shí)踐,這不僅對自己是一次鍛煉機(jī)會,而且讓自己有一種成就感
88、和自豪感,覺得自己終于可以做出一點(diǎn)有用的東西了。不過,我覺得自己編寫程序的一些思路算法和水平還非常有限。所以以后自己還得在C語言和其他語言上下苦功夫。</p><p><b> 附:源程序</b></p><p> #include <stdio.h> </p><p> #include <stdlib.h>
89、; </p><p> #define MAX_VERTEX_NUM 30 /*無向圖最大頂點(diǎn)數(shù)*/ </p><p> #define MAX_LEN 20 /*數(shù)據(jù)最大長度 */</p><p> int visited[MAX_VERTEX_N
90、UM]; /*全局變量,訪問標(biāo)志數(shù)組 */ </p><p> typedef struct EBox /*邊結(jié)點(diǎn)類型*/ </p><p> { </p><p> int mark;
91、 /*訪問標(biāo)記 */ </p><p> int ivex,jvex; /*該邊依附的兩個頂點(diǎn)位置*/</p><p> struct EBox *ilink,*jlink; /*分別指向依附這兩個頂點(diǎn)的下一條邊 */</p>
92、<p><b> }EBox; </b></p><p> typedef struct VexBox /*頂點(diǎn)結(jié)點(diǎn)類型*/ </p><p><b> {</b></p><p> char data[MAX_LEN]; </p
93、><p> EBox *fistedge; /*指向第一條依附該頂點(diǎn)的邊*/ </p><p> }VexBox; </p><p> typedef struct</p><p><b> { </b></p><p&g
94、t; VexBox list[MAX_VERTEX_NUM]; </p><p> int vexnum,edgenum; /*無向圖當(dāng)前頂點(diǎn)數(shù)和邊數(shù) */ </p><p> }AMLGraph; </p><p> void CreateGraph(AMLGraph *p)
95、 /*創(chuàng)建無向圖 */</p><p> { </p><p> int i,j,k; </p><p> EBox *q; </p><p> printf("\n\t\t\t請輸入圖的結(jié)點(diǎn)個數(shù)和邊的個數(shù):&qu
96、ot;); /*輸入圖的結(jié)點(diǎn)數(shù)和邊數(shù)*/</p><p> scanf("%d,%d",&p->vexnum,&p->edgenum); </p><p> for(i=1;i<=p->vexnum;i++) </p><p> { printf("\n\t\t\t請輸入結(jié)點(diǎn)
97、%d的名稱:",i); /*輸入頂點(diǎn)數(shù)據(jù)信息*/</p><p> scanf("%s",p->list[i].data); </p><p> p->list[i].fistedge=NULL; /*初始化指針*/ </p><p><b>
98、} </b></p><p> for(k=0;k<p->edgenum;k++) /*輸入各邊并構(gòu)造多重鏈表*/ </p><p> { printf("\n\t\t\t請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):");</p><p> scanf("%d,%d&quo
99、t;,&i,&j);</p><p> q=(EBox *)malloc(sizeof(EBox));</p><p> q->mark=0; /*對邊結(jié)點(diǎn)賦值*/</p><p> q->ivex=i;</p><p> q->
100、;ilink=p->list[i].fistedge;</p><p> q->jvex=j;</p><p> q->jlink=p->list[j].fistedge;</p><p> p->list[i].fistedge=p->list[j].fistedge=q; /*完成邊在鏈頭的插入*/</
101、p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> void DFS(AMLGraph *p, int v) </p><p> {
102、 /*對第v個頂點(diǎn)的深度優(yōu)先遍歷 */</p><p><b> int w; </b></p><p> EBox *q; </p><p> visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p>
103、<p> printf("%s ",p->list[v].data);</p><p> for(q=p->list[v].fistedge;q!=NULL;) </p><p> {if(q->ivex==v)</p><p> {w=q->jvex; q=q->jlink;} <
104、;/p><p><b> else </b></p><p> {w=q->ivex; q=q->ilink;} </p><p> if(!visited[w]) DFS(p,w); /*對尚未訪問的點(diǎn)調(diào)用DFS*/</p><p><b> } </
105、b></p><p><b> }</b></p><p> void DFSTraverse(AMLGraph *p,int n) </p><p> { /*深度優(yōu)先遍歷 */</p><p><b&g
106、t; int v;</b></p><p> printf("\n\t\t\t");</p><p> for(v=1;v<=p->vexnum;v++) </p><p> visited[v]=0; /*訪問標(biāo)志數(shù)組初始化*/ </p>
107、<p> DFS(p,n); /*對起始頂點(diǎn)調(diào)用DFS*/ </p><p> for(v=1;v<=p->vexnum;v++) </p><p> if(!visited[v]) DFS(p,v); /*對尚未訪問的頂點(diǎn)調(diào)用DFS*/</p>
108、<p> printf("\n"); </p><p><b> } </b></p><p> void BFS(AMLGraph *p,int v) </p><p> { /
109、*對第v個頂點(diǎn)進(jìn)行廣度優(yōu)先遍歷*/ </p><p> int u,w; </p><p> EBox *x; </p><p> typedef struct queue</p><p><b> { </b></p><p><b> int m; &
110、lt;/b></p><p> struct queue *next; </p><p> }Q; /*輔助隊(duì)列Q*/ </p><p> Q *head,*tail,*q; </p><p> head=tail=(Q *)mallo
111、c(sizeof(Q)); </p><p> tail->next=NULL; </p><p> visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p><p> printf("%s ",p->list[v].data);</p><
112、p> tail->m=v; /*v入隊(duì)列 */ </p><p> tail->next=(Q *)malloc(sizeof(Q)); </p><p> tail=tail->next; </p><p> tail->next=NULL; <
113、;/p><p> while(head!=tail)</p><p><b> { </b></p><p> q=head; </p><p> head=head->next; </p><p> u=q->m;
114、 /*對頭元素出隊(duì)并置為u*/ </p><p> free(q); </p><p> for(x=p->list[u].fistedge;x!=NULL;) </p><p> { if(x->ivex==u) {w=x->jvex;x=x->ilink;}</p><p&g
115、t; else {w=x->ivex;x=x->jlink;} </p><p> if(!visited[w])</p><p><b> { </b></p><p> visited[w]=1; </p><p> printf("%s ",p->l
116、ist[w].data);</p><p> tail->m=w; /*w入隊(duì)列*/</p><p> tail=tail->next=(Q *)malloc(sizeof(Q)); </p><p> tail->next=NULL; </p><p>
117、; } /*if*/</p><p> } /*for */</p><p> } /*while*/</p><p> } /*BFS*/</p><p> void BFSTraverse(AMLGraph *p,int n) &l
118、t;/p><p> { printf("\n\t\t\t"); /*廣度優(yōu)先遍歷*/</p><p><b> int v;</b></p><p> for(v=1;v<=p->vexnum;v++) </p><p&
119、gt; visited[v]=0; /*訪問標(biāo)志數(shù)組初始化*/ </p><p> BFS(p,n); /*對起始頂點(diǎn)調(diào)用BFS*/ </p><p> for(v=1;v<=p->vexnum;v++) </p><
120、p> if(!visited[v]) BFS(p,v);</p><p> printf("\n"); /*對未訪問頂點(diǎn)調(diào)用BFS*/</p><p><b> }</b></p><p> main()
121、 /*主函數(shù) */ </p><p> { int x,n; </p><p> AMLGraph graph,*p; </p><p><b> p=&graph;</b></p><p> system("color 1f");</p><p&
122、gt; printf("\t\t\t****** 圖的深度和廣度優(yōu)先遍歷 *******\n");</p><p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t****** **
123、******\n");</p><p> printf("\n");</p><p><b> while(1)</b></p><p> { printf("\n");</p><p> printf("\t\t\t ~~~~~~~~
124、 功能菜單 ~~~~~~~ \n");</p><p> printf("\n");</p><p> printf("\t\t\t*********************************************\n");</p><p> printf("\t\t\
125、t* 1.創(chuàng)建圖 *\n");</p><p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t* 2.深度優(yōu)先遍歷圖
126、 *\n");</p><p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t* 3.廣度優(yōu)先遍歷圖 *\n");</p>&
127、lt;p> printf("\t\t\t* *\n");</p><p> printf("\t\t\t* 4.退出系統(tǒng) *\n");</p><p> printf("\t\t\t*
128、 *\n");</p><p> printf("\t\t\t*********************************************\n");</p><p> printf("\n\t\t\t請輸入選擇的功能編號(1-4):");
129、</p><p> scanf("%d",&n);</p><p> if(n<0 || n>4)</p><p><b> {</b></p><p> printf("\n\n\t\t\t你輸入的功能號錯誤,請重新輸入,按Enter鍵繼續(xù)??!");&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-----圖的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷
- 《圖的建立與遍歷》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-圖的遍歷和構(gòu)建
- 圖的廣度優(yōu)先遍歷-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-- 圖的遍歷和生成樹求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷和生成樹求解
- 數(shù)據(jù)結(jié)構(gòu)-鄰接表存儲及遍歷-課程設(shè)計(jì)-實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--樹的遍歷,文件目錄結(jié)構(gòu)的顯示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——樹的遍歷文件目錄結(jié)構(gòu)的顯示
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計(jì)
- 新數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷和生成樹求解實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論