图的邻接表表示及遍历
来源:互联网 发布:vmware12 mac os补丁 编辑:程序博客网 时间:2024/06/05 20:57
图也可以用邻接表表示。各个结点中存放了结点的信息,并且由一个指针变量,指向第一条边,第一条变又指向第二条边,以此类推。图的邻接表的代码如下:
/********************************//******图的邻接表的建立及遍历****/#include<stdlib.h>#include<stdio.h>#include<string.h>#define MaxVerNum 100#define QueueSize 30typedef enum{FALSE,TRUE} Boolean;typedef struct ArcNode{ int adjvex;//该边所指向的结点的位置 struct ArcNode * nextarc;//指向下一条边的指针}ArcNode;typedef struct VNode{ char data;//顶点信息 ArcNode *firstarc;//指向第一条边的指针}VNode;typedef struct{ VNode adjlist[MaxVerNum]; int n,e;}AGraph;/******************************************//**建立有向图的邻接表算法*****************/ Boolean visited[MaxVerNum]; void CreateAGraph(AGraph * G) { int i,j,k; ArcNode * s; printf("请输入顶点数和边数(输入格式为:顶点数,边数):"); scanf("%d,%d",&(G->n),&(G->e)); printf("请输入顶点信息,每个顶点以回车作为结束:\n"); /*建立顶点表,顶点从0开始编号*/ for(i=0;i<G->n;i++) { scanf("\n%c",&(G->adjlist[i].data)); G->adjlist[i].firstarc=NULL; } printf("请输入边的信息(i,j):\n");//回车作为结束 for(k=0;k<G->e;k++) { scanf("%d,%d",&i,&j); s=(ArcNode *)malloc(sizeof(ArcNode)); if(s!=NULL) { s->adjvex=j; s->nextarc=G->adjlist[i].firstarc; G->adjlist[i].firstarc=s; s=NULL; /*对于无向图在申请一块内存用来存放边即可 */ //s=(ArcNode * )malloc(sizeof(ArcNode)); if(s!=NULL) { s->adjvex=i; s->nextarc=G->adjlist[j].firstarc; G->adjlist[i].firstarc=s; s=NULL; } } } } /****深度优先遍历******************************/ void DFS(AGraph *G,int vi)//以vi为出发点对邻接表表示的图进行深度优先搜索 { ArcNode * p=NULL; visited[vi]=TRUE; printf("visited vextex : %c\n",G->adjlist[vi].data); p=G->adjlist[vi].firstarc; while(p!=NULL) { if(visited[p->adjvex]==FALSE) DFS(G,p->adjvex); p=p->nextarc; } } void DFSTraver(AGraph *G) { int i; for(i=0;i<G->n;i++) visited[i]=FALSE; for(i=0;i<G->n;i++) if(!visited[i]) DFS(G,i); }/******************************************************//*****广度优先遍历*************************************/typedef struct { int front ; int rear; int count; int data[QueueSize];}CirQueue;void InitQueue(CirQueue * Q){ Q->front=Q->rear=0; Q->count=0;};int QueueEmpty(CirQueue *Q){ return Q->count==0;}int QueueFull(CirQueue *Q){ return Q->count==QueueSize;}void EnQueue(CirQueue *Q,int x){ if(QueueFull(Q)) printf("Queue overflow\n"); else { Q->count++; Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%QueueSize; }}int DeQueue(CirQueue * Q){ int temp; if(QueueEmpty(Q)) printf("Queue underflow\n"); else { temp=Q->data[Q->front]; Q->count--; Q->front=(Q->front+1)%QueueSize; return temp; }}void BFS(AGraph *G,int k)//以k为源点进行广度优先搜索{ int i; CirQueue Q; ArcNode * p; InitQueue(&Q); visited[k]=TRUE; printf("广度优先遍历结点:%c\n",G->adjlist[k].data); EnQueue(&Q,k); while(!QueueEmpty(&Q)) { i=DeQueue(&Q); p=G->adjlist[i].firstarc; while(p) { if(!visited[p->adjvex]) { printf("广度优先遍历结点:%c\n",G->adjlist[p->adjvex].data); visited[p->adjvex]=TRUE; EnQueue(&Q,p->adjvex); } p=p->nextarc; } }}void BFSTraver(AGraph *G){ int i; for(i=0;i<G->n;i++) visited[i]=FALSE; for(i=0;i<G->n;i++) { if(!visited[i]) BFS(G,i); }} void main(void){ AGraph G; CreateAGraph(&G); DFSTraver(&G); BFSTraver(&G);}
0 0
- 图的邻接表表示及遍历
- 图的邻接表表示法及遍历
- 无向图的邻接表表示法 及 深搜遍历DFS
- 图的邻接表表示及其DFS遍历
- 图的邻接表表示及其BFS遍历
- 图的广度遍历-邻接链表表示
- 图的深度遍历-邻接链表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 图的邻接表表示
- 邻接表表示图
- (12.16)图的邻接表表示
- 有向图的邻接表表示
- openSCAD 画多边形 三角形
- 高效的交换函数
- spring 总结
- 异步与多线程的区别
- Python学习笔记——第四章 字典
- 图的邻接表表示及遍历
- Go语言 Go的网络轮询及IO机制
- Java多线程的使用
- 一个最简单的google map页面
- 条件控制语句
- 数据库事物
- php 分页 【3种形式】
- 软件设计与结构化设计方法
- 随机洗牌算法