邻接表实现图的储存,遍历
来源:互联网 发布:2017网络电影 编辑:程序博客网 时间:2024/05/21 03:19
邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。又称链接表。
1.在有向图的邻接表中不易找到指向该顶点的弧。
2.在有向图的邻接表中,对每个顶点,链接的是以该顶点为弧尾的邻接点。
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#define MAX 100#define OK 1#define ERROR 0 typedef struct node//表结点 一个顶点对应一个单链表(链表的节点为该顶点的邻接点)vex表示与顶点邻接的点在图中的位置 { int vex; struct node *next;}Node; typedef struct head//头顶点 每个顶点对应一个头结点 first指向第一条边{ int data; Node *first;}VNode; typedef struct //边数 顶点数 存储顶点的数组{ VNode list[MAX]; int v, e;}Graph; void CreatReverseGraph(Graph *G)//有向图逆邻接表{ int s, e, i; Node *temp; scanf("%d%d", &(*G).v, &(*G).e); for (i = 0; i < (*G).v; i++) { (*G).list[i].first = (Node *)malloc(sizeof(Node)); ((*G).list[i].first)->next = NULL; (*G).list[i].data = 0; } for (i = 0; i < (*G).e; i++) { scanf("%d%d", &s, &e); temp = (Node *)malloc(sizeof(Node)); temp->vex = s; temp->next = ((*G).list[e].first)->next; ((*G).list[e].first)->next = temp; (*G).list[e].data += 1; } } void CreatGraph(Graph *G)//无向图的逆邻接表{ int i; int s, e; Node *temp; scanf("%d%d", &(*G).v, &(*G).e); for (i = 0; i < (*G).v; i++) { (*G).list[i].first = (Node *)malloc(sizeof(Node)); ((*G).list[i].first)->next = NULL; (*G).list[i].data = 0; } for (i = 0; i < (*G).e; i++) { scanf("%d%d", &s, &e); temp = (Node *)malloc(sizeof(Node)); temp->vex = e; temp->next = ((*G).list[s].first)->next; ((*G).list[s].first)->next = temp; (*G).list[s].data += 1; temp = (Node *)malloc(sizeof(Node)); temp->vex = s; temp->next = ((*G).list[e].first)->next; ((*G).list[e].first)->next = temp; (*G).list[e].data += 1; }} int FirstVertix(Graph G, int v)//返回顶点v的第一个邻接顶点{ Node *temp; temp = (G.list[v].first)->next; if (!temp) return -1; return temp->vex;} int NextVertix(Graph G, int v, int w)//返回顶点v相对于w的下一个邻接顶点{ Node *temp; temp = (G.list[v].first); for (temp = temp->next; temp; temp = temp->next) if (temp->vex == w) break; if (temp->next == NULL || !temp) return -1; return temp->next->vex; } void DFS(Graph G, int i, int *visit)//深度优先搜索{ int k; visit[i] = 1; printf("%d ", i + 1); for (k = FirstVertix(G, i); k >= 0; k = NextVertix(G, i, k))//遍历所有邻接顶点,若该顶点未访问,递归深度搜索 if (!visit[k]) { printf("(%d %d)\n", i + 1, k + 1); DFS(G, k, visit); }} void DFSVisit(Graph G){ int visit[MAX]; int i; memset(visit, 0, sizeof(int) * G.v);//初始话标记数组visit for (i = 0; i < G.v; i++) { if (!visit[i]) DFS(G, i, visit); }} void BFSVisit(Graph G)//广度优先搜索{ int visit[MAX]; int queue[MAX];//队列存储顶点 int front = 0, rear = 0; int i, j, k; memset(visit, 0, sizeof(int) * G.v); for (i = 0; i < G.v; i++) { if (!visit[i])//访问顶点并将该顶点入队 { visit[i] = 1; printf("%d\n", i + 1); queue[rear++] = i; } while (rear != front) { k = queue[front++];//出队 for (j = FirstVertix(G, k); j >= 0; j = NextVertix(G, k, j))//遍历该顶点所有邻接顶点 if (!visit[j]) { visit[j] = 1; printf("%d ", j + 1); printf("(%d %d)\n", k + 1, j + 1); queue[rear++] = j; } } }} int main(){ Graph G; CreatGraph(&G); //CreatReverseGraph(&G); printf("The DFS is:\n"); DFSVisit(G); printf("\nThe BFS is:\n"); BFSVisit(G); return 0;}
0 0
- 邻接表实现图的储存,遍历
- 建立图的邻接表储存并实现深度优先和广度优先遍历
- 图的邻接表储存及其遍历[数据结构学习]
- 图的邻接表储存。
- c语言实现无向图的邻接表储存
- 邻接表实现图的遍历
- 邻接表 实现图的遍历 C++
- 基于邻接表储存的图的深度优先和广度优先遍历
- 无向图的邻接表储存
- 图的储存之邻接表
- 图的储存结构之邻接表
- 有向图的邻接表储存
- 数据结构:不带权有向图的邻接矩阵和邻接表储存及求出入度实现
- 邻接表的图遍历
- 图的邻接表遍历
- 邻接表实现的图创建及遍历源码
- 图的广度优先遍历,基于邻接链表实现
- 图的深度优先遍历--邻接表实现
- win8 vs2003 全文搜索卡死 解决
- 在Python常用模块I如何打开相关文件的方法
- 彻底搞懂四元数
- Android开源项目SlidingMenu深入剖析
- [寒江孤叶丶的Cocos2d-x之旅_11]Cocos2d-x的重力感应Demo。如何使用重力感应。
- 邻接表实现图的储存,遍历
- 在vs2010中,根据已有代码和第三方静态库创建项目
- RPC python
- c++基础学习9-c++中的操作符重载
- linux上ln命令详细说明
- HDOJ 题目4508湫湫系列故事——减肥记I(完全背包)
- 虎嗅9.2
- Android:Layout_weight的深刻理解
- 利用poi对dotx指定字符进行替换