图的邻接表的创建与遍历
2013-06-16 16:22
246 查看
图的邻接表的创建、深度优先遍历和广度优先遍历
1.邻接表的定义
#define NUM 8 typedef int vex; typedef struct __ArcNode { int adjvex; struct __ArcNode *nextarc; }ArcNode; typedef struct __VNode { vex data; ArcNode *firstarc; }VNode;
2.图邻接表的创建、销毁与显示
status CreateGraph(VNode *AdjList) { int i; int c; ArcNode **p; for(i = 0; i < NUM; i++)//1 2 3 4 5 { AdjList[i].data = 1 + i; } for(i = 0; i < NUM; i++) { printf("输入以%d为尾的弧(0为结束):", AdjList[i].data); p = &AdjList[i].firstarc; scanf("%d", &c); while(c != 0) { *p = (ArcNode *)malloc(sizeof(ArcNode)); (*p)->adjvex = c - 1;//坐标是从0开始的,所以要减去1 p = &(*p)->nextarc; scanf("%d", &c); } *p = NULL; } return TRUE; } status DestroyGraph(VNode *adj) { int i; ArcNode *p, *pt; for(i = 0; i < NUM; i++) { p = adj[i].firstarc; while(p) { pt = p->nextarc; free(p); p = pt; } } return TRUE; } void PrintGragh(VNode *adj) { int i; ArcNode *p; for(i = 0; i < NUM; i++) { p = adj[i].firstarc; while(p) { printf("%d->%d\n", adj[i].data, adj[p->adjvex].data); p = p->nextarc; } } }
3.获得邻接点
ArcNode *FirstAdjVex(VNode *adj, vex v) { int i; i = v - 1; return adj[i].firstarc; } ArcNode *NextAdjVex(VNode *adj, vex v, vex w) { int i; ArcNode *p; i = v - 1; p = adj[i].firstarc; while(p) { if(adj[p->adjvex].data == w)//找到w的下一个节点 { break; } else { p = p->nextarc; } } if(p != NULL) { p = p->nextarc; } return p; }
4.深度优先遍历
void visitNode(VNode *adj, vex n) { printf("%d ", adj[n - 1].data); } int vexflag[NUM]; status DFS(VNode *adj, vex n, void (*visit)(VNode *adj, vex n)) { ArcNode *p; vex m; visit(adj, n);//访问顶点n vexflag[n - 1] = 1; for(p = FirstAdjVex(adj, n); p != NULL; p = NextAdjVex(adj, n, m)) { m = adj[p->adjvex].data; if(vexflag[m - 1] == 0) { DFS(adj, m, visit); } } return TRUE; } status DFSTraverse(VNode *adj, void (*visit)(VNode *adj, vex n)) { int i; for(i = 0; i < NUM; i++) { vexflag[i] = 0; } for(i = 0; i < NUM; i++) { if(vexflag[i] == 0) { DFS(adj, i + 1, visit); } } return TRUE; }
5.广度优先遍历
利用队列实现图的广度优先遍历,队列的基本操作参见:栈,队更的基本操作
status BFSTraverse(VNode *adj, void (*visit)(VNode *adj, vex n)) { int i; vex n; vex m; ArcNode *p; queue q; for(i = 0; i < NUM; i++) { vexflag[i] = 0; } initqueue(&q); for(i = 0; i < NUM; i++) { if(vexflag[i] == 0) { visit(adj, i + 1); vexflag[i] = 1; enqueue(&q, i + 1); while(!IsEmptyQueue(&q)) { dequeue(&q, &n); for(p = FirstAdjVex(adj, n); p != NULL; p = NextAdjVex(adj, n, m)) { m = adj[p->adjvex].data; if(vexflag[m - 1] == 0) { visit(adj, m); vexflag[m - 1] = 1; enqueue(&q, m); } } } } } destroyqueue(&q); }
6.测试
int main() { VNode AdjList[NUM]; ArcNode *p; // freopen("1.txt", "r", stdin); CreateGraph(AdjList); printf("\n"); PrintGragh(AdjList); p = NextAdjVex(AdjList, 1, 2); printf("%d\n", AdjList[p->adjvex].data); DFSTraverse(AdjList, visitNode); printf("\n"); BFSTraverse(AdjList, visitNode); printf("\n"); DestroyGraph(AdjList); }结果:
相关文章推荐
- 邻接表无向图的创建和遍历(dfs)
- 关于有向图的邻接表的创建,深度遍历及广度遍历.
- [置顶] 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
- 找出图中的所有连通子图(创建图的邻接表,深度优先遍历查找子图)
- 图的邻接表创建与遍历(C语言)
- C++ 无向图 邻接表创建 广度遍历 深度遍历
- 邻接表实现的图创建及遍历源码
- 图的邻接表存储、创建、深度优先遍历、广度优先遍历
- 图之 宽度优先遍历 BFS 邻接表创建的图
- 图的邻接表的创建与遍历
- 图的遍历 与创建 邻接表与临接矩阵
- 图的邻接表创建以及遍历
- 【郝斌数据结构自学笔记】24_链表创建和链表遍历算法的演示
- 头插法和尾插法创建、删除、遍历单链表
- 中序二叉树、队列实现层次遍历、中序线索二叉树的创建与遍历
- [置顶] 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
- 邻接表的广度优先遍历(java版)
- 由遍历序列创建二叉树
- 二叉搜索树 (BST) 的创建以及遍历
- 二叉树的创建及遍历