【数据结构实验六】图的遍历DFS和BFS

部署运行你感兴趣的模型镜像

输入格式:

在第1行输入图的类型,1表示有向图,0表示无向图

在第2行输入构造图的顶点,个数 N 不超过100。例如:图有5个顶点,则输入ABCDE

后面 N 行,分别输入与ABCDE顶点相连的顶点。例如无向图样例1:BD表示A-B和A-D相连;下一行输入:ACE表示B-A、B-C和B-E相连。再如有向图样例2:BD表示A->B和A->D;下一行无输入,表示顶点B无初始点的边。以此类推。

测试数据保证有效。且图的存储结构采用链式存储,构造时使用头插法

输出格式:

参照主函数及输出样例输出字符串中使用中文标点符号

输入样例1:

0
ABCDE
BD
ACE
BDE
AC
BC

输出样例1:

------------------------------
无向图的顶点数:5
无向图的弧数:6
------------------------------
图的邻接表:

[0]A->[3]->[1]->NULL
[1]B->[4]->[2]->[0]->NULL
[2]C->[4]->[3]->[1]->NULL
[3]D->[2]->[0]->NULL
[4]E->[2]->[1]->NULL
------------------------------
图的深度优先遍历序列:ADCEB
------------------------------
图的广度优先遍历序列:ADBCE
------------------------------

输入样例2:

1
ABCDE
BD

B
CE

输出样例2:

------------------------------
有向图的顶点数:5
有向图的弧数:5
------------------------------
图的邻接表:

[0]A->[3]->[1]->NULL
[1]B->NULL
[2]C->[1]->NULL
[3]D->[4]->[2]->NULL
[4]E->NULL
------------------------------
图的深度优先遍历序列:ADECB
------------------------------
图的广度优先遍历序列:ADBEC
---------------------------
#include <stdio.h>
#include <malloc.h>
#define MAX_VERTEX_NUM 100

typedef char VertexType;
//图的邻接表存储表示
typedef struct ArcNode //表结点
{
    int adjvex; //与顶点相连的邻接点下标
    struct ArcNode *nextarc; //指向顶点的下一个邻接点
}ArcNode;
typedef struct VNode //头结点
{
    VertexType data; //顶点信息
    ArcNode *firstarc; //指向第一条依附该顶点的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
    AdjList vertices;
    int vexnum, arcnum; //图的当前顶点数和弧数
    int kind; //图的种类标志
}ALGraph;
//循环队列的存储表示
typedef struct
{
    int v[MAX_VERTEX_NUM];
    int frot, rear;
}SqQueue;

void InitSqQueue(SqQueue &Q); // 构造一个空队列
void EnSqQueue(SqQueue &Q, int v); // 入队操作
int DeSqQueue(SqQueue &Q); // 出队操作

void CreatALG(ALGraph &G); //构造图
int LocateVex(ALGraph &G, VertexType ch); //图的顶点定位
void PrintALG(ALGraph &G); //打印链接表(已知)
void DFSTraverse(ALGraph &G); //深度优先遍历图
void DFS(ALGraph &G, int i);
void BFSTraverse(ALGraph &G); //广度优先遍历图

int visited[MAX_VERTEX_NUM]; //访问标识数组,全局变量

int main()
{
    ALGraph G;
    CreatALG(G);
    printf("------------------------------\n");
    if(G.kind == 0)
        printf("无向图的顶点数:%d\n无向图的弧数:%d\n", G.vexnum, G.arcnum);
    else
        printf("有向图的顶点数:%d\n有向图的弧数:%d\n", G.vexnum, G.arcnum);
    printf("------------------------------\n");
    printf("图的邻接表:\n\n");
    PrintALG(G);
    printf("------------------------------\n");
    printf("图的深度优先遍历序列:");
    DFSTraverse(G);
    printf("\n------------------------------\n");
    printf("图的广度优先遍历序列:");
    BFSTraverse(G);
    printf("\n------------------------------\n");

    return 0;
}

void PrintALG(ALGraph &G)
{
    ArcNode *temp;
    if(G.vexnum == 0)
    {
        printf("图为空!\n");
        return;
    }
    for(int i = 0; i < G.vexnum; i++)
    {
        printf("[%d]%c->", i, G.vertices[i].data);
        temp = G.vertices[i].firstarc;
        while(temp)
        {
            printf("[%d]->", temp->adjvex);
            temp = temp->nextarc;
        }
        printf("NULL\n");
    }
    return;
}

void InitSqQueue(SqQueue &Q) // 构造一个空队列
{
    Q.frot=Q.rear=0;
    return;
}

void EnSqQueue(SqQueue &Q, int v) // 入队操作
{
    if((Q.rear+1)%MAX_VERTEX_NUM==Q.frot)
    {
        printf("队列满,入队失败!\n");
        return;
    }
    Q.v[Q.rear]=v;
    Q.rear=(Q.rear+1)%MAX_VERTEX_NUM;
    return;
}

int DeSqQueue(SqQueue &Q)// 出队操作
{
    if(Q.frot==Q.rear) return -1;
    int t=Q.v[Q.frot];
    Q.frot=(Q.frot+1)%MAX_VERTEX_NUM;
    return t;
}

void CreatALG(ALGraph &G) //构造图
{
    VertexType ch;
    int i=0,sum=0;
    scanf("%d",&G.kind);
    getchar();
    while((ch=getchar())!='\n')
    {
        G.vertices[i].data=ch;
        G.vertices[i].firstarc=NULL;
        i++;
    }
    G.vexnum=i;
    for(i=0;i<G.vexnum;i++)
        while((ch=getchar())!='\n')
        {
            ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
            p->adjvex=LocateVex(G,ch);
            p->nextarc=G.vertices[i].firstarc;
            G.vertices[i].firstarc=p;
            sum++;
        }
     if(!G.kind) G.arcnum=sum/2;
        else G.arcnum=sum;
    return;
}

int LocateVex(ALGraph &G, VertexType ch) //图的顶点定位
{
    int i;
    for(i=0;i<G.vexnum;i++)
        if(ch==G.vertices[i].data)
            return i;
    return -1;
}

void DFSTraverse(ALGraph &G) //深度优先遍历图
{
    int i;
    for(i=0;i<G.vexnum;i++) visited[i]=0;
    
    for(i=0;i<G.vexnum;i++)
        if(!visited[i]) DFS(G,i);
}

void DFS(ALGraph &G, int i)
{
    visited[i]=1;
    printf("%c",G.vertices[i].data);
    
    for(ArcNode *p=G.vertices[i].firstarc;p;p=p->nextarc)
       if(!visited[p->adjvex])
           DFS(G,p->adjvex);
           
}

void BFSTraverse(ALGraph &G) //广度优先遍历图
{
    int i,index;
    SqQueue Q;
    InitSqQueue(Q);
    for(i=0;i<G.vexnum;i++)
        visited[i]=0;
    for(i=0;i<G.vexnum;i++)
    {
        if(!visited[i])
        {
            visited[i]=1;
            printf("%c",G.vertices[i].data);
            EnSqQueue(Q,i);
            while(Q.frot!=Q.rear)  //若队不为空
            {
                index=DeSqQueue(Q);
                for(ArcNode *p=G.vertices[index].firstarc;p;p=p->nextarc)
                    if(!visited[p->adjvex])
                    {
                        visited[p->adjvex]=1;
                        printf("%c",G.vertices[p->adjvex].data);
                        EnSqQueue(Q,p->adjvex);
                    }
            }
        }
    }
    
}

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值