图的建立及输出课程设计源代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdio.h> #define MAX 20 //定义最大值 #define VRType int//定义顶点信息类型 #define InfoType char//定义弧的信息 #define VertexType int//顶点类型设为整形 #define OK 1 #define INFINITY 0 #define MAX_VERTEX_NUM 20 //最大顶点数为20 typedef struct { int data[MAX]; int front,rear; //顶点数和边数 } V; 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; //图的当前顶点数和弧数 }MGraph; int CreateUDN(MGraph *G);//图的深度优先遍历 int Print(MGraph *G); void DFSTraverse(MGraph G); void DFS(MGraph G,int v); int visited[MAX]; void BFSTraverse(MGraph G);//图的广度优先遍历 void BFS(MGraph G,int v); void QueueInit(V *sq); int QueueIn (V *sq, int x); int QueueIsEmpty(V sq);
} int Print(MGraph *G) { int i,j; printf("图的邻接矩阵输出为:\n"); for(i=0; i<G->vexnum; i++) { for(j=0; j<G->vexnum;j++) { printf("%d ",G->arcs[i][j].adj); } printf("\n"); } return OK; } void DFSTraverse(MGraph G) //图的深度优先遍历 { int v; printf("\n图的深度遍历输出为:\n"); for(v=0; v<G.vexnum; v++) { visited[v] = 0; } for(v=0; v<G.vexnum; v++) { if(visited[v] == 0) { DFS(G,v); printf("\n"); } } } void DFS(MGraph G,int v)//图的深度遍历图G的各个节点 { int w; visited[v] = 1;
QueueOut(&q); for(v2=0; v2<G.vexnum; v2++) { if(G.arcs[v1][v2].adj != 0 && visited[v2] == 0) { QueueIn(&q,v2); visited[v2]=1; printf("%d ",G.vexs[v2]); } } } } void QueueInit(V *sq) //初始化顺序循环列 { sq->front=0; sq->rear=0; } int QΒιβλιοθήκη BaidueueIsEmpty(V sq) //如果顺序循环队列为空,成功返回1,否则返回 0 { if (sq.rear==sq.front) return 1; else return 0; } int QueueFront(V sq, int *e)//将顺序循环队列sq的队头元素保存到e所指 地址 { if (QueueIsEmpty(sq)) { printf("queue is empty!\n"); return 0; } else { *e=sq.data[(sq.front)];
printf("%d ",G.vexs[v]); for(w=0; w<G.vexnum; w++) { if(G.arcs[v][w].adj ==1 && visited[w] == 0) { DFS(G,w); } } } void BFSTraverse(MGraph G)//图的广度优先遍历 { int v; printf("\n图的广度遍历输出为:\n"); for(v=0; v<G.vexnum; v++) { visited[v]=0; } for(v=0; v<G.vexnum; v++) { if(visited[v]==0) { BFS(G,v); printf("\n"); } } } void BFS(MGraph G,int v)//从v出发广度遍历图G的各个节点 { int v1,v2; V q; QueueInit(&q); QueueIn(&q,v); visited[v] = 1; printf("%d ",G.vexs[v]); while(QueueIsEmpty(q) == 0) { QueueFront(q,&v1);
return 1; } } int QueueIn (V *sq, int x)//将元素x如队列sq的队尾 { if (sq->front==(sq->rear+1)%MAX) { printf("queue is full!\n"); return 0; } else { sq->data[sq->rear]=x; sq->rear=(sq->rear+1)%MAX; return 1; } } int QueueOut(V *sq)//将队列sq队首元素出队列 { if (QueueIsEmpty(*sq)) { printf("queue is empty!\n"); return 0; } else { sq->front=(sq->front+1)%MAX; return 1; } }
int QueueFront(V sq, int *e); int QueueOut(V *sq); void main(void) //主函数 { MGraph g; MGraph *G = &g; CreateUDN(G); Print(G); DFSTraverse(g); BFSTraverse(g); } int CreateUDN(MGraph *G)//采用邻接矩阵表示法构造图 { int i,j,k,v1,v2,w; printf("----------------------------------\n"); printf("图的邻接矩阵的创建与深度、广度遍历\n"); printf("----------------------------------\n"); printf("输入顶点数和边数,用空格隔开:\n"); scanf("%d %d",&G->vexnum,&G->arcnum); for(i=0; i<G->vexnum; i++) { G->vexs[i] = i+1; } for(i=0; i < G->vexnum; i++) for(j=0; j < G->vexnum; j++) G->arcs[i][j].adj = INFINITY; for(k=0; k<G->arcnum; k++) { printf("输入弧的弧头和弧尾(1...%d)\n",G->vexnum); scanf("%d %d",&v1,&v2); G->arcs[v1-1][v2-1].adj = 1; G->arcs[v2-1][v1-1].adj = 1; } return OK;
} int Print(MGraph *G) { int i,j; printf("图的邻接矩阵输出为:\n"); for(i=0; i<G->vexnum; i++) { for(j=0; j<G->vexnum;j++) { printf("%d ",G->arcs[i][j].adj); } printf("\n"); } return OK; } void DFSTraverse(MGraph G) //图的深度优先遍历 { int v; printf("\n图的深度遍历输出为:\n"); for(v=0; v<G.vexnum; v++) { visited[v] = 0; } for(v=0; v<G.vexnum; v++) { if(visited[v] == 0) { DFS(G,v); printf("\n"); } } } void DFS(MGraph G,int v)//图的深度遍历图G的各个节点 { int w; visited[v] = 1;
QueueOut(&q); for(v2=0; v2<G.vexnum; v2++) { if(G.arcs[v1][v2].adj != 0 && visited[v2] == 0) { QueueIn(&q,v2); visited[v2]=1; printf("%d ",G.vexs[v2]); } } } } void QueueInit(V *sq) //初始化顺序循环列 { sq->front=0; sq->rear=0; } int QΒιβλιοθήκη BaidueueIsEmpty(V sq) //如果顺序循环队列为空,成功返回1,否则返回 0 { if (sq.rear==sq.front) return 1; else return 0; } int QueueFront(V sq, int *e)//将顺序循环队列sq的队头元素保存到e所指 地址 { if (QueueIsEmpty(sq)) { printf("queue is empty!\n"); return 0; } else { *e=sq.data[(sq.front)];
printf("%d ",G.vexs[v]); for(w=0; w<G.vexnum; w++) { if(G.arcs[v][w].adj ==1 && visited[w] == 0) { DFS(G,w); } } } void BFSTraverse(MGraph G)//图的广度优先遍历 { int v; printf("\n图的广度遍历输出为:\n"); for(v=0; v<G.vexnum; v++) { visited[v]=0; } for(v=0; v<G.vexnum; v++) { if(visited[v]==0) { BFS(G,v); printf("\n"); } } } void BFS(MGraph G,int v)//从v出发广度遍历图G的各个节点 { int v1,v2; V q; QueueInit(&q); QueueIn(&q,v); visited[v] = 1; printf("%d ",G.vexs[v]); while(QueueIsEmpty(q) == 0) { QueueFront(q,&v1);
return 1; } } int QueueIn (V *sq, int x)//将元素x如队列sq的队尾 { if (sq->front==(sq->rear+1)%MAX) { printf("queue is full!\n"); return 0; } else { sq->data[sq->rear]=x; sq->rear=(sq->rear+1)%MAX; return 1; } } int QueueOut(V *sq)//将队列sq队首元素出队列 { if (QueueIsEmpty(*sq)) { printf("queue is empty!\n"); return 0; } else { sq->front=(sq->front+1)%MAX; return 1; } }
int QueueFront(V sq, int *e); int QueueOut(V *sq); void main(void) //主函数 { MGraph g; MGraph *G = &g; CreateUDN(G); Print(G); DFSTraverse(g); BFSTraverse(g); } int CreateUDN(MGraph *G)//采用邻接矩阵表示法构造图 { int i,j,k,v1,v2,w; printf("----------------------------------\n"); printf("图的邻接矩阵的创建与深度、广度遍历\n"); printf("----------------------------------\n"); printf("输入顶点数和边数,用空格隔开:\n"); scanf("%d %d",&G->vexnum,&G->arcnum); for(i=0; i<G->vexnum; i++) { G->vexs[i] = i+1; } for(i=0; i < G->vexnum; i++) for(j=0; j < G->vexnum; j++) G->arcs[i][j].adj = INFINITY; for(k=0; k<G->arcnum; k++) { printf("输入弧的弧头和弧尾(1...%d)\n",G->vexnum); scanf("%d %d",&v1,&v2); G->arcs[v1-1][v2-1].adj = 1; G->arcs[v2-1][v1-1].adj = 1; } return OK;