为什么下面这个程序能出结果但控制台不停止,程序里面广度搜索那会报错 (VS里面运行的)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEM_NUM 10
typedef enum {
DG, DN, UDG, UDN
}graghKind;
//digraph DG有向图
//directed network DN有向网
//undirected graph UDG无向图
//undirected network UDN无向网
typedef char vertemData;
int visited[MAX_VERTEM_NUM] = { 0 };//访问数组
/*邻接矩阵*/
typedef struct {
vertemData vert[MAX_VERTEM_NUM]; //顶点向量
int adj[MAX_VERTEM_NUM][MAX_VERTEM_NUM]; //邻接矩阵
int vertNum, arcNum; //图的顶点数和弧数
graghKind gragh; //图的类型
}adjMatrix;
/*队列结构*/
typedef struct QNode
{
vertemData data;
struct QNode* next;
}QNode;
typedef struct
{
QNode* front, * rear; //队头队尾指针
}LinkQueue;
/*求顶点位置*/
int locateVertem(adjMatrix* G, vertemData v) {
for (int j = 0; j < G->vertNum; j++)
{
if (G->vert[j] == v)
{
return j;
}
}
}
/*创建无向图*/
int creatUDG(adjMatrix* G) {
int i, j, k, weight;
vertemData v1, v2;
printf("请输入图的顶点数和弧数:\n");
scanf("%d %d", &G->vertNum, &G->arcNum);
for (i = 0; i < G->vertNum; i++)
for (j = 0; j < G->vertNum; j++)
G->adj[i][j] = 0;
for (i = 0; i < G->vertNum; i++)
{
printf("请输入图的顶点%d:\n", i);
getchar();
scanf("%c", &G->vert[i]);
}
for (k = 0; k < G->arcNum; k++) {
printf("请输入弧%d的两个顶点:\n", k);
getchar();
scanf("%c %c", &v1, &v2);
i = locateVertem(G, v1);
j = locateVertem(G, v2);
G->adj[i][j] = 1;
G->adj[j][i] = 1;
}
printf("\n无向图存储完毕!\n\n");
return 0;
}
/*创建空队列*/
int init_queue(LinkQueue* L)
{
L->front = L->rear = (QNode*)malloc(sizeof(QNode));
if (!L->front) return 0;
L->front->next = NULL;
return 0;
}
/*判断队列是否为空*/
int empty_queue(LinkQueue* L)
{
if (L->front->next == NULL) return 1;
else return 0;
}
/*入队列*/
int in_queue(LinkQueue* L, int n)
{
QNode* t = (QNode*)malloc(sizeof(QNode));
if (!t) exit(0);
t->data = n;
t->next = NULL;
L->rear->next = t;
L->rear = t;
free(t);
return 0;
}
/*出队列*/
int out_queue(LinkQueue* L)
{
QNode* t;
if (L->front == L->rear) return 0;
t = L->front->next;
L->front->next = t->next;
if (t == L->rear) L->rear = L->front;
return 1;
}
//深度遍历无向图
void depth_first_traversal_UDG(adjMatrix* G, int* v, int n)
{
int i;
if (G == NULL) return;
if (n<0 || n>G->vertNum) return;
v[n] = 1;
if (n == 0) printf("%c", G->vert[n]);
else printf("->%c", G->vert[n]);
for (i = 0; i < G->vertNum; i++)
if (G->adj[n][i] != 0 && v[i] != 1) depth_first_traversal_UDG(G, v, i);
}
/*广度遍历*/
int BFS_traverse_UDN(adjMatrix* G)
{
int i = 0, j;
LinkQueue* L = (LinkQueue*)malloc(sizeof(LinkQueue));
init_queue(L);
printf("广度遍历无向图:");
visited[i] = 1;
printf("%c", G->vert[i]);
in_queue(L, i);
do
{
out_queue(L);
for (j = 0; j < G->vertNum; j++)
{
if (G->adj[i][j] != 0 && visited[j] != 1)
{
visited[j] = 1;
printf("->%c", G->vert[j]);
in_queue(L, j);
}
}
i++;
} while (!empty_queue(L));
free(L);
return 0;
}
int main()
{
adjMatrix* G = (adjMatrix*)malloc(sizeof(adjMatrix));
creatUDG(G);
int visited[300] = { 0 };
printf("深度优先遍历无向图:\n");
depth_first_traversal_UDG(G, visited, 0);
BFS_traverse_UDN(G);
return 0;
}