前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图的存储结构的实现(C/C++实现)

图的存储结构的实现(C/C++实现)

作者头像
Angel_Kitty
发布2018-04-09 16:42:28
6710
发布2018-04-09 16:42:28
举报

存档:

代码语言:javascript
复制
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define maxv 10
 4 #define max 10
 5 typedef char elem;
 6 typedef int elemtype;
 7 #include "queue.h"
 8 #include "mgraph.h"
 9 void main()
10 {
11     mgraph g;
12     printf("1.初始化函数测试:\n");
13     initial(g);
14     printf("2.创建函数测试:\n");
15     create(g);
16     printf("3.输出函数测试:\n");
17     printg(g);
18     printf("4.输出顶点度函数测试:\n");
19     degree(g);
20     printf("5.深度优先遍历函数测试:\n");
21     dfstraverse(g);
22     printf("6.广度优先遍历函数测试:\n");
23     bfs(g);
24 }

代码语言:javascript
复制
  1 //有向图的邻接矩阵,顶点数据为字符型
  2 typedef struct MGraph
  3 {
  4     elem vexes[maxv];//顶点表
  5     int edges[maxv][maxv];//邻接矩阵
  6     int n,e;//顶点数n和边数e
  7 }mgraph;
  8 bool visited[maxv];//访问标志数组
  9 void initial(mgraph &g)//初始化函数
 10 {
 11     int i,j;
 12     g.e=0;
 13     g.n=0;
 14     for(j=0;j<maxv;j++)
 15         g.vexes[j]=0;//建立顶点表
 16     for(i=0;i<maxv;i++)
 17     {
 18         for(j=0;j<maxv;j++)
 19         {
 20             g.edges[i][j]=0;//初始化邻接矩阵
 21         }
 22     }
 23 }
 24 int locate(mgraph g,elem u)//查找顶点对应的数组下标值
 25 {
 26     for(int i=0;i<g.n;i++)
 27     {
 28         if(g.vexes[i]==u)
 29             return i;
 30     }
 31     return -1;
 32 }
 33 void create(mgraph &g)//创建图的邻接矩阵存储
 34 {
 35     int i,j,k;
 36     elem u,v;
 37     printf("请输入有向图的顶点数:");
 38     scanf("%d",&g.n);
 39     printf("请输入有向图的弧数:");
 40     scanf("%d",&g.e);
 41     fflush(stdin);//清空缓存中的数据
 42     printf("请输入字符型顶点数据,如ABCD:");
 43     for(j=0;j<g.n;j++)
 44         scanf("%c",&g.vexes[j]);//建立顶点表
 45     fflush(stdin);
 46     printf("请输入弧的信息,格式:弧尾,弧头\n");
 47     for(k=0;k<g.e;k++)
 48     {
 49         scanf("%c,%c",&u,&v);
 50         i=locate(g,u);
 51         j=locate(g,v);
 52         g.edges[i][j]=1;
 53         fflush(stdin);
 54     }
 55 }
 56 void printg(mgraph g)//输出有向图的邻接矩阵
 57 {
 58     int i,j;
 59     printf("输入图的邻接矩阵存储信息:\n");
 60     printf("顶点数据:\n");
 61     for(i=0;i<g.n;i++)
 62         printf("%d:%c\n",i,g.vexes[i]);
 63     printf("邻接矩阵数据:\n");
 64     for(i=0;i<g.n;i++)
 65     {
 66         for(j=0;j<g.n;j++)
 67         {
 68             printf("%3d",g.edges[i][j]);
 69         }
 70         printf("\n");
 71     }
 72 }
 73 void degree(mgraph g)//输出顶点的度
 74 {
 75     int i,j,in,out;
 76     for(i=0;i<g.n;i++)
 77     {
 78         in=0;
 79         out=0;
 80         for(j=0;j<g.n;j++)
 81         {
 82             if(g.edges[i][j]!=0)
 83                 out++;
 84             if(g.edges[j][i]!=0)
 85                 in++;
 86         }
 87         printf("顶点%c的出度为%d---入度为%d---度为%d\n",g.vexes[i],out,in,in+out);
 88     }
 89 }
 90 int firstadjvex(mgraph g,int v)//顶点v的第一个邻接顶点
 91 {
 92     for(int i=0;i<g.n;i++)
 93     {
 94         if(g.edges[v][i]==1)
 95             return i;
 96     }
 97     return -1;
 98 }
 99 int nextadjvex(mgraph g,int v,int w)//顶点v的相对于w的下一个邻接顶点
100 {
101     for(int i=w+1;i<g.n;i++)
102     {
103         if(g.edges[v][i]==1)
104             return i;
105     }
106     return -1;
107 }
108 void dfs(mgraph g,int v)//遍历一个连通分量
109 {
110     int w;
111     visited[v]=true;
112     printf("%c ",g.vexes[v]);
113     for(w=firstadjvex(g,v);w>=0;w=nextadjvex(g,v,w))
114     {
115         if(!visited[w])
116             dfs(g,w);
117     }
118 }
119 void dfstraverse(mgraph g)//深度优先遍历
120 {
121     int v;
122     for(v=0;v<g.n;v++)
123         visited[v]=false;//标志访问数组初始化
124     for(v=0;v<g.n;v++)
125     {
126         if(!visited[v])
127             dfs(g,v);
128     }
129 }
130 void bfs(mgraph g)//广度优先遍历
131 {
132     int u=0,v=0,w=0;
133     queue q;
134     for(v=0;v<g.n;v++)
135         visited[v]=false;
136     initqueue(q);
137     for(v=0;v<g.n;v++)
138     {
139         if(!visited[v])
140         {
141             visited[v]=true;
142             printf("%c ",g.vexes[v]);
143             enqueue(q,v);
144             while(!queueempty(q))
145             {
146                 dequeue(q,u);
147                 for(w=firstadjvex(g,u);w>=0;w=nextadjvex(g,u,w))
148                 {
149                     if(!visited[w])
150                     {
151                         visited[w]=true;
152                         printf("%c ",g.vexes[w]);
153                         enqueue(q,w);
154                     }
155                 }
156             }
157         }
158     }
159     destroyqueue(q);
160 }
代码语言:javascript
复制
 1 typedef struct
 2 {
 3     elemtype *base;//动态分配存储空间
 4     int front;//头指针,若队列不空指向队列头元素
 5     int rear;//尾指针,若队列不空指向队列尾元素的下一个位置
 6 }queue;
 7 void initqueue(queue &q)//初始化队列
 8 {
 9     q.base=new elemtype[max];//分配存储空间
10     if(!q.base)
11     {
12         printf("队列分配失败\n");
13         exit(-2);
14     }
15     else 
16         q.front=q.rear=0;
17 }
18 int queueempty(queue q)//判断队列是否为空
19 {
20     if(q.front==q.rear)
21         return 1;
22     else 
23         return 0;
24 }
25 void enqueue(queue &q,elemtype e)//入队列操作
26 {
27     if((q.rear+1)%max==q.front)
28     {
29         printf("队满,无法插入新元素!\n");
30         exit(-2);
31     }
32     else
33     {
34         q.base[q.rear]=e;
35         q.rear=(q.rear+1)%max;
36     }
37 }
38 void dequeue(queue &q,elemtype e)//出队列操作
39 {
40     if(q.front==q.rear)//判断队列是否为空
41     {
42         printf("空队列,无法删除头元素!\n");
43         exit(-2);
44     }
45     else
46     {
47         e=q.base[q.front];
48         q.front=(q.front+1)%max;
49     }
50 }
51 void destroyqueue(queue &q)//销毁队列
52 {
53     free(q.base);
54     q.base=NULL;
55     q.front=0;
56     q.rear=0;
57     printf("\n");
58 }

运行结果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档