图的邻接表表示及深度优先搜索和广度优先搜索 prim求最小生成树

本文介绍了图的邻接表数据结构,特别适合存储稀疏图,包括表头结点表和边表两部分。接着详细阐述了深度优先搜索(DFS)的步骤,并给出了相关函数的描述。此外,还讲解了广度优先搜索(BFS)的基本思想和相关函数。最后,提到了Prim算法用于求解最小生成树,描述了其逐步合并顶点的过程。
摘要由CSDN通过智能技术生成

       邻接表表示图的基本思想是只存储相关信息,适合存储稀疏图,由表头结点表和边表两部分组成。对图中的每个顶点建立一个带头结点的边链表,每个边链表的头结点又构成一个表头结点表,具体结构如下

以下为存储结构

typedef char ElemType;
//边表结点
typedef struct ArcNode{
   int adjvex;  //该弧指向定点的位置
   struct ArcNode *nextarc; //指向下一弧的指针
   int info;//权值
}ArcNode;
//表头结点
typedef struct VertexNode{
   ElemType data;//顶点数据
   ArcNode *firstarc;//指向该顶点第一条弧的指针
}VertexNode;
//表头结点表
typedef struct{
   VertexNode vertex[N];
   int vexnum,arcnum;//图的顶点数和弧数
   int kind;//图的种类标志 0表示无向图
}AdjList;

深度优先搜索是指按照深度方向搜索,基本思想是

1、从图中某个顶点v0出发,首先访问v0

2、找出刚访问过的顶点v0的第一个未被访问的邻接点,然后访问该顶点,以该顶点为新的顶点,重复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止。

3、返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点;然后执行步骤2

相关函数如下

//深度优先搜索
void DepthFirstSearch(AdjList *L,int V[],int n){
  printf("V%d ",n);
  V[n]=1;
  ArcNode *p=L->vertex[n].firstarc;
  while(p!=NULL){
    if(V[p->adjvex]==0){
       DepthFirstSearch(L,V,p->adjvex);
    }
     p=p->nextarc;
  }
}

广度优先搜索是指按照广度方向搜索,基本思想是


1、从图中某个顶点v0出发,首先访问v0;


2、依次访问v0到各个未被访问的邻接点;


3、分别从这些邻接点出发,依次访问它们的各个未被访问的邻接点


相关函数如下,

//定义队列
typedef struct{
   int Q[M];
   int front;
   int rear;
}Queue;
//初始化队列
void InitQueue(Queue *Q){
   Q->front=Q->rear=0;
}
//入队
void EnterQueue(Queue *Q,int n){
   if((Q->rear+1)%M==Q->front){
        printf("入队出错\n");
   }else{
        Q->Q[Q->rear]=n;
        Q->rear=(Q->rear+1)%M;
   }
}
//判断队列是否为空
i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值