图的基本操作
实验目的 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 }