数据结构C语言版 图的建立与遍历
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int CreateGraph(MGraph *G){ int i,j,k; VertexType v1,v2; printf("请依次输入无向网的顶点数和弧数:\n"); scanf("%d%d",&G->vexnum,&G->arcnum);
printf("请输入 %d 顶点向量:",G->vexnum); for(i=0;i<G->vexnum;i++) {
#include<stdio.h> #include<malloc.h> #include <stdlib.h> #include<string.h> #define null 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status;
printf("\n 请输入 %d 条弧关系的邻接矩阵:\n",G->arcnum); for(k=0;k<G->arcnum;k++) {
scanf("%s%s",v1,v2); i=LocateVex(G,v1);
j=LocateVex(G,v2); G->arcs[i][j].adj=1; G->arcs[j][i]=G->arcs[i][j]; } return(1); }
void DfsTraverse(MGraph *G) {
int v; for (v=0;v<G->vexnum;v++)
visited[v]=FALSE; for(v=0;v<G->vexnum;v++)
if(!visited[v]) Dfs(G,v); }
//主函数——用采用数组(邻接矩阵)表示法,构造无向网 G-----------------void main() {
void Dfs(MGraph *G,int v) {
int w; visited[v]=TRUE; printf("%s",G->vexs[v]); for(w=FirstAdjVex(G,v); w>=0;w=NextAdjVex(G,v,w))
if(!visited[w]) Dfs(G,w); }
}MGraph;
/*图的临接表存储表示-----------------------------------typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc; InfoType *info; }ArcNode;
typedef struct VNode{ VertexType data; ArcNode *firstarc;
MGraph G; CreateGraph(&G); PrintGraph(&G); printf("\n 深度遍历:\n"); DfsTraverse(&G); printf("\n");
}
int j,p=-1; for(j=w+1;j<G->vexnum;j++)
if(G->arcs[v][j].adj==1) {p=j; break;} return(p); }
//按邻接矩阵方式输出无向图---------void PrintGraph(MGraph *G) {
int i,j; printf("\n 无向图为:\n"); for(i=0;i<G->vexnum;i++) {
printf("%10s",G->vexs[i]);
for(j=0;j<G->vexnum;j++) printf("%4d",G->arcs[i][j].adj);
printf("\n"); } }
//图的深度遍历-------------------------------------------Boolean visited[MAX_VERTEX_NUM];
scanf("%s",G->vexs[i]); } printf("顶点列表:\n"); for(i=0;i<G->vexnum;i++)
puts(G->vexs[i]);
for(i=0;i<G->vexnum;i++) for(j=0;j<G->vexnum;j++) { G->arcs[i][j].adj=0; }
typedef struct ArcCell{ VRType adj; //InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vexnum,arcnum;
/*----------------------------------------------------数据结构 C 语言版——图的建立与遍历 编程环境 VC++ 6.0 Damon 2012 年 4 月 26 号
------------------------------------------------------*/
int LocateVex(MGraph *G,VertexType v){ int i; for(i=0;i<=G->vexnum;i++) { if (strcmp(v,G->vexs[i])==0) break; } ret百度文库rn(i);
}
//查找第一个邻接点--------------------int FirstAdjVex(MGraph *G,int v) {
//图的邻接矩阵——数组存储表示------------------------#define INFINITY INT_MAX #define MAX_VERTEX_NUM 20
typedef int VRType; typedef char VertexType[20]; typedef int Boolean;
int j,p=-1; for(j=0;j<G->vexnum;j++)
if(G->arcs[v][j].adj==1) {p=j;break;} return(p); }
//查找下一个邻接点----------------------int NextAdjVex(MGraph *G,int v,int w) {
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{ AdjList vertices; int vexnum,arcnum; int kind;
}ALGraph; */
//采用数组(邻接矩阵)表示法,构造无向图 G-------------int LocateVex(MGraph *G,VertexType v);
printf("请输入 %d 顶点向量:",G->vexnum); for(i=0;i<G->vexnum;i++) {
#include<stdio.h> #include<malloc.h> #include <stdlib.h> #include<string.h> #define null 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status;
printf("\n 请输入 %d 条弧关系的邻接矩阵:\n",G->arcnum); for(k=0;k<G->arcnum;k++) {
scanf("%s%s",v1,v2); i=LocateVex(G,v1);
j=LocateVex(G,v2); G->arcs[i][j].adj=1; G->arcs[j][i]=G->arcs[i][j]; } return(1); }
void DfsTraverse(MGraph *G) {
int v; for (v=0;v<G->vexnum;v++)
visited[v]=FALSE; for(v=0;v<G->vexnum;v++)
if(!visited[v]) Dfs(G,v); }
//主函数——用采用数组(邻接矩阵)表示法,构造无向网 G-----------------void main() {
void Dfs(MGraph *G,int v) {
int w; visited[v]=TRUE; printf("%s",G->vexs[v]); for(w=FirstAdjVex(G,v); w>=0;w=NextAdjVex(G,v,w))
if(!visited[w]) Dfs(G,w); }
}MGraph;
/*图的临接表存储表示-----------------------------------typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc; InfoType *info; }ArcNode;
typedef struct VNode{ VertexType data; ArcNode *firstarc;
MGraph G; CreateGraph(&G); PrintGraph(&G); printf("\n 深度遍历:\n"); DfsTraverse(&G); printf("\n");
}
int j,p=-1; for(j=w+1;j<G->vexnum;j++)
if(G->arcs[v][j].adj==1) {p=j; break;} return(p); }
//按邻接矩阵方式输出无向图---------void PrintGraph(MGraph *G) {
int i,j; printf("\n 无向图为:\n"); for(i=0;i<G->vexnum;i++) {
printf("%10s",G->vexs[i]);
for(j=0;j<G->vexnum;j++) printf("%4d",G->arcs[i][j].adj);
printf("\n"); } }
//图的深度遍历-------------------------------------------Boolean visited[MAX_VERTEX_NUM];
scanf("%s",G->vexs[i]); } printf("顶点列表:\n"); for(i=0;i<G->vexnum;i++)
puts(G->vexs[i]);
for(i=0;i<G->vexnum;i++) for(j=0;j<G->vexnum;j++) { G->arcs[i][j].adj=0; }
typedef struct ArcCell{ VRType adj; //InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vexnum,arcnum;
/*----------------------------------------------------数据结构 C 语言版——图的建立与遍历 编程环境 VC++ 6.0 Damon 2012 年 4 月 26 号
------------------------------------------------------*/
int LocateVex(MGraph *G,VertexType v){ int i; for(i=0;i<=G->vexnum;i++) { if (strcmp(v,G->vexs[i])==0) break; } ret百度文库rn(i);
}
//查找第一个邻接点--------------------int FirstAdjVex(MGraph *G,int v) {
//图的邻接矩阵——数组存储表示------------------------#define INFINITY INT_MAX #define MAX_VERTEX_NUM 20
typedef int VRType; typedef char VertexType[20]; typedef int Boolean;
int j,p=-1; for(j=0;j<G->vexnum;j++)
if(G->arcs[v][j].adj==1) {p=j;break;} return(p); }
//查找下一个邻接点----------------------int NextAdjVex(MGraph *G,int v,int w) {
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{ AdjList vertices; int vexnum,arcnum; int kind;
}ALGraph; */
//采用数组(邻接矩阵)表示法,构造无向图 G-------------int LocateVex(MGraph *G,VertexType v);