《数据结构实验3》--图的遍历操作

图的遍历操作

一、     实验目的:

该程序主要完成对图的创建,并实现图的深度优先遍历和广度优先遍历

                                                                

二、     实验内容:

1、   所输入的数据要为整形数据

2、   输出的形式为:每按一次回车,遍历一个结点

3、   能创建最大结点树为30的任意图,实现对无向图的两种遍历

程序流程:

main()->clrscr()->visited()->DFS()->visited()->BFS().

代码:

#include<stdio.h>
#include<stdlib.h>					/*引用两个头文件*/
#define max_vex 30					/*定义MAXVEX=30*/
struct edge_node						/*定义边的结构体*/
{
    int adjvex;
    char info;
    struct edge_node*next;
};
struct vex_node						/*定义点的结构体*/
{
    char data;
    struct edge_node*link;
};
typedef struct vex_node adjlist[max_vex];  /*自定义adjlist为结构体数组类型*/
adjlist tu1;							/*定义结构体数组变量tu1*/

void creategraph(adjlist g,int n)			/*图创建函数*/
{
    int e,i,s,d;							/*定义存储边、点的变量*/
    struct edge_node*p,*q;					/*定义边的结构体指针*/
    printf("the point(n) and edge(e):");		/*显示提示输入点,边*/
    scanf("%d,%d",&n,&e);				/*接收点、边存入n,e中*/
    for(i=1; i<=n; i++)
    {
        getchar();
        printf("\tthe %d information:",i);		/*提示输入结点信息*/
        scanf("%c",&g[i].data);				/*存储信息*/
        g[i].link=NULL;					/*最后指针为空*/
    }
    for(i=1; i<=e; i++)
    {
        printf("\nthe%d edges=>\n\t :",i);		/*提示输入边信息*/
        scanf("%d,%d",&s,&d);				/*接收边的信息*/
        p=(struct edge_node*)malloc(sizeof(struct edge_node));
        q=(struct edge_node*)malloc(sizeof(struct edge_node)); /*开辟两个存储边的空间*/
        p->adjvex=d;						/*把其中一个点存储下来*/
        p->info=g[d].data;
        q->adjvex=s;						/*把另一个点存储下来*/
        q->info=g[s].data;
        p->next=g[s].link;					/*p和s的link指针连接起来*/
        g[s].link=p;
        q->next=g[d].link;					/*q和s的link指针连接起来*/
        g[d].link=q;						/*完成一个边的创建*/
    }
}
int visited[max_vex];						/*定义访问数组*/
void dfs(adjlist adj,int v)					/*深度优先遍历函数*/
{
    int i;
    struct edge_node*p;						/*定义边指针*/
    visited[v]=1;						/*把开始遍历的点在访问数组中标识*/
    printf("now is at point %d",v); 				/*输出正访问的点*/
    p=adj[v].link;
    printf("the data is %c \n",adj[v].data);		/*输出点的信息*/
    getchar();
    while(p)
    {
        if(visited[p->adjvex]==0)
            dfs(adj,p->adjvex);					/*没有访问的再调用DFS函数*/
        p=p->next;							/*访问过的判断下一个*/
    }
}

int quene[max_vex];
void bfs(adjlist adj,int vi) 					/*广度优先遍历函数*/
{
    int m=max_vex;							/*定义一个队列*/
    int front=0,rear=1,v;
    struct edge_node*p;						/*定义边指针*/
    visited[vi]=1;							/*开始访问的点标识一下*/
    printf("now visit the point:%d\n",vi);			/*输出正访问的点*/
    getchar();
    quene[rear]=vi;					/*把访问过的点放入数组中*/
    while(front!=rear)
    {
        front=(front+1)%m;
        v=quene[front];
        p=adj[v].link;
        while(p)
        {
            if(visited[p->adjvex]==0)				/*判断p->adjvex点是否访问过*/
            {
                visited[p->adjvex]=1;				/*访问没有访问过的结点*/
                printf("now visit the point:%d\n",p->adjvex); /*输出正访问的结点*/
                getchar();
                rear=(rear+1)%m;
                quene[rear]=p->adjvex;				/*放入数组中*/
            }
            p=p->next;							/*指向下一个*/
        }
    }
}

int main()
{
    int i;
   system("CLS");
    creategraph(tu1,0);						/*创建图*/
    for(i=1; i<max_vex; i++)
        visited[i]=0;							/*访问数组初始化*/
    dfs(tu1,1); 								/*调用DFS*/
    getchar();								/*等待输入*/
    for(i=1; i<max_vex; i++)
        visited[i]=0;
    bfs(tu1,1); 								/*调用BFS*/
}

运行:

《《数据结构实验3》--图的遍历操作》

图:

《《数据结构实验3》--图的遍历操作》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/u013050857/article/details/39455321
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞