图邻接表(深搜和广搜遍历C语言)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define MaxVertexNum 30

bool visited[MaxVertexNum];

typedef  char VertexType;


//边表  结点
typedef  struct ArcNode
{
   
    int adjvex; //临接点对应下标
    struct ArcNode *next;
} ArcNode;

//顶点表结点
typedef  struct VNode
{
   
    VertexType data;//顶点数据
    ArcNode *first;//边表头指针
} VNode,AdjList[MaxVertexNum];

//邻接表
typedef struct Graph
{
   
    AdjList adjList;
    int verNum,arcNum;
} GraphAdjList;

typedef struct Queue{
   

     int data[MaxVertexNum];//存放图的标号
     int front;
     int rear;
}Queue;

bool InitQueue(Queue *q){
   
     q->front=0;
     q->rear=0;
     return true;
}


bool  IsEmpty(Queue *q){
   

    if(q->front==q->rear)return true;
    return false;
}

bool  EnQueue(Queue *q, int e){
   
    if((q->rear+1)%MaxVertexNum==q->front)return false;
    q->data[q->rear]=e;
    q->rear=(q->rear+1)%MaxVertexNum;
    
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接表是一种的表示方法,它以每个节点为基础,对每个节点的相邻节点进行链式存储。邻接表由一个数组和一个链表组成,数组中每个元素对应一个节点,链表中则存储与该节点相邻的节点。以下是邻接表C语言实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最大顶点数 // 边表结构体 typedef struct ArcNode { int adjvex; // 邻接点下标 struct ArcNode *nextarc; // 指向下一个邻接点的指针 } ArcNode; // 顶点表结构体 typedef struct { int data; // 顶点信息 ArcNode *first; // 指向第一个邻接点的指针 } VNode; // 结构体 typedef struct { VNode vertex[MAX_VERTEX_NUM]; // 顶点表 int vexnum; // 顶点数 int arcnum; // 边数 } ALGraph; // 遍历 void DFS(ALGraph *G, int v, int *visited) { printf("%d ", G->vertex[v].data); visited[v] = 1; // 标记当前节点已被访问 ArcNode *p = G->vertex[v].first; while (p != NULL) { if (visited[p->adjvex] == 0) { DFS(G, p->adjvex, visited); } p = p->nextarc; } } // 创建 void CreateGraph(ALGraph *G) { printf("请输入顶点数和边数:"); scanf("%d %d", &G->vexnum, &G->arcnum); for (int i = 0; i < G->vexnum; i++) { printf("请输入第 %d 个顶点信息:", i + 1); scanf("%d", &G->vertex[i].data); G->vertex[i].first = NULL; } for (int i = 0; i < G->arcnum; i++) { printf("请输入第 %d 条边的起点和终点:", i + 1); int start, end; scanf("%d %d", &start, &end); ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = end - 1; p->nextarc = G->vertex[start - 1].first; G->vertex[start - 1].first = p; } } int main() { ALGraph G; CreateGraph(&G); int visited[MAX_VERTEX_NUM] = {0}; // 记录节点是否被访问过的数组 printf("DFS遍历结果为:"); for (int i = 0; i < G.vexnum; i++) { if (visited[i] == 0) { DFS(&G, i, visited); } } return 0; } ``` 在上面的代码中,我们定义了两个结构体,分别是顶点表结构体和边表结构体。创建时,我们先输入顶点数和边数,然后依次输入每个顶点的信息,再输入每条边的起点和终点,将边加入到邻接表中。遍历时,我们使用DFS算法进行遍历,从每个未被访问过的节点开始递归遍历其相邻节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值