数据结构邻接表的建立以及两种遍历
2012-12-16 20:21
537 查看
静下心,去思考,思路便会清晰,程序基本框架便会浮现在脑海中
第一部分 存储结构
第二部分 邻接表的创立
第三部分 BFS遍历
第四部分 DFS递归遍历
最后一部分 mian函数
程序演示截图!!!
#include "stdio.h" #include "stdlib.h" #define MAX_VEX_NUM 20 #define OK 1 #define ERROR 0 typedef int Status; int visited[20];
第一部分 存储结构
typedef struct ArcNode { int adjvex;//用于存储数组下标 struct ArcNode * nextarc; }ArcNode;//表结点存储结构体 typedef struct VexNode { int data; ArcNode *firstarc; }VexNode,AdiList[MAX_VEX_NUM];//顶点存储结构体,AdiList可用于定义一个存储该结构体类型数据的数组 typedef struct { AdiList vexs;//顶点数组 int vexnum,arcnum; char kind;//图标志种类 }ALGraph;//邻接表结构体
第二部分 邻接表的创立
int LocateVex (ALGraph *G,int vex) { int i,t; for (i=0; i<G->vexnum; i++) { if(G->vexs[i].data == vex) { t=i; break; } else t = G->vexnum; } if (t == G->vexnum) exit(0); return t;//t = G.vexnumt作为值返回时,表示定位失败 }//定位操作,已知顶点元素,求出对应数组下标,并返回 Status InsertChild (ALGraph *G,int i,int j){ ArcNode *C; C = (ArcNode *) malloc (sizeof(ArcNode)); C->adjvex=j; C->nextarc=G->vexs[i].firstarc; G->vexs[i].firstarc=C; return OK; }//插入边,形成孩子链 Status CreateALGraph (ALGraph *G){ //int CreateDG (ALGraph *);//函数申明 //int CreateDN (ALGraph *);//函数申明 int CreateUDG (ALGraph *);//函数申明 //int CreateUDN (ALGraph *);//函数申明 printf ("Please choose kind of graph(1DG/2DN/3UDG/4UDN).\n"); scanf ("%c",&G->kind); switch (G->kind){ //case '1': CreateDG(G); break; //case '2': CreateDN(G); break; case '3': CreateUDG(G); break;//此处G为指针 //case '4': CreateUDN(G); break; default : return ERROR; } return OK; } int CreateUDG (ALGraph * G){ int i,j,v1,v2; printf ("Please enter values for G.vexnum and G.arcnum\nExample : 5,6\n"); scanf ("%d,%d",&G->vexnum,&G->arcnum); printf ("Please enter values for vexs[]\n"); for (i=0; i<G->vexnum; i++){ scanf ("%d",&G->vexs[i].data); G->vexs[i].firstarc=NULL;//初始化为空指针 } printf ("Please enter ChildList\nExample : '1-2' enter '1,2', enter '0,0' to over\n"); scanf ("%d,%d",&v1, &v2); while (v1 != 0 && v2 != 0) { i = LocateVex(G,v1); j = LocateVex(G,v2); InsertChild (G,i,j); InsertChild (G,j,i); scanf ("%d,%d",&v1, &v2); } return OK; }
第三部分 BFS遍历
Status BFS(ALGraph G,int i){ ArcNode *p; visited[i]=1; printf("%3d",G.vexs[i].data); p=G.vexs[i].firstarc; while(p){ i=p->adjvex; if (visited[i]==0){ visited[i]=1; printf("%3d",G.vexs[i].data); } p=p->nextarc; } return OK; } Status BFSTraverse (ALGraph G) { int i; for (i=0;i<G.vexnum;i++) visited[i]=0; for (i=0;i<G.vexnum;i++){ if (visited[i]==0) BFS(G,i); } printf ("\n"); return OK; }
第四部分 DFS递归遍历
Status DFS (ALGraph G,int i){ ArcNode *p; visited[i]=1; printf ("%3d",G.vexs[i].data); p=G.vexs[i].firstarc; while (p && visited[p->adjvex]==0){ i=p->adjvex; DFS (G,i); p=p->nextarc; } return OK; } Status DFSTraverse (ALGraph G){ int i; for (i=0; i<G.vexnum; i++) visited[i]=0; for (i=0; i<G.vexnum; i++){ if (visited[i]==0) DFS(G,i);//递归 } printf ("\n"); return OK; }
最后一部分 mian函数
int main (){ int i; ArcNode *p; ALGraph G; CreateALGraph (&G); printf("********Check the Child Link List********\n"); for (i=0; i<G.vexnum; i++) { printf ("%d",G.vexs[i].data); p=G.vexs[i].firstarc; while (p) { printf("—>%d",G.vexs[p->adjvex].data); p=p->nextarc; } printf ("\n"); } printf("*****************************************\n"); printf("*********** BFSTraverse *************\n"); BFSTraverse (G); printf("*****************************************\n"); printf("*********** DFSTraverse *************\n"); DFSTraverse (G); printf("*****************************************\n"); return 0; }
程序演示截图!!!
相关文章推荐
- 数据结构 二叉树遍历之前序、中序、后序以及层次遍历实现
- 数据结构-图的建立与遍历
- 二叉树建立以及先序、中序、后序、层次遍历(JAVA 实现)
- python数据结构--二叉树建立与遍历
- 二叉树(按层建立二叉树,前中后序以及按层遍历)
- 图的建立之邻接表的建立及遍历
- 数据结构中堆的建立,建小堆,以及堆排序
- 邻接表的深度优先遍历以及广度优先遍历
- 邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现)
- [数据结构]第六次作业:图的建立、遍历、最小生成树、最短路径
- 邻接表的两种遍历算法
- 【数据结构】邻接表深度和广度遍历DFS_BFS
- 二叉树的建立、遍历,以及给定二叉树前序遍历和中序遍历重建二叉树问题。
- 20170513_一步一步写数据结构(二叉树的建立和遍历)
- 图---邻接表(建立,深度遍历,广度遍历)
- 数据结构(十一)——二叉树的遍历和建立
- 二叉树节点数据结构-练习 5 二叉树的建立 遍历
- 二叉树的递归遍历非递归遍历以及其他二叉树的相关操作实现(数据结构)
- 数据结构---单链表的两种建立
- 常用数据结构-二叉树的链式存储、建立和遍历