实验9 图的基本操作
实验目的
1. 掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表存储结构。
2.遍历是图各种应用的算法的基础,要熟练掌握图的深度优先遍历和广度优先遍历算法,复习栈和队列的应用。
实验内容
程序1
/* 定义邻接矩阵类型 */
typedef int adjmatrix[n+1][n+1];
/* 建立图的邻接矩阵 */
void CreatMatrix(adjmatrix GA)
/* 从初始点v出发深度优先遍历邻接矩阵GA表示的图 */
void DfsMatrix(adjmatrix GA,int v)
/*从初始点v出发广度优先遍历邻接矩阵GA表示的图*/
void BfsMatrix(adjmatrix GA,int v)
程序2
/* 邻接表的结点类型 */
typedef struct arc
{int adjvex;
struct arc *next;}ArcNode;
typedef struct VexNode
{int vertex;
ArcNode *firstarc;
}VerNode;
typedef VerNode AdjList[MAXNODE];
/* 建立图的邻接表 */
void CreatAdjlist(AdjList GL)
/* 从初始点v出发深度优先遍历邻接表GL表示的图 */
void DfsAdjlist(AdjList GL,int v)
/*从初始点v出发广度优先遍历邻接表GL表示的图*/
void BfsAdjlist(AdjList GL,int v)
【程序 1】
1 /* 该程序仅适应于无权有向图 */
2 /* 一组测试数据: 3 5 3 1 2 2 4 1 3 */
4 #include <iostream>
5 #include <stdio.h>
6 #include <queue>
7 using namespace std; 8
9 /* 定义邻接矩阵类型 */
10 #define MAXV 100
11 typedef int adjmatrix[MAXV+1][MAXV+1]; 12 int V,E; //顶点数和边数
13
14 /* 建立图的邻接矩阵 */
15 void CreatMatrix(adjmatrix &GA) 16 { 17 memset(GA,0,sizeof(GA)); 18 printf("请问你要输入的图有多少个顶点?\n"); 19 scanf("%d",&V); 20 printf("有多少条边?\n"); 21 scanf("%d",&E); 22 int i; 23 for(i=1;i<=E;i++){ 24 int v1,v2; 25 printf("请输入第%d条边的起点:\n",i); 26 scanf("%d",&v1); 27 printf("请输入第%d条边的终点:\n",i); 28 scanf("%d",&v2); 29 GA[v1][v2] = 1; 30 //GA[v2][v1] = 1;
31 } 32 } 33
34 void printGraph(adjmatrix GA) //输出邻接矩阵
35 { 36 int i,j; 37 for(i=1;i<=V;i++){ //输出
38 for(j=1;j<=V;j++) 39 printf("%d ",GA[i][j]); 40 printf("\n"); 41 } 42 } 43
44
45 /* 从初始点v出发深度优先遍历邻接矩阵GA表示的图 */
46 void DfsMatrix(adjmatrix GA,int v) 47 { 48 int i; 49 printf("->%d",v); 50 for(i=1;i<=V;i++){ 51 if(v==i) continue; 52 if(GA[v][i]==1) 53 DfsMatrix(GA,i); 54 } 55 } 56
57 /*从初始点v出发广度优先遍历邻接矩阵GA表示的图*/
58 void BfsMatrix(adjmatrix GA,int v) 59 { 60 queue <int> q; 61 int cur,i; 62 q.push(v); 63 while(!q.empty()){ 64 cur = q.front(); 65 q.pop(); 66 if(cur==v) 67 printf("%d",v); 68 else
69 printf("->%d",cur); 70 for(i=1;i<=V;i++){ 71 if(GA[cur][i]==1) 72 q.push(i); 73 } 74 } 75 } 76
77 void ShowDFS(adjmatrix GA) //进行深度优先遍历
78 { 79 int n,i; 80 printf("请输入开始遍历的点:"); 81 scanf("%d",&n); 82 //输出dfs遍历顺序
83 for(i=1;i<=V;i++) 84 if(GA[n][i]==1) 85 break; 86 if(i>V){ 87 printf("%d\n",n); 88 return ; 89 } 90 printf("%d",n); 91 for(;i<=V;i++){ 92 if(i==n) continue; 93 if(GA[n][i]==1) 94 DfsMatrix(GA,i); 95 } 96 printf("\n"); 97 } 98 void ShowBFS(adjmatrix GA) //进行广度优先遍历
99 { 100 int n,i; 101 printf("请输入开始遍历的点:"); 102 scanf("%d",&n); 103 //输出dfs遍历顺序
104 for(i=1;i<=V;i++) 105 if(GA[n][i]==1) 106 break; 107 if(i>V){ 108 printf("%d\n",n); 109 return ; 110 } 111 BfsMatrix(GA,n); 112 printf("\n"); 113 } 114
115 int main() 116 { 117 adjmatrix g; 118 printf("【注:本程序适应于无权有向图】\n\n"); 119 printf("[1] 创建图\n"); 120 CreatMatrix(g); //创建
121 printf("\n"); 122 printf("创建成功\n\n"); 123 system("pause"); 124 system("cls"); 125
126 printf("[2] 邻接矩阵为:\n"); 127 printGraph(g); //输出邻接矩阵
128 printf("\n"); 129 system("pause"); 130 system("cls"); 131
132 printf("[3] DFS:\n"); 133 ShowDFS(g); //dfs
134 printf("\n"); 135 system("pause"); 136 system("cls"); 137
138 printf("[4] BFS:\n"); 139 ShowBFS(g); 140 printf("\n"); 141 system("pause"); 142 system("cls"); 143
144 return 0; 145 }
【程序 2】
1 /* 该程序适应于无权有向图 */
2 /* 一组测试数据: 3 5 3 1 2 2 4 1 3 */
4 #include <iostream>
5 #include <stdio.h>
6 #include <queue>
7 using namespace std; 8 #define MAXNODE 1000
9
10 /* 邻接表的结点类型 */
11 typedef struct arc{ 12 int adjvex; 13 struct arc *next; 14 }ArcNode; 15 typedef struct VexNode{ 16 int vertex; 17 ArcNode *firstarc; 18 }VerNode; 19 typedef VerNode AdjList[MAXNODE]; 20 int V,E; //顶点数和边数
21
22 /* 建立图的邻接表 */
23 void CreatAdjlist(AdjList &GL) 24 { 25 memset(GL,0,sizeof(GL)); 26 printf("请问你要输入的图有多少个顶点?\n"); 27 scanf("%d",&V); 28 printf("有多少条边?\n"); 29 scanf("%d",&E); 30 int i; 31 for(i=1;i<=E;i++){ 32 int v1,v2; 33 printf("请输入第%d条边的起点:\n",i); 34 scanf("%d",&v1); 35 printf("请输入第%d条边的终点:\n",i); 36 scanf("%d",&v2); 37 if(GL[v1].firstarc==NULL){ //如果该节点对应的表头结点的第一个边节点是空,说明这个节点还没有与它连接的节点
38 GL[v1].firstarc = (ArcNode*)malloc(sizeof(ArcNode)); 39 GL[v1].firstarc->adjvex = v2; 40 GL[v1].firstarc->next = NULL; 41 continue; 42 } 43 ArcNode *p = GL[v1].firstarc; 44 while(p->next!=NULL) //找到最后一个边节点
45 p = p->next; 46 p->next = (ArcNode*)malloc(sizeof(ArcNode)); 47 p->next->adjvex = v2; 48 p->next->next = NULL; 49 } 50 } 51 void printGraph(AdjList GL) 52 { 53 int i; 54 for(i=1;i<=V;i++){ //输出每一个顶点的下一个顶点
55 ArcNode *p = GL[i].firstarc; 56 if(p==NULL) 57 printf("【顶点%d】没有下一个顶点。",i); 58 else
59 printf("【顶点%d】的下一个顶点是:",i); 60 while(p){ 61 printf("【顶点%d】 ",p->adjvex); 62 p = p->next; 63 } 64 printf("\n"); 65 } 66 } 67
68 /* 从初始点v出发深度优先遍历邻接表GL表示的图 */
69 void DfsAdjlist(AdjList GL,int v) 70 { 71 printf("->%d",v); 72 ArcNode *p = GL[v].firstarc; 73 while(p){ 74 DfsAdjlist(GL,p->adjvex); 75 p = p->next; 76 } 77 } 78
79 /*从初始点v出发广度优先遍历邻接表GL表示的图*/
80 void BfsAdjlist(AdjList GL,int v) 81 { 82 queue <int> q; 83 int cur; 84 q.push(v); 85 while(!q.empty()){ 86 cur = q.front(); 87 q.pop(); 88 if(cur==v) 89 printf("%d",v); 90 else
91 printf("->%d",cur); 92 ArcNode *p = GL[cur].firstarc; 93 while(p){ 94 q.push(p->adjvex); 95 p = p->next; 96 } 97 } 98 } 99
100
101 void ShowDFS(AdjList GL) //进行深度优先遍历
102 { 103 int n; 104 printf("请输入开始遍历的点:"); 105 scanf("%d",&n); 106 //输出dfs遍历顺序
107 if(GL[n].firstarc==NULL){ 108 printf("%d\n",n); 109 return ; 110 } 111 printf("%d",n); 112 ArcNode *p = GL[n].firstarc; 113 while(p){ 114 DfsAdjlist(GL,p->adjvex); 115 p = p->next; 116 } 117 printf("\n"); 118 } 119 void ShowBFS(AdjList GL) //进行广度优先遍历
120 { 121 int n; 122 printf("请输入开始遍历的点:"); 123 scanf("%d",&n); 124 //输出bfs遍历顺序
125 if(GL[n].firstarc==NULL){ 126 printf("%d\n",n); 127 return ; 128 } 129 BfsAdjlist(GL,n); 130 printf("\n"); 131 } 132
133 int main() 134 { 135 AdjList GL; 136 //创建邻接表
137 CreatAdjlist(GL); 138 printf("\n创建成功!\n\n"); 139 system("pause"); 140 system("cls"); 141
142 //输出邻接表
143 printf("邻接表内容:\n"); 144 printGraph(GL); 145 printf("\n"); 146 system("pause"); 147 system("cls"); 148
149 //dfs
150 printf("DFS:\n"); 151 ShowDFS(GL); 152 printf("\n"); 153 system("pause"); 154 system("cls"); 155
156 //bfs
157 printf("BFS:\n"); 158 ShowBFS(GL); 159 printf("\n"); 160 system("pause"); 161 system("cls"); 162
163 return 0; 164 }
Freecode : www.cnblogs.com/yym2013