1、/* *题目:编写按键盘输入的数据建立图的邻接矩阵存储 * 编写图的深度优先遍历程序 * 编写图的广度优先遍历程序 * 设计一个选择式菜单形式如下: * 图 子 系 统 * *********************************** * * 1------更新邻接矩阵 * * * 2------深度优先遍历 * * * 3------广度优先遍历 * * * 0------ 返 回
2、
* ***********************************
* 请选择菜单号(0--3):
*/
#include
3、 e; //记录图中的点的个数及边的个数 }pGraph; typedef struct //队列结构体 { int queueData[QUEUEMAX]; int front, rear, count; //队头,队尾,数目 }grQueue; void createCraph(pGraph *G); void DFSTraverse(pGraph *G); void BFSTraverse(pGraph *G); void DFS(pGraph *G, int i); void BFS(pGraph *G, in
4、t i); void initQueue(grQueue *Q); int queueEmpty(grQueue *Q); int queueFull(grQueue *Q); int outQueue(grQueue *Q); void inQueue(grQueue *Q, int i); int visited[GRAPHMAX]; //用于标志性的数组(全局变量) void main() { pGraph G; int choice, i, j, k = 1; printf("建立一个有向图的邻接矩阵表示\n");
5、 createCraph(&G);
printf("已建立一个图的邻接矩阵存储\n\n");
for (i = 0; i 6、"***********************************\n");
printf("* 1------更新邻接矩阵 *\n");
printf("* 2------深度优先遍历 *\n");
printf("* 3------广度优先遍历 *\n");
printf("* 0------ 返 回 *\n");
printf("**************************** 7、\n");
printf("请选择菜单号(0--3):");
fflush(stdin);
scanf("%d", &choice);
switch(choice)
{
case 1:
createCraph(&G);
printf("图的邻接矩阵存储成功\n\n");
break;
case 2:
DFSTraverse(&G);
8、 break;
case 3:
BFSTraverse(&G);
break;
case 0:
k = 0;
break;
default:
printf("输入错误,请重新输入。");
getchar();
k = 1;
break;
}
}
}
void createCraph(pGr 9、aph *G) //建立邻接表
{
int i, j, k;
char ch1, ch2;
printf("请输入定点数,边数(格式如3,3):");
scanf("%d,%d",&(G->n), &(G->e));
for(i = 0; i < G->n; i++) //输入顶点值
{
getchar();
printf("请输入第%d顶点的值:", i+1);
scanf("%c", &(G->value[i]));
}
//初始化邻接 10、表
for (i = 0; i 11、 for (i = 0; i 12、 }
}
}
}
}
//深度遍历
void DFSTraverse(pGraph *G)
{
int i;
for (i = 0; i < G->n; i++)
{
visited[i] = 0;
}
for (i = 0; i < G->n;i++)
{
if (!visited[i])
{
DFS(G, i);
}
}
}
//广 13、度遍历
void BFSTraverse(pGraph *G)
{
int i;
for (i = 0; i < G->n; i++)
{
visited[i] = 0;
}
for (i = 0; i < G->n;i++)
{
if (!visited[i])
{
BFS(G, i);
}
}
}
void DFS(pGraph *G, int i)
{
int j;
printf( 14、"深度优先遍历序列:%c\n", G->value[i]);
visited[i] = 1;
for (j = 0; j 15、ed[i] = 1;
inQueue(&Q, i);
while (!queueEmpty(&Q))
{
k = outQueue(&Q);
printf("广度优先遍历序列:%c\n", G->value[k]);
for (j = 0; j 16、 inQueue(&Q, j);
}
}
}
}
void initQueue(grQueue *Q) //队列初始化
{
Q->front = Q->rear = 0;
Q->count = 0;
}
int queueEmpty(grQueue *Q) //队列判空
{
return Q->count == 0;
}
int queueFull(grQueue *Q) //队列判满
{
return Q->count == QUEUEMAX;
}
17、
int outQueue(grQueue *Q) //出队
{
int temp;
if (queueEmpty(Q))
{
printf("队列为空。");
return -1;
}
else
{
temp = Q->queueData[Q->front]; //出队的元素
Q->count--;
Q->front = (Q->front+1)%QUEUEMAX;
return temp;
} 18、
}
void inQueue(grQueue *Q, int i) //入队
{
if (queueFull(Q))
{
printf("队列已满。");
return;
}
else
{
Q->count++; //数目增加
Q->queueData[Q->rear] = i; //入队
Q->rear = (Q->rear+1)%QUEUEMAX; //队尾指针移动
}
}






