图的邻接表创建与遍历(C语言)
来源:互联网 发布:苏州微信营销闻道网络 编辑:程序博客网 时间:2024/05/22 05:26
数据结构
三个结构体,边,顶点,图。
typedef struct Side//边{ int toVertex;//边指向的点 struct side *next;}Side,*sLink;typedef struct Vertex//顶点{ int data; sLink first;//第一个边}Vertex,AdjList[20];typedef struct Graph//图{ AdjList adj;//顶点数组,注意不是指针,用.不用-> int n,v;//顶点数,边数}Graph,*gLink;
创建
先顶点,再边。边用头插法,最后插的接在first上
void createGraph(gLink g){ int n,v,data; printf("请输入顶点数与边数"); scanf("%d %d",&n,&v); g->n = n; g->v = v; int i; for(i=0;i<n;i++) { printf("请输入顶点%d权值",i); scanf("%d",&data); g->adj[i].data = data; g->adj[i].first = NULL; } printf("请输入边信息"); int v1,v2; for(i=0;i<v;i++) { scanf("%d %d",&v1,&v2); sLink s = (sLink)malloc(sizeof(Side)); s->toVertex = v2; s->next = g->adj[v1].first; g->adj[v1].first = s; }}
遍历
第一个for初始化vidited,第二个for调用BFS或DFS。考虑到图可能不连通,所以用到第二个for。
void travel(gLink g){ int visited[g->n]; int i; for(i=0;i<g->n;i++) { visited[i]=0; } for(i=0;i<g->n;i++) { if(!visited[i]) { //DFS(g,visited,i); BFS(g,visited,i); } }}
深度优先搜索
递归
void DFS(gLink g,int *visited,int i){ visited[i] = 1; printf("%-5d",g->adj[i].data); sLink s = g->adj[i].first; while(s) { if(!visited[s->toVertex]) { DFS(g,visited,s->toVertex); } s = s->next; }}
广度优先搜索
用队列,类似于树的层序遍历
void BFS(gLink g,int *visited,int i){ Vertex queue[20];//队列 int rear=0,front=0; queue[rear++] = g->adj[i]; visited[i]=1; while(front!=rear) { Vertex v = queue[front++];//出队 printf("%-5d",v.data); sLink s = v.first; while(s) { if(!visited[s->toVertex]) { queue[rear++] = g->adj[s->toVertex];//入队 visited[s->toVertex]=1; } s=s->next; } }}
主函数
int main(){ gLink g = (gLink)malloc(sizeof(Graph)); createGraph(g); travel(g); return 0;}
阅读全文
1 0
- 图的邻接表创建与遍历(C语言)
- 邻接表的创建与输出(C语言)
- 图的邻接表的创建与遍历
- 图的邻接表的创建与遍历
- C语言里面邻接表的创建
- 图的邻接表创建以及遍历
- 图的遍历--使用邻接表作为存储结构的遍历(DFS、BFS)C语言
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接表存储与遍历
- 图的遍历 与创建 邻接表与临接矩阵
- C语言-动态链表的创建遍历与插入
- 邻接表实现的图创建及遍历源码
- 邻接表无向图的创建和遍历(dfs)
- 邻接表的图遍历
- 图的邻接表遍历
- 图的广度优先搜索遍历(邻接表&邻接矩阵)(C++)
- C语言以邻接表为存储结构的图的构造以及广度优先,深度优先遍历
- ubuntu系统启动后停在了(initramfs),求解?
- VueJs与ReactJS和AngularJS的异同点_javascript技巧
- Java表单验证封装类
- 缓存获取与清除
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- 图的邻接表创建与遍历(C语言)
- java日期选择
- Packet for query is too large (12238 > 1024). You can change this value
- Android CardView 5.0以下间距问题
- 关于实习:不是总结的总结
- Android自动化压力测试图解教程——Monkey工具
- Netty实现聊天通信(4.0)
- 802.11无线网络学习(一):无线网络导论
- 谷歌搜索网站备份