图-生成树和生成森林算法C语言
来源:互联网 发布:linux c file 头文件 编辑:程序博客网 时间:2024/04/28 13:28
对于用邻接表储存有向图或无向图,基于深度优先遍历算法生成树和生成森林,储存在孩子兄弟链表中:
#include <stdio.h>#include <stdlib.h>#include <malloc.h> #define MAXVERTEXNUM 100 typedef char VertexType;typedef int EdgeType;typedef char DataType;typedef char ElemType; typedef struct Edgenode{int adjvex;struct Edgenode *next;DataType *info;}Edgenode; typedef struct VertexNode{VertexType vertex;Edgenode *firstedge;}VertexNode; typedef VertexNode Adjlist[MAXVERTEXNUM+1]; typedef struct{Adjlist adjlist;int n,e;}ALGraph; typedef struct Tree{int data;struct Tree *lchild;struct Tree *nextsibling;}CSNode,*CSTree; typedef enum {False,True}Bool; Boolvisited[MAXVERTEXNUM+1],inStack[MAXVERTEXNUM+1]; void CreateMGragh2(ALGraph *G){ int i,j,k; Edgenode *s; printf("请输入顶点数和边数(输入格式为:顶点数,边数):"); scanf("%d%d",&(G->n),&(G->e)); printf("请输入顶点信息(输入格式为:顶点号<CR>):"); fflush(stdin); for(i=1;i<=G->n;i++) { scanf("%c",&(G->adjlist[i].vertex)); G->adjlist[i].firstedge=NULL; } printf("请输入边的信息(输入格式为:i,j):\n"); for(k=1;k<=G->e;k++) { scanf("%d%d",&i,&j); s=malloc(sizeof(Edgenode)); s->adjvex=j; s->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=s; }} void DFSTree(ALGraph G,int v,CSTree T){ CSTree q; Bool first=True; Edgenode *record=G.adjlist[v].firstedge; visited[v]=True; while(record) { if(!visited[record->adjvex]) { CSTree p=malloc(sizeof(CSNode)); p->data=record->adjvex; p->lchild=NULL; p->nextsibling=NULL; if(first) { T->lchild=p; first=False; } else { q->nextsibling=p; } q=p; DFSTree(G,record->adjvex,q); } record=record->next; }} void DFSForest(ALGraph G,CSTree *T){ int v; CSTree q,p; for(v=1;v<=G.n;v++) { visited[v]=False; } for(v=1;v<=G.n;v++) { if(!visited[v]) { p=malloc(sizeof(CSNode)); p->data=v; p->lchild=NULL; p->nextsibling=NULL; if(*T==NULL) *T=p; else q->nextsibling=p; q=p; DFSTree(G,v,q); } }} void PreOrder(CSTree bt,void(*visit)(ElemType),ALGraph G){ if(bt==NULL) return; (*visit)(G.adjlist[bt->data].vertex); PreOrder(bt->lchild,visit,G); PreOrder(bt->nextsibling,visit,G);} void visit(ElemType data){ printf("%c ",data);} int main(void){ ALGraph G2; //声明一个邻接表结构 CSTree T=NULL; //声明孩子兄弟链表 CreateMGragh2(&G2); //构建邻接表储存图数据。 DFSForest(G2,&T); //由图生成树后森林并用孩子兄弟链表储存起来。 PreOrder(T,visit,G2); //先根遍历。 return0;}
运行结果:
1 0
- 图-生成树和生成森林算法C语言
- 无向图的生成树和生成森林算法
- 生成树和生成森林
- 最小生成树Prim算法C语言
- 最小生成树Kruskal算法C语言
- 最大生成树算法C语言
- 最小生成树 kruscal算法 C语言
- C语言实现图的Prim最小生成树算法
- C语言实现图的Kruskal最小生成树算法
- C语言生成32位和64位随机数算法
- 最小生成树问题中Kruskal算法和Prim算法的C语言实现
- 最小生成树,普利姆算法和克鲁斯卡尔算法的C语言实现
- c语言:普里姆算法和克鲁斯卡尔算法求最小生成树
- 最小生成树(森林)
- java实现图的最小生成树(森林)MST克鲁斯卡尔(Kruskal)算法
- poj3723 Conscription Kruscal算法最大生成森林
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
- C语言编写Dijkstra算法及生成图
- Logger使用方法
- PythonTip(26~30)题详解
- fastjson常用示例
- Windows路由设置一例
- SpringMVC深度探险 —— SpringMVC核心配置文件详解
- 图-生成树和生成森林算法C语言
- iOS10之后,需要在plist文件中添加的权限Allow Arbitrary Loads
- 日期的计算
- MySQL delete数据时不支持表别名
- OPENCV+FFMPEG播放器
- oracle 的sql语句:alter table XX add XX,用法
- Google VR SDK For Unity 001:Get Start
- CS231n--BP算法
- 陀螺仪(可用于AR/VR)