《数据结构与算法》实验报告——无向图邻接表的构造
《數(shù)據(jù)結(jié)構(gòu)》實(shí)驗(yàn)報(bào)告
?
| 學(xué)號(hào):? 2018329621200 ?? | 機(jī)器號(hào)?? 10-414-28? ? ? ? | 姓名:? 申屠志剛??? |
| 日期:? 2019/12/9??? ????? | 程序名:???? main.cpp???? ???????????????????????? | |
| 實(shí)驗(yàn)內(nèi)容:?? 無(wú)向圖鄰接表的構(gòu)造???? | ||
一、目的和要求(需求分析):
1、掌握鄰接表的存儲(chǔ)結(jié)構(gòu)以及鄰接表的建立和操作。
2、 構(gòu)造一個(gè)無(wú)向圖的鄰接表,要求從鍵盤(pán)輸入圖的頂點(diǎn)數(shù)和圖的邊數(shù),并顯示所構(gòu)造的鄰接表)
實(shí)驗(yàn)拓展:
1.? 構(gòu)建有向圖的鄰接表
2.? 判斷邊是否存在
3.? 求頂點(diǎn)的度數(shù)
二、程序設(shè)計(jì)的基本思想,原理和算法描述:
鄰接表是數(shù)組與鏈表相結(jié)合的存儲(chǔ)方法,相比于順序存儲(chǔ)結(jié)構(gòu)(鄰接矩陣),節(jié)省空間。
三、調(diào)試和運(yùn)行程序過(guò)程中產(chǎn)生的問(wèn)題及采取的措施:
1、度數(shù)求法;
措施:添加邊時(shí)即記錄度數(shù)。
2、對(duì)應(yīng)節(jié)點(diǎn)和節(jié)點(diǎn)編號(hào);
措施:歷遍查找。
3、區(qū)分有向圖和無(wú)向圖;
措施:添加標(biāo)記,以判斷是否添加反向邊。
四、源程序及注釋:
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h>#define MAXVEX 30 using namespace std; int visited[MAXVEX]; int n,m; typedef char VertexType; typedef struct ArcNode {int adjvex; /*鄰接點(diǎn)序號(hào)*/VertexType data; /*鄰接點(diǎn)信息*/struct ArcNode *nextarc;char *info; } ArcNode; typedef struct VNode {VertexType data; /*結(jié)點(diǎn)信息*/ArcNode *firstarc; /*指向下一個(gè)邊結(jié)點(diǎn)*/ }VNode,AdjList[MAXVEX];typedef struct //圖結(jié)構(gòu) {AdjList vertices;int vexnum,arcnum; //圖的當(dāng)前頂點(diǎn)數(shù)與弧數(shù)int in[MAXVEX],out[MAXVEX]; }ALGraph; int LocateVex(ALGraph G,char v) //查找值為v的頂點(diǎn)在頂點(diǎn)向量G.vexs[]中的位置 {int i;for(i=0;i<G.vexnum;i++)if(v==G.vertices[i].data)return i;return -1; }int FirstAdjVex(ALGraph G,char v)//返回v的第一個(gè)鄰接頂點(diǎn)的序號(hào) {int i;ArcNode *p;i=LocateVex(G,v); //i為頂點(diǎn)v在圖G中的序號(hào)if(i==-1)return -1;p=G.vertices[i].firstarc;if(p)return p->adjvex;elsereturn -1; }int NextAdjVex(ALGraph G,char v,char w)//返回v的(相對(duì)于w)的下一個(gè)鄰接頂點(diǎn)的序號(hào) {int i,j;ArcNode *p,*q;i=LocateVex(G,v);j=LocateVex(G,w);if(i==-1||j==-1||i==j)return -1;p=G.vertices[i].firstarc; //p指向v的鄰接頂點(diǎn)鏈表中的第一個(gè)鄰接頂點(diǎn)while(p->nextarc&&p->adjvex!=j) //找到鄰接頂點(diǎn)wp=p->nextarc;if(p->nextarc) //找到鄰接頂點(diǎn)w,且w非v的最后一個(gè)鄰接頂點(diǎn){q=p->nextarc;return q->adjvex; //返回v的(相對(duì)于w)的下一個(gè)鄰接頂點(diǎn)的序號(hào)}elsereturn -1; //沒(méi)有找到w或w是v的最后一個(gè)鄰接頂點(diǎn) }int Visit(char v) {printf("%c ",v);return 1; } int add(ALGraph &G,int i,int j){ArcNode *p,*q;G.out[i]++;G.in[j]++;p=(ArcNode *)malloc(sizeof(ArcNode));p->adjvex=j;p->info=NULL;p->nextarc=NULL;if(!G.vertices[i].firstarc)G.vertices[i].firstarc=p;else{//找尾結(jié)點(diǎn)for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc);q->nextarc=p; //插入到鏈表尾} } int CreateDG(ALGraph &G) //采用鄰接表表示,構(gòu)造有向圖G {int v,e,i,j,t,f;ArcNode *p,*q;char tail,head;printf("輸入頂點(diǎn)個(gè)數(shù):");scanf("%d",&v);if(v<0)return 0;G.vexnum=v;printf("輸入弧的條數(shù):");scanf("%d",&e);if(e<0)return 0;G.arcnum=e;printf("無(wú)向圖/有向圖(0/1):");scanf("%d",&f);printf("建立DG:\n");for(t=0;t<G.vexnum;t++) //建立頭結(jié)點(diǎn)順序表{fflush(stdin);printf("輸入%d的信息:",t+1);scanf("%c",&G.vertices[t].data);G.vertices[t].firstarc=NULL; //初始化該頭結(jié)點(diǎn)指針域G.in[t]=0;G.out[t]=0;}for(t=0;t<G.arcnum;t++) //建立表結(jié)點(diǎn)鏈表(每個(gè)頂點(diǎn)的鄰接頂點(diǎn)鏈表){fflush(stdin);printf("輸入弧的信息(弧尾-弧頭)");scanf("%c%*c%c",&tail,&head);i=LocateVex(G,tail);j=LocateVex(G,head);if(i==-1||j==-1||i==j)return 0;add(G,i,j);if(f)add(G,j,i);}return 1; }int DFS(ALGraph G,int v) //從第v個(gè)頂點(diǎn)出發(fā),遞歸的深度優(yōu)先遍歷有向圖G {int w;visited[v]=-1;printf("%c ",G.vertices[v].data);w=FirstAdjVex(G,G.vertices[v].data);for(;w>=0;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data))if(!visited[w])DFS(G,w); //對(duì)v的尚未訪問(wèn)的鄰接頂點(diǎn)w遞歸調(diào)用DFS()return 1; }int DFSTraverse(ALGraph G) //深度優(yōu)先搜索遍歷圖G {int i;for(i=0;i<G.vexnum;i++)visited[i]=0;for(i=0;i<G.vexnum;i++)if(!visited[i])DFS(G,i);return 1; } void printALGraph(ALGraph G){for(int i=0;i<G.vexnum;i++){printf("%c|%d-->",G.vertices[i].data,i);for(ArcNode* q=G.vertices[i].firstarc;q;q=q->nextarc){printf("%d-->",q->adjvex);}printf("null\n");} } void printdegree(ALGraph G){printf("Node\t入度\t出度\t度\n");for(int i=0;i<G.vexnum;i++){printf("%c\t%d\t%d\t%d\n",G.vertices[i].data,G.in[i],G.out[i],G.in[i]+G.out[i]);} } int checkarc(ALGraph G){while(1){char tail,head;fflush(stdin);printf("輸入弧的信息(弧尾-弧頭)");scanf("%c%*c%c",&tail,&head);int i=LocateVex(G,tail);int j=LocateVex(G,head);if(i==-1||j==-1||i==j)return 0;int f=0;for(ArcNode* q=G.vertices[i].firstarc;q;q=q->nextarc){if(j==q->adjvex){f=1;break;}}if(f)printf("Yes\n");else printf("No\n");} } int main() {ALGraph G;printf("建立有向圖G\n");if(CreateDG(G)){printALGraph(G);printdegree(G);printf("深度優(yōu)先搜索的順序:");DFSTraverse(G);printf("\n");}checkarc(G);return 0; }五、運(yùn)行輸出結(jié)果:
六、心得與體會(huì):
1、掌握鄰接表的存儲(chǔ)結(jié)構(gòu)以及鄰接表的建立和操作。
2、構(gòu)造無(wú)向圖/有向圖的鄰接表。
3、轉(zhuǎn)換思想,記錄不變量。
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的《数据结构与算法》实验报告——无向图邻接表的构造的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: BIOS——[PXE-E61:Media
- 下一篇: Eclipse——UML类图插件