C语言建立有向图的邻接矩阵及其遍历操作
1
2 #include"stdio.h"
3 #include"stdlib.h"
4
5 typedef char elemtype;
6 #define maxsize 10
7 #define queuesize 100
8 typedef struct{
9 elemtype vex[maxsize];
10 int arc[maxsize][maxsize];
11 int n,e;
12 }graph;
13
14 int locatevex(graph g,elemtype v)
15 {
16 int i;
17 for(i=0;i<g.n;i++)if(g.vex[i]==v)return i;
18 return -1;
19 }
20
21 void print(graph g)
22 {
23 int i,j;
24 printf("图的邻接矩阵表示:\n");
25 for(i=0;i<g.n;i++){
26 for(j=0;j<g.n;j++){
27 printf("%3d",g.arc[i][j]);
28 }
29 printf("\n");
30 }
31 }
32
33 void creategraph(graph *g){
34 int i,j,k;
35 elemtype v1,v2;
36 printf("请输入顶点数和边数:\n");
37 printf("顶点数n=");scanf("%d",&g->n);
38 printf("边 数e=");scanf("%d",&g->e);
39 printf("请输入图的顶点信息:\n");
40 getchar();
41 for(i=0;i<=g->n;i++)
42 scanf("%c",&g->vex[i]);
43 for(i=0;i<g->n;i++)
44 for(j=0;j<g->n;j++)
45 g->arc[i][j]=0;
46 printf("请输入图的边的信息:\n");
47 for(k=0;k<g->e;k++)
48 {
49 printf("请输入第%d条边的两个端点:",k+1);
50 scanf("%c%c",&v1,&v2);
51 fflush(stdin);
52 i=locatevex(*g,v1);j=locatevex(*g,v2);
53 if(i>=0&&j>=0){
54 g->arc[i][j]=1;
55 g->arc[j][i]=1;
56 }
57 }
58 }
59 int DFSvisited[maxsize];
60
61 void DFS(graph g,int i)
62 {
63 int j;
64 printf("%3c",g.vex[i]);
65 DFSvisited[i]=1;
66 for(j=0;j<g.n;j++)
67 {
68 if((g.arc[i][j]==1)&&(DFSvisited[j]==0))
69 DFS(g,j);
70 }
71 }
72
73 void DFStraverse(graph g)
74 {
75 int v;
76 for (v=0; v<g.n;v++)DFSvisited[v]=0;
77 for (v=0; v<g.n;v++)
78
79 if (!DFSvisited[v]) DFS(g,v);
80 }
81
82 typedef struct cirqueue
83 {
84 elemtype *data;
85 int front;
86 int rear;
87 }cirqueue;
88
89 int initqueue(cirqueue *q)
90 {
91 q->data=(elemtype *)malloc(queuesize*sizeof(cirqueue));
92 if (q->data==NULL)return 0;
93 q->front=q->rear=0;
94 return 1;
95 }
96
97 int enqueue (cirqueue *q,elemtype e)
98 {
99 if ((q->rear+1) % queuesize == q->front)
100 return 0;
101 q->data[q->rear] = e;
102 q->rear = (q->rear+1) % queuesize;
103 return 1;
104 }
105
106 int dequeue (cirqueue *q,int *e)
107 {
108 if (q->front == q->rear) return 0;
109 *e = q->data[q->front];
110 q->front = (q->front+1) %queuesize;
111 return 1;
112 }
113
114 int getfront(cirqueue q,elemtype *e)
115 {
116 if (q.front == q.rear) return 0;
117 *e=q.data[q.front];
118 return 1;
119 }
120
121 int queueempty(cirqueue q)
122 {
123 if(q.front == q.rear)return 1;
124 else return 0;
125 }
126
127 int queuelength(cirqueue q)
128 {
129 return (q.rear-q.front+queuesize) % queuesize;
130 }
131
132 int BFSvisited[maxsize];
133 cirqueue q;
134
135 void BFS(graph g,int i){
136 int j;
137 initqueue(&q);
138 printf("%3c",g.vex[i]);
139 BFSvisited[i]=1;
140 enqueue(&q,i);
141 while(queueempty(q)==0) {
142 dequeue(&q,&i);
143 for(j=0;j<g.n;j++){
144 if((g.arc[i][j]==1)&&(BFSvisited[j]==0)){
145
146 printf("%3c",g.vex[j]);
147 BFSvisited[j]=1;
148 enqueue(&q,j);
149 }
150 }
151 }
152 }
153
154 void BFStraverse(graph g)
155 {
156 int v;
157 for (v=0; v<g.n;v++)
158 BFSvisited[v]=0;
159 for (v=0; v<g.n;v++)
160 if (!BFSvisited[v])BFS(g,v);
161
162 }
163 int main()
164 {
165 graph g;
166 creategraph(&g);
167 print(g);
168 printf("\n");
169 printf("图的深度优先遍历序列:\n");
170 DFStraverse(g);
171 printf("\n");
172 printf("图的广度优先遍历序列:\n");
173 BFStraverse(g);
174 printf("\n");
175 return 0;
176 }
程序运行截图:
