数据结构--图及其应用

一、上机实验的问题和要求:

设计一程序,建立图的邻接矩阵,并且进行图的广度优先遍历。

二、程序设计的基本思想,原理和算法描述:

//图的广度优先遍历算法

void BFSTraverse(MGraph *G)

{

    int i, j;

    Queue Q;

    for (i=0; i<G->numVertexes; ++i)

        visited[i] = FALSE;

    InitQueue(&Q);

    for (i=0; i<G->numVertexes; ++i)

    {

        if (!visited[i])

        {

            visited[i] = TRUE;

            printf("%c ", G->vexs[i]);

            EnQueue(&Q, i);

            while (!QueueEmpty(&Q))

            {

                DeQueue(&Q, &i);

                for (j=0; j<G->numVertexes; ++j)

                {

                    if (!visited[j] && G->arc[i][j]!=INFINITY)

                    {

                        visited[j] = TRUE;

                        printf("%c ", G->vexs[j]);

                        EnQueue(&Q, j);

                    }

                }

            }

        }

    }

}

三、调试和运行程序过程中产生的问题及采取的措施:

调试程序时未发现错误

  • 源程序及注释
#include <stdio.h>



#define MaxVex        100            //最大顶点数

#define INFINITY    65535        //表示∞

#define TRUE        1

#define    FALSE        0

typedef char        VertexType;    //顶点类型

typedef    int            EdgeType;    //权值类型

typedef int            Bool;

Bool    visited[MaxVex];



typedef struct {

    VertexType    vexs[MaxVex];            //顶点数组

    EdgeType    arc[MaxVex][MaxVex];    //邻接矩阵

    int    numVertexes, numEdges;            //当前图中的结点数以及边数

}MGraph;





//广度优先遍历需要的循环队列

typedef struct {

    int    data[MaxVex];

    int    front, rear;

}Queue;





/****************************************/

//队列的相关操作



//初始化

void InitQueue(Queue *Q)

{

    Q->front = Q->rear = 0;

}



//入队

void EnQueue(Queue *Q, int e)

{

    if ((Q->rear+1)%MaxVex == Q->front)

        return ;



    Q->data[Q->rear] = e;

    Q->rear = (Q->rear+1)%MaxVex;

}



//判空

Bool QueueEmpty(Queue *Q)

{

    if (Q->front == Q->rear)

        return TRUE;

    else

        return FALSE;

}



//出队

void DeQueue(Queue *Q, int *e)

{

    if (Q->front == Q->rear)

        return ;

   

    *e = Q->data[Q->front];

    Q->front = (Q->front+1)%MaxVex;

}

/****************************************/





//建立图的邻接矩阵

void CreateMGraph(MGraph *G)

{

    int i, j, k, w;



    printf("输入顶点数和边数: ");

    scanf("%d%d", &G->numVertexes,&G->numEdges);

    fflush(stdin);



    printf("==============================\n");

    printf("输入各个顶点:\n");

    for (i=0; i<G->numVertexes; ++i)

    {

        printf("顶点%d: ",i+1);

        scanf("%c", &G->vexs[i]);

        fflush(stdin);

    }



    for (i=0; i<G->numVertexes; ++i)

    {

        for (j=0; j<G->numVertexes; ++j)

            G->arc[i][j] = INFINITY;

    }



    printf("==============================\n");

    for (k=0; k<G->numEdges; ++k)

    {

        printf("输入边(vi, vj)中的下标i和j和权W: ");

        scanf("%d%d%d", &i,&j,&w);

        G->arc[i][j] = w;

        G->arc[j][i] = G->arc[i][j];

    }

}





//输出

void DisMGraph(MGraph *G)

{

    int i, j, k;

    k = G->numVertexes;

    for (i=0; i<k; ++i)

    {

        for (j=0; j<k; ++j)

        {

            printf("%5d ", G->arc[i][j]);

        }

        putchar('\n');

    }

}





/****************************************/



//图的广度优先遍历

void BFSTraverse(MGraph *G)

{

    int i, j;

    Queue Q;



    for (i=0; i<G->numVertexes; ++i)

        visited[i] = FALSE;



    InitQueue(&Q);



    for (i=0; i<G->numVertexes; ++i)

    {

        if (!visited[i])

        {

            visited[i] = TRUE;

            printf("%c ", G->vexs[i]);

            EnQueue(&Q, i);



            while (!QueueEmpty(&Q))

            {

                DeQueue(&Q, &i);

                for (j=0; j<G->numVertexes; ++j)

                {

                    if (!visited[j] && G->arc[i][j]!=INFINITY)

                    {

                        visited[j] = TRUE;

                        printf("%c ", G->vexs[j]);

                        EnQueue(&Q, j);

                    }

                }

            }

        }

    }

}

/****************************************/



//程序入口

int main(){

    MGraph G;



    CreateMGraph(&G);



    printf("\n图的广度优先遍历为: ");

    BFSTraverse(&G);



    printf("\n");



    return 0;

}

五、运行结果

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值