数据结构:图子系统

更新时间:2023-06-30 14:32:38 阅读: 评论:0

/*
*题目:编写按键盘输入的数据建立图的邻接矩阵存储
*      编写图的深度优先遍历程序
*      编写图的广度优先遍历程序
*      设计一个选择式菜单形式如下:
*            图 子 系 统
*  ***********************************
*  *      1------更新邻接矩阵      *
*  *      2------深度优先遍历      *
*  *      3------广度优先遍历      *
*  *      0------  返    回        *
*  ***********************************
*  请选择菜单号(0--3):
*/
#include <stdio.h>蒙太古
#include <stdlib.h>
#define GRAPHMAX 30
#define QUEUEMAX 30
typedef struct          //图的邻接表的结构体
{
    char value[GRAPHMAX];          //记录图中的点值
    int data[GRAPHMAX][GRAPHMAX];  //记录图中的边的关系
    int n, e;  //记录图中的点的个数及边的个数
}pGraph;
typedef struct          //队列结构体
{
    int queueData[QUEUEMAX];
    int front, rear, count;    //队头,队尾,数目
}grQueue;
void createCraph(pGraph *G);
void DFSTraver(pGraph *G);
void BFSTraver(pGraph *G);
void DFS(pGraph *G, int i);
妖狐御魂void BFS(pGraph *G, int 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");
    createCraph(&G);
    printf("已建立一个图的邻接矩阵存储\n\n");
    for (i = 0; i<G.n; i++)
    {
        for(j = 0; j<G.n; j++)
        {
            printf("%5d", G.data[i][j]);
        }
        printf("\n");
    }
    while (k)
    {
        printf("\n          图 子 系 统\n");
        printf("***********************************\n");
        printf("*      1------更新邻接矩阵      *\n");逐梦人
        printf("*      2------深度优先遍历      *\n");
        printf("*      3------广度优先遍历      *\n");
        printf("*      0------  返    回        *\n");
        printf("***********************************\n");
        printf("请选择菜单号(0--3):");
        fflush(stdin);
        scanf("%d", &choice);
        switch(choice)
        {
        ca 1:
            createCraph(&G);
            printf("图的邻接矩阵存储成功\n\n");
            break;
        ca 2:
            DFSTraver(&G);
            break;
        ca 3:
            BFSTraver(&G);
            break;
        ca 0:
            k = 0;
            break;
        default:
            printf("输入错误,请重新输入。");
            getchar();
            k = 1;
            break;
        }
    }
}
void createCraph(pGraph *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]));
    }
    //初始化邻接表
    for (i = 0; i<G->n; i++)
    {
        for (j = 0; j<G->n; j++)
        {
            G->data[i][j] = 0;
        }
    }
    for (k = 0; k < G->e; k++)
    {
        getchar();
        printf("请输入第%d条边的顶点值(格式4,5):", k+1);
        scanf("%c,%c", &ch1, &ch2);
        //构建邻接表
        for (i = 0; i<G->n; i++)
        {
            if (ch1 == G->value[i])
            {
                for (j = 0; j<G->n; j++)
                {
                    if (ch2 == G->value[j])
                    {
                        G->data[i][j] = 1;
                    }
                }
            }
        }
    }
}
//深度遍历
void DFSTraver(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);
        }
    }
}
//广度遍历
void BFSTraver(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("深度优先遍历序列:%c\n", G->value[i]);
    visited[i] = 1;
    for (j = 0; j<G->n; j++)
    {
        if (G->data[i][j] == 1&&!visited[j])
        {
            DFS(G, j);
        }
    }
}
void BFS(pGraph *G, int i)
{
    int k, j;
    grQueue Q;
    initQueue(&Q);      //初始化
    visited[i] = 1;
    inQueue(&Q, i);
    while (!queueEmpty(&Q))
    {
        k = outQueue(&Q);
        printf("广度优先遍历序列:%c\n", G->value[k]);
        for (j = 0; j<G->n; j++)
        {
            if (G->data[k][j] == 1&&!visited[j])
            {

本文发布于:2023-06-30 14:32:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1061678.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:优先   输入   遍历
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图