日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《数据结构与算法》实验报告——无向图邻接表的构造

發(fā)布時(shí)間:2024/10/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《数据结构与算法》实验报告——无向图邻接表的构造 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。