图的存储和遍历实验

一、实验目的
1、掌握图的邻接矩阵和邻接表的存储和表示。
2、掌握图的一些基本应用。
3、掌握图的遍历方法。
4、掌握图的最小生成树算法。
5、掌握图的最短路径 Dijkstra 算法。

二、实验内容
1、采用邻接表存储图(要求完成)。
2、输入图并构造邻接矩阵(要求完成)。
3、采用深度优先和广度优先遍历图(要求完成)。


#include <stdio.h>
#include <stdlib.h>
#define Maxint 10000  //表示极大值
#define MVNum 20      //最大顶点数

typedef struct{
    char vexs[MVNum];        //顶点表
    int arcs[MVNum][MVNum];  //邻接矩阵
    int vexnum, arcnum;      //图的当前点数和边数
}AMGraph;
 
typedef struct{
    int *base;
    int front, rear;
}Queue;
 
int visit1[MVNum];  //深度优先遍历辅助数组
int visit2[MVNum];  //广度优先遍历辅助数组


int LocateVex(AMGraph *G, char x)
{
    int i;
    for(i = 0; i < G->vexnum; i++)
        if(x == G->vexs[i])
            return i;
    return -1;
}

void CreateUDN(AMGraph *G)  //采用邻接矩阵表示法创建无向网
{
    int i, j, k;
    char a, b;
 
    printf("Input the vexnum and arcnum:");
    scanf("%d %d", &G->vexnum, &G->arcnum);
 
    printf("Input the information of vertexes:\n");
    for(i = 0; i < G->vexnum; i++)
        scanf(" %c", &(G->vexs[i]));
 
    for(i = 0; i < G->vexnum; i++)
        for(j = 0; j < G->vexnum; j++)
            G->arcs[i][j] = Maxint;
    
    printf("Enter the vertices attached to an edge in turn:\n");
    for(k = 0; k < G->arcnum; k++ ) {
        scanf(" %c,%c", &a, &b);
        i = LocateVex(G, a);
        j = LocateVex(G, b);
        G->arcs[i][j] = 1;
        G->arcs[j][i] = 1;
    }
}

void DFS(AMGraph *G, int a)  //深度优先遍历
{
    int i;
    printf("%c", G->vexs[a]);
    visit1[a] = 1;
    for(i = 0; i < G->vexnum; i++) {
        if((G->arcs[a][i] != 0) && (!visit1[i]) )
            DFS(G,i);
    }
}

void InitQueue(Queue *Q) {
    Q->base = (int*)malloc(20 * sizeof(int));
    Q->rear = Q->front = -1;
}

void Enqueue(Queue *Q, int i) {
    Q->base[Q->rear++] = i;
}

int Dequeue(Queue *Q, int i) {
    i = Q->base[Q->front++];
    return i;
}

int Emptyqueue(Queue *Q) {
    if (Q->front == Q->rear)
        return 1;
    else return 0;
}

void BFS(AMGraph *G, int a)  //广度优先遍历
{
    Queue L;
    int i;
    InitQueue(&L);
    printf("%c", G->vexs[a]);
    visit2[a] = 1;
    Enqueue(&L, a);
    while (!Emptyqueue(&L)) {
        a = Dequeue(&L, a);
        for (i = 0; i < G->vexnum; i++)
        	if (G->arcs[a][i] == 1 && visit2[i] == 0) {
            	printf("%c",G->vexs[i]);
            	visit2[i] = 1;
            	Enqueue(&L, i);
        	}
    }

}

int main()
{
    int i;
    AMGraph G;
    for (i = 0; i < MVNum; i++)  //初始化辅助数组
        visit1[i] = 0;
    for (i = 0; i < MVNum; i++)
        visit2[i] = 0;
 
    CreateUDN(&G);
    printf("The result of DFS is:\n");
    DFS(&G, 0);
    printf("\n");
    
    printf("The result of BFS is:\n");
    BFS(&G, 0);
    printf("\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要告别理想怎算活過

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值