版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計報告</b></p><p> 題 目: 算法設計與實踐 </p><p> 院 系: 信息學院 </p><p> 專 業(yè): 計算機科學與技術專
2、業(yè)(軟件方向) </p><p> 學 號: </p><p> 姓 名: </p><p> 指導教師:
3、 </p><p> 完成日期: 2013年7月14日 </p><p><b> 目錄</b></p><p> 實驗一:順序表操作…………………………………………………..3</p><p> 抽象數據數據類型…………................
4、.........................3</p><p> 源代碼……………….....................................................4</p><p> 測試結果.........................................................................9</p&
5、gt;<p> 實驗小結……………………………………………….9</p><p> 實驗二:二叉排序樹的操作……………………………………………10</p><p> 抽象數據數據類型………….........................................10</p><p> 源代碼………………................
6、.....................................11</p><p> 測試結果.........................................................................17</p><p> 實驗小結……………………………………………….17</p><p> 實驗三:無向圖的
7、操作………………………………………………..18</p><p> 抽象數據數據類型………….........................................18</p><p> 源代碼……………….....................................................19</p><p> 測試結果....
8、.....................................................................26</p><p> 實驗小結……………………………………………….26</p><p> 實驗四:有向圖的操作………………………………………………..27</p><p> 抽象數據數據類型…………...........
9、..............................27</p><p> 源代碼……………….....................................................27</p><p> 測試結果.........................................................................3
10、4</p><p> 實驗小結……………………………………………….34</p><p> 實驗五:哈希表的操作………………………………………………..35</p><p> 抽象數據數據類型………….........................................35</p><p> 源代碼………………......
11、...............................................35</p><p> 測試結果.........................................................................37</p><p> 實驗小結……………………………………………….37</p><p>
12、 參考文獻…………………………………………………………………38</p><p><b> [一] 順序表操作</b></p><p><b> ?。?)創(chuàng)建順序表;</b></p><p> ?。?)順序表進行順序查找; </p><p> ?。?)順序表進行排序(排序的方法可以是簡單的,也可
13、以是先進的);</p><p> (4)順序表進行折半查找。</p><p> 設計方案(抽象數據類型)</p><p> ADT StaticSearchTable</p><p><b> {</b></p><p> 數據對象D:銷售單集合</p><p>
14、<b> 數據關系R:線性表</b></p><p><b> 基本操作P:</b></p><p> CreateTable(&T,n)</p><p> 操作結果:構造一個含n個數據元素的靜態(tài)查找表</p><p> DestroyTable(&T)</p>
15、<p> 初始條件:靜態(tài)查找表T存在</p><p><b> 操作結果:銷毀表T</b></p><p> int SearchTable(T,key)</p><p> 初始條件:靜態(tài)查找表T存在,key為和查找表中元素的關鍵字類型相同的給定值。</p><p> 操作結果:若T中存在其關鍵字
16、等于key的數據元素,則函數值返回其在表中的位置,否則為0。</p><p> void SortTable(&T)</p><p> 初始條件:靜態(tài)查找表T存在;</p><p> 操作結果:對T實施直接插入排序(非遞減的)。</p><p> int SearchBin(T ,key)</p><p&g
17、t; 初始條件:靜態(tài)查找表T存在。</p><p> 操作結果:折半查找,在查找表中查關鍵字等于key的記錄的位序,如果沒有,則返回0。</p><p><b> }</b></p><p><b> 源代碼:</b></p><p> #include"stdio.h"
18、;</p><p> #include"stdlib.h"</p><p> #define OK 1</p><p> #define ERROR -1</p><p> typedef struct</p><p><b> {</b></p>&l
19、t;p><b> int key;</b></p><p> char name[30];</p><p><b> }SDate;</b></p><p> typedef struct</p><p><b> {</b></p><p&
20、gt; SDate *elem;</p><p> int length;</p><p><b> }STable;</b></p><p> int CreatTable(STable *L,int n)</p><p><b> {</b></p><p>&
21、lt;b> int i;</b></p><p><b> if(n<1)</b></p><p> return ERROR;</p><p> L->elem=(SDate *)malloc((n+1)*sizeof(SDate));</p><p> L->length
22、=n;</p><p> for(i=1;i<=n;i++)</p><p><b> {</b></p><p> printf("售單號和售貨員\n");</p><p> scanf("%d",&L->elem[i].key);</p>
23、<p> getchar();</p><p> gets(L->elem[i].name);</p><p><b> }</b></p><p> return OK;</p><p><b> }</b></p><p> void De
24、stroyTable(STable *L)</p><p><b> {</b></p><p> if(L->elem=NULL)</p><p><b> return;</b></p><p> free(L->elem);</p><p> pr
25、intf("\n成功釋放靜態(tài)查找表\n");</p><p><b> }</b></p><p> int SearchTable(STable L,int key)</p><p><b> {</b></p><p><b> int i;</b&g
26、t;</p><p> L.elem[0].key=key;</p><p> for(i=L.length;L.elem[i].key!=key;i--)</p><p><b> ;</b></p><p><b> return i;</b></p><p>&
27、lt;b> }</b></p><p> void SortTable(STable *L)</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=2;i<=L->length;i++)<
28、/p><p><b> {</b></p><p> if(L->elem[i].key<L->elem[i-1].key)</p><p><b> {</b></p><p> L->elem[0]=L->elem[i];</p><p>
29、; L->elem[i]=L->elem[i-1];</p><p> for(j=i-2;L->elem[0].key<L->elem[j].key;j--)</p><p><b> {</b></p><p> L->elem[j+1]=L->elem[j];</p><
30、;p><b> }</b></p><p> L->elem[j+1]=L->elem[0];</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
31、<p> void ShowTable(STable L)</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=1;i<=L.length;i++)</p><p><b> {</b>
32、;</p><p> printf(“銷售單號:%d,銷售員是:</p><p> %s\n",L.elem[i].key,L.elem[i].name);</p><p><b> }</b></p><p><b> }</b></p><p> in
33、t SearchBin(STable L,int key)</p><p><b> {</b></p><p> int low,high,mid;</p><p><b> low=1;</b></p><p> high=L.length;</p><p>
34、while(low<=high)</p><p><b> {</b></p><p> mid=(low+high)/2;</p><p> if(L.elem[mid].key=key)</p><p> return mid;</p><p><b> else&l
35、t;/b></p><p> if(key<L.elem[mid].key)</p><p> high=mid-1;</p><p><b> else</b></p><p> low=mid+1;</p><p><b> }</b></p&
36、gt;<p><b> return 0;</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> STable L;</b></
37、p><p> int i,key,n;</p><p> printf("輸入銷售單的個數:");</p><p> scanf("%d",&n);</p><p> if(CreatTable(&L,n)==ERROR)</p><p><b>
38、 return;</b></p><p> ShowTable(L);</p><p> printf("輸入要查找的銷售單號:");</p><p> scanf("%d",&key);</p><p> i=SearchTable(L,key);</p>&
39、lt;p><b> if(i!=0)</b></p><p><b> {</b></p><p> printf("找到:%d \n",key);</p><p> printf("在銷售表中的位置是%d,銷售員是%s\n",i,L.elem[i].name);<
40、;/p><p><b> }</b></p><p><b> else </b></p><p> printf("未找到:%d\n",key);</p><p> SortTable(&L);</p><p> ShowTable(L);
41、</p><p> i=SearchBin(L,key);</p><p><b> if(i!=0)</b></p><p> { printf("找到:%d \n",key);</p><p> printf("在銷售表中的位置是%d,銷售員是%s\n",i,L.e
42、lem[i].name);</p><p><b> }</b></p><p><b> else </b></p><p> printf("未找到:%d\n",key);</p><p> DestroyTable(&L);</p><p
43、><b> }</b></p><p><b> 測試結果:</b></p><p><b> 實驗小結:</b></p><p> 沒遇到太大的問題,在=和== 功能上會有失誤的時候 不過在將key==…時就會解決這個問題。</p><p> [二] 二叉排序
44、樹的操作</p><p> ?。?)創(chuàng)建一棵二叉排序樹;</p><p> ?。?)二叉排序樹上的查找操作;</p><p> ?。?)二叉排序樹上的刪除操作;</p><p> ADT StaticSortBST</p><p><b> {</b></p><p>
45、 數據對象D:數據集合</p><p><b> 數據關系R:二叉樹</b></p><p><b> 基本操作T:</b></p><p> int SearchBST(T, key ,f ,&p)</p><p> 初始條件:二叉排序樹存在</p><p&g
46、t; 操作結果:若T中存在其關鍵字等于key的數據元素,則函數值返回其在表中的位置,否則為0。</p><p> int InsertBST(&T,int n)</p><p> 操作結果:以二叉排序樹的規(guī)則插入結點,成功返回1,否則返回0</p><p> void DestroyBST(& T)</p><p>
47、 初始條件:二叉排序樹T存在</p><p><b> 操作結果:銷毀樹T</b></p><p> void Preorder(T)</p><p> 操作結果:先序遍歷二叉排序樹,并輸出各節(jié)點信息</p><p> void Inorder(T)</p><p> 操作結果:中序遍歷
48、二叉排序樹,并輸出各節(jié)點信息</p><p><b> }</b></p><p><b> 源代碼:</b></p><p> #include"stdio.h"</p><p> #include"stdlib.h"</p><
49、p> #include"string.h"</p><p> typedef struct BiTNode</p><p><b> {</b></p><p><b> int data;</b></p><p> struct BiTNode *lchild,
50、*rchild;</p><p> }*BiTree,BiTNode;</p><p> int SearchBST(BiTree T,int key,BiTree f,BiTree *p)</p><p><b> {</b></p><p><b> if(!T)</b></p&g
51、t;<p><b> {</b></p><p><b> *p=f;</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else </b&
52、gt;</p><p> if(key==T->data)</p><p><b> {</b></p><p><b> *p=T;</b></p><p><b> return 1;</b></p><p><b> }&
53、lt;/b></p><p><b> else </b></p><p> if(key<T->data)</p><p> return SearchBST(T->lchild,key,T,p);</p><p> else return SearchBST(T->rchild,
54、key,T,p);</p><p><b> }</b></p><p> int InsertBST(BiTree *T,int n)</p><p><b> {</b></p><p> BiTree s=NULL,p=NULL;</p><p> if(!S
55、earchBST(*T,n,NULL,&p))</p><p><b> {</b></p><p> s=(BiTree)malloc(sizeof(BiTNode));</p><p> s->data=n;</p><p> s->lchild=NULL;</p><
56、p> s->rchild=NULL;</p><p><b> if(!p)</b></p><p><b> *T=s;</b></p><p><b> else</b></p><p> if(n<p->data)</p>
57、<p> p->lchild=s;</p><p><b> else</b></p><p> p->rchild=s;</p><p><b> return 1;</b></p><p><b> }</b></p><
58、p> else return 0;</p><p><b> }</b></p><p> void DestroyBST(BiTree T)//采用后序遍歷的方法釋放空間</p><p><b> {</b></p><p> if(T!=NULL)</p><
59、p><b> {</b></p><p> DestroyBST(T->lchild);</p><p> DestroyBST(T->rchild);</p><p><b> free(T);</b></p><p><b> }</b><
60、/p><p><b> }</b></p><p> void Preorder(BiTree T)//先序遍歷二叉樹</p><p><b> {</b></p><p><b> if(T)</b></p><p><b> {<
61、;/b></p><p> printf("%d",T->data);</p><p> Preorder(T->lchild);</p><p> Preorder(T->rchild);</p><p><b> }</b></p><p>
62、<b> }</b></p><p> void Inorder(BiTree T)//中序遍歷二叉樹</p><p><b> {</b></p><p><b> if(T)</b></p><p><b> {</b></p>
63、<p> Inorder(T->lchild);</p><p> printf("%d",T->data);</p><p> Inorder(T->rchild);</p><p><b> }</b></p><p><b> }</b&g
64、t;</p><p> int SearchDeleteBST(BiTree T,int key,BiTree *f,BiTree *p)</p><p><b> {</b></p><p><b> if(!T)</b></p><p><b> return 0;</
65、b></p><p><b> else</b></p><p> if(key==T->data)</p><p><b> { *p=T;</b></p><p><b> return 1;</b></p><p><b
66、> }</b></p><p><b> else</b></p><p> if(key<T->data)</p><p><b> { *f=T;</b></p><p> return SearchDeleteBST(T->lchild,key
67、,f,p);</p><p><b> }</b></p><p><b> else </b></p><p><b> { *f=T;</b></p><p> return SearchDeleteBST(T->rchild,key,f,p);</
68、p><p><b> }</b></p><p><b> }</b></p><p> int DeleteBST(BiTree *T,int key)</p><p><b> {</b></p><p> BiTree p,f,s;</
69、p><p> if(SearchDeleteBST(*T,key,&f,&p)==0)</p><p><b> return 0;</b></p><p> if(!p->rchild)</p><p><b> {</b></p><p> f
70、->lchild=p->lchild;</p><p><b> free(p);</b></p><p><b> }</b></p><p><b> else </b></p><p> if(!p->lchild)</p><
71、;p><b> {</b></p><p> f->lchild=p->rchild;</p><p><b> free(p);</b></p><p><b> }</b></p><p><b> else</b><
72、;/p><p><b> {</b></p><p><b> f=p;</b></p><p> s=p->lchild;</p><p> while(s->rchild)</p><p><b> {</b></p>
73、<p><b> p=s;</b></p><p> s=s->rchild;</p><p><b> }</b></p><p> f->data=s->data;</p><p><b> if(f!=p)</b></p&g
74、t;<p> p->rchild=s->lchild;</p><p><b> else</b></p><p> p->lchild=s->lchild;</p><p><b> free(s);</b></p><p><b> }
75、</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> BiTree T=NULL,p=
76、NULL;</p><p> int m_inum,m_icount,m_icin,m_ifeedback,m_ifind,m_idelete;</p><p> printf("二叉樹結點的個數:");</p><p> scanf("%d",&m_inum);</p><p> pr
77、intf("創(chuàng)建一棵結點數為%d的二叉排序樹\n",m_inum);</p><p> for(m_icount=0;m_icount<m_inum;m_icount++)</p><p><b> {</b></p><p> printf("輸入結點數據");</p><
78、;p> scanf("%d",&m_icin);</p><p> m_ifeedback=InsertBST(&T,m_icin);</p><p> if(m_ifeedback=1)</p><p> printf("插入成功\n");</p><p> if(m_
79、ifeedback=0)</p><p> printf("也存在該關鍵字");</p><p><b> }</b></p><p> printf("\n先序遍歷的序列是:");</p><p> Preorder(T);</p><p> p
80、rintf("\n中序遍歷的序列是:");</p><p> Inorder(T);</p><p> putchar('\n');</p><p> printf("輸入要查找的數據");</p><p> scanf("%d",&m_ifind);
81、</p><p> if(SearchBST(T,m_ifind,NULL,&p)==1)</p><p><b> {</b></p><p> printf("找到!%d\n",m_ifind);</p><p> if(p->lchild&&p->rc
82、hild)</p><p> printf("值為%d的結點的度為2\n",m_ifind);</p><p><b> else</b></p><p> if(!p->lchild&&!p->rchild)</p><p> printf("值為%d的
83、結點的度為0\n",m_ifind);</p><p> else printf("值為%d的結點的度為1\n",m_ifind);</p><p><b> }</b></p><p> else printf("未找到:%d",m_ifind);</p><p>
84、; printf("輸入要刪除的數據:");</p><p> scanf("%d",&m_idelete);</p><p> if(DeleteBST(&T,m_idelete)==1)</p><p> printf("刪除成功\n");</p><p>
85、; else printf("刪除失敗");</p><p> printf("\n先序遍歷的序列是:");</p><p> Preorder(T);</p><p> printf("\n中序遍歷的序列是");</p><p> Inorder(T);</p>
86、;<p> printf("\n");</p><p> DestroyBST(T);</p><p><b> }</b></p><p><b> 測試結果:</b></p><p><b> 實驗小結:</b></p>
87、;<p> 該實驗掌握的比較好,沒什么大問題,對于二叉排序樹理解還不錯。</p><p> [三] 無向網的操作</p><p> ?。?)創(chuàng)建一個連通的無向網(邊上的權都是正整數,表示某種代價);</p><p> (2)對這個無向網可以實施深度或廣度優(yōu)先遍歷;</p><p> (3)求這個無向網的一棵最小生成樹。&
88、lt;/p><p> ADT UDNGraph</p><p><b> {</b></p><p> 數據對象D:數據集合</p><p><b> 數據關系R:無向圖</b></p><p><b> 基本操作T:</b></p>
89、<p> void CreateUDN(&G)</p><p> 操作結果:創(chuàng)建一個含權值的無向圖。</p><p> void DFSGraph(G)</p><p> 初始條件:無向圖G存在</p><p> 操作結果:深度優(yōu)先遍歷該無向圖。</p><p> void BFSTra
90、verse(G)</p><p> 初始條件:無向圖G存在</p><p> 操作結果:廣度優(yōu)先遍歷該無向圖。</p><p> long MiniSpanTree_PRIM(G, u)</p><p> 操作結果:用普利姆算法生成最小二叉樹,成功返回權值,失敗返回-1</p><p><b> }
91、</b></p><p> 源代碼://內含隊列的操作</p><p> #include"stdio.h"</p><p> #include"stdlib.h"</p><p> #define MAXQSIZE 100</p><p> #define
92、 INFINITY 9999</p><p> #define MAX_VERTEX_NUM 20</p><p> typedef enum {DG,DN,UDG,UDN} GraphKind;</p><p> typedef struct ArcCell</p><p><b> {</b></p&g
93、t;<p><b> int adj;</b></p><p> char *info;</p><p> }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];</p><p> typedef struct </p><p><b>
94、{</b></p><p> int vex[MAX_VERTEX_NUM];</p><p> AdjMatrix arcs;</p><p> int vexnum,arcnum;</p><p> GraphKind kind;</p><p><b> }MGraph;</
95、b></p><p> void CreateUDN(MGraph *G)</p><p><b> {</b></p><p> int i,j,k,w;</p><p> G->kind=UDN;</p><p> printf("輸入圖的頂點數和邊數:&quo
96、t;);</p><p> scanf("%d%d",&G->vexnum,&G->arcnum);</p><p> for(i=0;i<G->vexnum;i++)</p><p> G->vex[i]=i;</p><p> for(i=0;i<G->
97、vexnum;i++)</p><p> for(j=0;j<G->vexnum;j++)</p><p><b> {</b></p><p> G->arcs[i][j].adj=INFINITY;</p><p> G->arcs[i][j].info=NULL;</p>
98、<p><b> }</b></p><p> printf("錄入 %d條邊,</p><p> 例如 0 1 5表示0 1之間有邊,權為5;\n",G->arcnum);</p><p> for(k=0;k<G->arcnum;k++)</p><p>&
99、lt;b> {</b></p><p> scanf("%d%d%d",&i,&j,&w);</p><p> G->arcs[i][j].adj=w;</p><p> G->arcs[j][i].adj=G->arcs[i][j].adj;</p><p&
100、gt;<b> }</b></p><p><b> }</b></p><p> int visited[MAX_VERTEX_NUM]={0};</p><p> void DFS(MGraph G,int v)</p><p><b> {</b></p&
101、gt;<p><b> int w=0;</b></p><p> visited[v]=1;</p><p> printf("%3d",G.vex[v]);</p><p> for(;w<G.vexnum;w++)</p><p> if(G.arcs[v][w].
102、adj!=INFINITY&&!visited[w])</p><p><b> DFS(G,w);</b></p><p><b> }</b></p><p> void DFSGraph(MGraph G)</p><p><b> {</b>&l
103、t;/p><p><b> int i;</b></p><p> for(i=0;i<G.vexnum;i++)</p><p><b> {</b></p><p> if(!visited[i])</p><p><b> {</b>&
104、lt;/p><p> printf("\n從%d出發(fā)深度優(yōu)先遍歷的結果是:",i);</p><p><b> DFS(G,i);</b></p><p><b> }</b></p><p><b> }</b></p><p>
105、;<b> }</b></p><p> typedef struct</p><p><b> {</b></p><p> int *base;</p><p> int front;</p><p><b> int rear;</b>
106、</p><p><b> }SqQueue;</b></p><p> void InitQueue(SqQueue *Q)</p><p><b> {</b></p><p> Q->base=(int *)malloc(MAXQSIZE *sizeof(int));</p
107、><p> if(NULL==Q->base)</p><p><b> {</b></p><p> printf("\n分配空間失??!");</p><p><b> return;</b></p><p><b> }</
108、b></p><p> Q->front=Q->rear=0;</p><p><b> }</b></p><p> void DestroyQueue(SqQueue *Q)</p><p><b> {</b></p><p> if(Q-&
109、gt;base!=NULL)</p><p> free(Q->base);</p><p><b> }</b></p><p> int QueueLength(SqQueue Q)</p><p><b> {</b></p><p> return (
110、Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;</p><p><b> }</b></p><p> void EnQueue(SqQueue *Q,int e)</p><p><b> {</b></p><p> if((Q->rear+1)%MAXQSI
111、ZE==Q->front)</p><p><b> return;</b></p><p> Q->base[Q->rear]=e;</p><p> Q->rear=(Q->rear+1)%MAXQSIZE;</p><p><b> }</b></p
112、><p> void DeQueue(SqQueue *Q,int *e)</p><p><b> {</b></p><p> if(Q->front==Q->rear)</p><p><b> return;</b></p><p> *e=Q-&g
113、t;base[Q->front];</p><p> Q->front=(Q->front+1)%MAXQSIZE;</p><p><b> }</b></p><p> int QueueEmpty(SqQueue Q)</p><p><b> {</b></p
114、><p> return Q.front==Q.rear;</p><p><b> }</b></p><p> void BFSTraverse(MGraph G)</p><p><b> {</b></p><p> int v,w,u,visited[MAX_
115、VERTEX_NUM];</p><p> SqQueue Q;</p><p> for(v=0;v<G.vexnum;v++)</p><p> visited[v]=0;</p><p> InitQueue(&Q);</p><p> for(v=0;v<G.vexnum;v++)
116、</p><p> if(!visited[v])</p><p><b> {</b></p><p> visited[v]=1;</p><p> printf("\n從%d出發(fā)廣度優(yōu)先遍歷的結果是: ",G.vex[v]);</p><p> printf(&
117、quot;%3d",G.vex[v]);</p><p> EnQueue(&Q,v);</p><p> while(!QueueEmpty(Q))</p><p><b> {</b></p><p> DeQueue(&Q,&u);</p><p>
118、 for(w=0;w<G.vexnum;w++)</p><p><b> {</b></p><p> if(G.arcs[u][w].adj!=INFINITY)</p><p><b> {</b></p><p> if(!visited[w])</p><
119、;p><b> {</b></p><p> visited[w]=1;</p><p> printf("%3d",G.vex[w]);</p><p> EnQueue(&Q,w);</p><p><b> }</b></p><
120、p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> DestroyQueue(&Q);</p><p>
121、;<b> }</b></p><p><b> struct</b></p><p><b> {</b></p><p> int adjvex;</p><p> int lowcost;</p><p> }closedge[MAX_
122、VERTEX_NUM];</p><p> int minnum(MGraph G)</p><p><b> {</b></p><p> int i,k,min=INFINITY;</p><p><b> k=-1;</b></p><p> for(i=0;
123、i<G.vexnum;i++)</p><p><b> {</b></p><p> if(closedge[i].lowcost>0&&closedge[i].lowcost<min)</p><p><b> {</b></p><p> min=cl
124、osedge[i].lowcost;</p><p><b> k=i;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return k;</b></p><p&g
125、t;<b> }</b></p><p> long MiniSpanTree_PRIM(MGraph G,int u)</p><p><b> {</b></p><p> int k,i,j;</p><p> long sum=0;</p><p><
126、b> k=u;</b></p><p> for(j=0;j<G.vexnum;j++)</p><p><b> {</b></p><p><b> if(j!=k)</b></p><p><b> {</b></p>&l
127、t;p> closedge[j].adjvex=u;</p><p> closedge[j].lowcost=G.arcs[k][j].adj;</p><p><b> }</b></p><p><b> }</b></p><p> closedge[k].lowcost=0
128、;</p><p> for(i=1;i<G.vexnum;i++)</p><p><b> {</b></p><p> k=minnum(G);</p><p><b> if(k==-1)</b></p><p><b> {</b&g
129、t;</p><p> printf("\n無邊可選,求最小生成樹算法非正常結束!");</p><p> return -1;</p><p><b> }</b></p><p> printf("\n%d:(%d,%d)%d",</p><p>
130、; i,closedge[k].adjvex,k,closedge[k].lowcost);</p><p> sum+=closedge[k].lowcost;</p><p> closedge[k].lowcost=0;</p><p> for(j=0;j<G.vexnum;j++)</p><p><b>
131、 {</b></p><p> if(G.arcs[k][j].adj<closedge[j].lowcost)</p><p><b> {</b></p><p> closedge[j].adjvex=k;</p><p> closedge[j].lowcost=G.arcs[k][j]
132、.adj;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> return sum;</p><p><b> }</b></p>
133、;<p> void main()</p><p><b> {</b></p><p><b> MGraph M;</b></p><p><b> long sum;</b></p><p> CreateUDN(&M);</p>
134、;<p> DFSGraph(M);</p><p> BFSTraverse(M);</p><p> printf("\n圖的最小生成樹依次選的邊:");</p><p> sum=MiniSpanTree_PRIM(M,0);</p><p> printf("\n圖的最小代價之和是
135、%ld\n",sum);</p><p><b> }</b></p><p><b> 測試結果:</b></p><p><b> 實驗小結:</b></p><p> 普利姆算法實現時遇到困難,反復只選一條邊,經測試發(fā)現為一處判斷出現錯誤,導致錯誤。還想
136、實驗克魯斯卡爾算法。</p><p> [四] 有向圖的操作</p><p> (1)創(chuàng)建一個具有偏序關系有向圖;</p><p> ?。?)對這個有向圖實施拓撲排序。</p><p> ADT DGGraph</p><p><b> {</b></p><p>
137、 void CreateDG(& G)</p><p> 操作結果:創(chuàng)建一個具有偏序關系的有向圖。</p><p> void Display(G)</p><p> 操作結果:顯示有向圖。</p><p> int TopologicalSort(G)</p><p> 操作結果:進行拓撲排序。&
138、lt;/p><p><b> }</b></p><p> 源代碼://內含棧的操作</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include<string.h>&
139、lt;/p><p> #define INFINITY 32767</p><p> #define MAX_VERTEX_NUM 26</p><p> #define TRUE 1</p><p> #define FALSE 0</p><p> typedef struct</p><
140、p><b> {</b></p><p><b> int adj;</b></p><p> }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];</p><p> typedef struct </p><p><b>
141、 {</b></p><p> char vexs[MAX_VERTEX_NUM];</p><p> AdjMatrix arcs;</p><p> int vexnum, arcnum;</p><p><b> }MGraph;</b></p><p> int I
142、ndegree[MAX_VERTEX_NUM] = {0};//標記用</p><p> typedef struct Stack_</p><p><b> {</b></p><p> char sta[MAX_VERTEX_NUM];</p><p><b> int top;</b>
143、</p><p><b> }Stack;</b></p><p> Stack stack;</p><p> int LocateVex(MGraph G, char u)</p><p><b> {</b></p><p><b> int i;&
144、lt;/b></p><p> for(i = 0; i < G.vexnum;i++)</p><p><b> {</b></p><p> if(u == G.vexs[i])//字符可以直接相等</p><p><b> return i;</b></p>
145、<p><b> }</b></p><p> return -1;</p><p><b> }</b></p><p> char GetVex(MGraph G, int v)</p><p><b> {</b></p><p&g
146、t; if(v >= G.vexnum || v < 0)</p><p><b> exit(0);</b></p><p> return G.vexs[v];</p><p><b> }</b></p><p> int FirstAdjVex(MGraph G, in
147、t v)</p><p><b> {</b></p><p><b> int i;</b></p><p> int j = INFINITY;</p><p> for(i = 0; i < G.vexnum;i++)</p><p> if(G.arc
148、s[v][i].adj != j)</p><p><b> return i;</b></p><p> return -1;</p><p><b> }</b></p><p> int NextAdjVex(MGraph G, int v, int w)</p><
149、;p><b> {</b></p><p><b> int i;</b></p><p> int j = INFINITY;</p><p> for(i = w+1; i < G.vexnum;i++)</p><p> if(G.arcs[v][i].adj != j)
150、</p><p><b> return i;</b></p><p> return -1;</p><p><b> }</b></p><p> void CreateDG(MGraph * G)</p><p><b> {</b>&
151、lt;/p><p> int i, j, k;</p><p> char v1, v2;</p><p> printf("請輸入有向圖G的頂點數, 邊數(例如:3 4)");</p><p> scanf("%d%d", &G->vexnum, &G->arcnum)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論