数据结构——BFS邻接表遍历
来源:互联网 发布:保险行业收入 知乎 编辑:程序博客网 时间:2024/05/16 16:14
include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct node{ //定义结点结构 由数据域vertex和指针域next组成 int vertex;struct node *next; }NODE;typedef struct hnode{ //定义头结点结构 由数据域head和 指针域first组成 !!!注意 !!! 指针域类型是node 而不是hnode!!! int head;struct node *first; }HNODE;typedef struct{ //定义邻接表的结构 由头结点数组 和头结点数n边数e组成 !!!注意 !!!头结点数组存放的是头结点 而不是头结点指针!! HNODE list[10]; int n,e;}GRAPH;typedef struct Queue{ //队列的结构 由头指针pBase(就像是个数组名,代表着数组的首地址)和front rear组成。 int *pBase;int front;int rear;}QUEUE ;void init(QUEUE *pQ); void add(QUEUE *pQ,int val);void list(QUEUE *pQ);bool fullQueue(QUEUE *pQ);bool empty(QUEUE *pQ);void out(QUEUE *pQ,int *var);void create(GRAPH *G); void bfsl(QUEUE Q,GRAPH *G,int var);int b[50]={0};int var;int main(){GRAPH *G=(GRAPH *)malloc(sizeof(GRAPH));create(G);QUEUE Q;init(&Q);printf("请输入开始结点:\n");scanf("%d",&var);add(&Q,var);b[var]=1;bfsl(Q,G,var);}void bfsl(QUEUE Q,GRAPH *G,int var) {while(!empty(&Q)){out(&Q,&var);while(G->list[var].first!=NULL){if(b[G->list[var].first->vertex]!=1){printf("访问结点:%d\n",G->list[var].first->vertex); b[G->list[var].first->vertex]=1; //已被访问过的需要被标记 add(&Q,G->list[var].first->vertex);//并将该结点入队 ,每个节点只能入队一次 }G->list[var].first=G->list[var].first->next;}}}void create(GRAPH *G){int p,q,i,j,m;NODE *s;printf("请输入定点数n和边数e:"); scanf("%d %d",&G->n,&G->e); for(p=0;p<G->n;p++){printf("请输入头节点:"); //初始化头结点 scanf("%d",&m);G->list[m].head=m;G->list[m].first=NULL;}for(q=0;q<G->e;q++){printf("请输入边Vi Vj:");scanf("%d %d",&i,&j);s=(NODE *)malloc(sizeof(NODE)); s->vertex=j;s->next=G->list[i].first;G->list[i].first=s;s=(NODE *)malloc(sizeof(NODE));s->vertex=i;s->next=G->list[j].first;G->list[j].first=s;}}void init(QUEUE *pQ){pQ->pBase=(int *)malloc(sizeof(QUEUE)*6);//分配6个单元的数组空间给pBase, pBase即数组名 也是数组的首地址。 pQ->front=0;//空队列的front和rear都为0 pQ->rear=0;}void add(QUEUE *pQ,int val){if(fullQueue(pQ)){printf("队列已满,入队失败!\n");}else {pQ->pBase[pQ->rear] =val;pQ->rear=(pQ->rear+1)%6; //入队rear+1取余 front不变 } }void out(QUEUE *pQ,int *var){if(empty(pQ)){printf("空队列,出队失败!\n");}else{*var=pQ->pBase[pQ->front];pQ->front=(pQ->front+1)%6; //出队 front+1取余 rear不变 } } bool fullQueue(QUEUE *pQ){ //判断队列是否已满 采用分配6个单元 只能放5个数据的方法,当front和rear相邻时 判断 队列已满。 if((pQ->rear+1)%6==(pQ->front))return true;else return false;}void list(QUEUE *pQ){int i=pQ->front;while(i<pQ->rear){printf("%d",pQ->pBase[i]);i=(i+1)%6;}printf("\n");}bool empty(QUEUE *pQ){if(pQ->front==pQ->rear)//front=rear 即为空队列 return true;else return false;}
运行结果:
阅读全文
0 0
- 数据结构——BFS邻接表遍历
- 邻接表的bfs遍历
- 数据结构实验图论:基于邻接矩阵/邻接表的广度优先搜索遍历(BFS)
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历 (BFS)
- 数据结构之图(邻接表存储,DFS和BFS遍历)
- DFS BFS遍历图 邻接表实现
- 邻接表存储图利用BFS遍历
- 数据结构之——用C++实现邻接表的DFS与BFS
- 数据结构之BFS(邻接表版)
- 数据结构 — 图之邻接表存储创建和深度优先遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历(BFS+前向星)
- 数据结构 学习笔记(七):图(上):图的表示方法(邻接表,邻接矩阵),遍历(DFS,BFS)
- 数据结构(17)——基于邻接表的基本操作:构造,深搜(DFS),广搜(BFS)
- 数据结构与C语言实现(九)——图(上):邻接表,DFS与BFS
- 数据结构——邻接矩阵/邻接表
- 图的邻接表存储及DFS,BFS遍历
- 数据结构—图之邻接表
- 图——邻接表(深度遍历,广度遍历)
- Android获取图片路径
- windows编程基础
- Gradle史上最详细解析
- 进程间通信—管道
- 《Java编程思想》学习笔记4——集合容器
- 数据结构——BFS邻接表遍历
- selenium(三)alert
- Oozie调用shell脚本
- android中webview和请求头的问题
- C++类型的隐式转换和显式转换
- linux下获得root权限运行程序
- python 求两个list的差集,并集和交集
- HTML数组的基本操作(增删改查、删除重复元素)
- JVM 类加载机制详解