【Dev-c++】C语言数据结构实验——图

一、实验目的

    1、掌握图的基本存储方法和相关术语

    2、掌握图的两种搜索路径的遍历方法

    3、理解最小生成树的有关概念及普里姆(Prim)和克鲁斯卡尔算法

    4、掌握图的有关应用

二、实验要求

    1、认真阅读程序。

2、上机调试,并运行程序。

3、保存和截图程序的运行结果,并结合程序进行分析。

三、实验内容和基本原理

    1、实验6.1 建立无向图的邻接矩阵存并输出

    给出一个无向图,求它的邻接矩阵(见参考程序1):

   

    2、实验6.2 建立图的邻接存储并在此基础上实现图的深度优先遍历和广度优先遍历

                        

//参考程序1

#include<stdio.h>

#include<stdlib.h>

#define MAX 20

typedef int VexType;

typedef VexType Mgraph[MAX][MAX];

void creat_mg(Mgraph G);

void output_mg(Mgraph G);

Mgraph G1;

int n,e,v0;

void main()

{

       creat_mg(G1);

       output_mg(G1);

}

void creat_mg(Mgraph G)

{

       int i,j,k;

       printf("\n 请输入无向图的顶点数和边数,如: 6,5:");

       scanf("%d,%d",&n,&e);

       for(i=1;i<=n;i++)

              for(j=1;j<=n;j++)

                     G[i][j]=0;

              for(k=1;k<=e;k++)

              {

                     printf("\n请输入每条边的两个顶点编号,如:2,5 :");

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

                     G[i][j]=1;

                     G[j][i]=1;

              }

}

void output_mg(Mgraph G)

{

       int i,j;

       for(i=1;i<n;i++)

       {

              printf("\n");

              for(j=1;j<=n;j++)

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

       }

       printf("\n");

}

                       

参考程序2

#include<stdio.h>

#include<stdlib.h>

#define MAX 20

typedef int VexType;

typedef struct Vnode

{

       VexType data;

       struct Vnode *next;

}Vnode;

typedef Vnode Lgraph[MAX];

typedef struct

{

       int V[MAX];

       int front;

       int rear;

}Queue;

void creat_L(Lgraph G);

void output_L(Lgraph G);

void dfsL(Lgraph G,int v);

void bfsL(Lgraph G,int v);

Lgraph Ga;

int n,e,visited[MAX];

void main()

{

       int v1,i;

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

              visited[i]=0;

       creat_L(Ga);

       output_L(Ga);

       printf("\n请输入深度优先遍历的出发点:");

       scanf("%d",&v1);

       printf("\n深度优先遍历的结果为:");

       dfsL(Ga,v1);

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

              visited[i]=0;

       printf("\n请输入广度优先遍历的出发点:");

              scanf("%d",&v1);

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

       bfsL(Ga,v1);

}

void creat_L(Lgraph G)

{

       Vnode *p,*q;

       int i,j,k;

       printf("\n请输入图的顶点数和边数:");

       scanf("%d,%d",&n,&e);

       for(i=1;i<=n;i++)

       {

              G[i].data=i;

              G[i].next=NULL;

       }

       for(k=1;k<=e;k++)

       {

              printf("请输入每条边的关联顶点编号:");

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

              p=(Vnode *)malloc(sizeof(Vnode));

              p->data=i;

              p->next=G[j].next;

              G[j].next=p;

              q=(Vnode *)malloc(sizeof(Vnode));

              q->data=j;

              q->next=G[i].next;

              G[i].next=q;

       }

}

void output_L(Lgraph G)

{

       int i;

       Vnode *p;

       for(i=1;i<=n;i++)

       {

              printf("\n与[%d]关联的顶点有:",i);

              p=G[i].next;

              while(p!=NULL)

              {

                     printf("%5d",p->data);

                     p=p->next;

              }

       }

}

void initqueue(Queue *q)

{

       q->front=-1;

       q->rear=-1;

}

int quempty(Queue *q)

{

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

       {

              return 1;

       }

       else

       {

              return 0;

       }

}

void enqueue(Queue *q,int e)

{

       if((q->rear+1)%MAX==q->front)

              printf("队列满!\n");

       else

       {

              q->rear=(q->rear+1)%MAX;

              q->V[q->rear]=e;

       }

}

int dequeue(Queue *q)

{

       int t;

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

       {

              printf("队列空!\n");

              return 0;

       }

              else

              {

                     q->front=(q->front+1)%MAX;

                     t=q->V[q->front];

                     return t;

              }

}

void dfsL(Lgraph G,int v)

{

       Vnode *p;

       printf("%d->",G[v].data);

       visited[v]=1;

       p=G[v].next;

       while(p)

       {

              v=p->data;

              if(visited[v]==0)

                     dfsL(G,v);

              p=p->next;

       }

}

void bfsL(Lgraph g,int v)

{

       int x;

       Vnode *p;

       Queue *q=(Queue *)malloc(sizeof(Queue));

       initqueue(q);

       printf("\n %d->",g[v].data);

       visited[v]=1;

       enqueue(q,v);

       while(!quempty(q))

       {

              x=dequeue(q);

              p=g[x].next;

              while(p)

              {

                     v=p->data;

                     if(visited[v]==0)

                     {

                            printf("%d->",g[v].data);

                            visited[v]=1;

                            enqueue(q,v);

                     }

                     p=p->next;

              }

       }

       printf("\n");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Karry D

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

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

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

打赏作者

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

抵扣说明:

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

余额充值