数据结构实验四 图的基本操作

★观前提示:本篇内容为数据结构实验,代码内容经测试没有问题,但是可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。

一、实验目的

(1)理解并熟悉掌握图的邻接矩阵和邻接表的存储表示方法;
(2)熟悉掌握图的深度和广度优先的遍历算法。

二、实验要求

(1)所输入的数据要为整型数据。
(2)输出的形式为:每按一次回车,遍历一个结点。
(3)能创建最大结点数为30的任意图,实现对无向图的两种遍历。
(4) 程序流程: main()clrscr()visited()→DFS()visited()→BFS()。

★温馨提示:以下代码均为改正过的代码,皆已经过测试。

三、源码实现

#include<stdio.h>
#include<stdlib.h>                 //头文件 
#include<conio.h>
#include<string.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);		/*输出点的信息*/
    getch();
    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);			/*输出正访问的点*/
    getch();
    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); /*输出正访问的结点*/
                getch();
                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*/
    getch();								/*等待输入*/
    for(i=1; i<max_vex; i++)
        visited[i]=0;
    bfs(tu1,1); 								/*调用BFS*/
}

四、实验总结

① 通过本次实验,理解了图的相关算法,掌握了图的邻接矩阵和邻接表的存储表示方法,对图有了进一步的认识和了解。
② 通过多次尝试对图的代码实现,理解了图如何创建生成及其实现原理。
③ 明白了图的代码实现逻辑,掌握了图的两种遍历算法如:深度优先遍历和广度优先遍历。

2022.5.21记录:Code_流苏(CSDN)
如有任何疑问,评论回复,看到即回,欢迎大家多多交流学习!
★以上实验内容仅供参考。

猜你喜欢

转载自blog.csdn.net/qq_51646682/article/details/124905359