数据结构 【实验9 图的基本操作】

实验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

    原文作者:Freecode#
    原文地址: https://www.cnblogs.com/yym2013/p/3791613.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞