数据结构C语言版(李云清)实验8 图

该博客详细介绍了使用C语言实现图的算法,包括邻接表存储结构的无向图顶点度计算,广度优先遍历,深度优先遍历,Prim求解最小生成树,Dijkstra单源最短路径算法以及拓扑排序算法。内容深入浅出,适合数据结构学习者参考。
摘要由CSDN通过智能技术生成

实验8 图


1、编写程序输出以邻接表为存储结构的无向图的各顶点的度。

/**********************************/
/*文件名称:lab8_01.c                 */
/**********************************/
#include "ljb.h"
/* 输出以邻接表为存储结构的无向图g的各顶点的度 */
void degree(LinkedGraph g)
{
   
    EdgeNode *p;
    int count;
    int i;
    for (i=0;i<g.n;i++)
    {
   
        count=0;
        p=g.adjlist[i].FirstEdge;
        while (p)
        {
   
            count++;
            p=p->next;
        }
        printf("D(%d)=%d\n",i,count);

    }

}
int main()
{
    LinkedGraph g;
  creat(&g,"g11.txt",0);  	/*已知g11.txt中存储了图的信息*/
  printf("\n The graph is:\n");
  print(g);
  degree(g);
  return 0;
}

2、图采用邻接表存储结构,编程对图进行广度优先遍历。

/**********************************/
/*文件名称:lab8_02.c                 */
/**********************************/
#include "ljb.h"
int visited[M];  				/*全局标志向量*/
/*请将本函数补充完整,并进行测试*/
void bfs(LinkedGraph g, int i)
{
    /*从顶点i出发广度优先变量图g的连通分量*/
    int queue[M],front,rear,v;
    EdgeNode *p;
    front=rear=0;
    queue[rear++]=i;
    visited[i]=1;
    while (front<rear)
    {
   
        v=queue[front++];
        printf("%c  ", g.adjlist[v].vertex);
        p=g.adjlist[v].FirstEdge;
        while (p)
        {
   
            if  (visited[p->adjvex]==0)
                   {
   
                       queue[rear++]=p->adjvex;
                       visited[p->adjvex]=1;
                   }
            p=p->next;
        }

    }

}


/*函数功能:广度优先遍历图g
  函数参数:邻接表g
*/
int BfsTraverse(LinkedGraph g)
{
     int i,count=0;
   for (i=0;i<g.n;i++)
       visited[i]=0;     /*初始化标志数组*/

   for (i=0;i<g.n;i++)
       if (!visited[i])  /*vi未访问过*/
       {
   printf("\n");
        count++;            /*连通分量个数加1*/
        bfs(g,i);
       }
   return count;
 }

int main()
{
    	  LinkedGraph g;
      int count;
      creat(&g,"g11.txt",0);  		/*创建图的邻接表*/
      printf("\n The graph is:\n");
      print(g);
      printf("广度优先遍历序列为:\n");
      count=BfsTraverse(g);     	/*从顶点0出发广度优先遍历图g*/
      printf("\n该图共有%d个连通分量。\n",count);
      return 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值