数据结构图的数组表示法以及深度,广度遍历
2012-12-15 22:06
701 查看
#include"stdio.h" #include"stdlib.h" #define MAX_VERTEX_NUM 10 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define maxsize 100 typedef int QElemType; typedef int VRType; typedef int InfoType; typedef int VertexType; typedef int Status; int visited[MAX_VERTEX_NUM];//全局数组变量
第一部分 存储结构:
1.边存储结构
typedef struct ArcCell{ VRType adj; //InfoType * info;//此程序并未涉及权值
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//AdiMatrix 为一‘该结构体类型的数组类型’,可用于定义‘该结构体类型数据的数组变量’
1.图数组表示法存储结构
typedef struct { VertexType vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vexnum,arcnum; char kind; }MGraph;
第二部分 基础操作
1图的建立操作(仅仅写了一个UDN的建立)
int LocateVex(MGraph *G,int vex){ int i; for (i=0;i<G->vexnum;i++){ if(vex == G->vexs[i]) break; } if(i<G->vexnum)return i; else return ERROR; } Status CreateGraph (MGraph *G){ //int CreateDG (MGraph *);//函数申明 //int CreateDN (MGraph *);//函数申明 //int CreateUDG (MGraph *);//函数申明 int CreateUDN (MGraph *);//函数申明 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; case '4': CreateUDN(G);break;//此处G为指针 default :return ERROR; } return OK; } int CreateUDN (MGraph *G1){ int i,j,k; int v1,v2;//邻接点变量用于表示变或弧 printf ("Please enter values for G.vexnum and G.arcnum.\n"); scanf ("%d%d",&G1->vexnum,&G1->arcnum); printf ("Please enter value for vertexs.\n"); for (i=0;i<G1->vexnum;i++) scanf("%d",&G1->vexs[i]); for (i=0;i<MAX_VERTEX_NUM;i++){ for (j=0;j<MAX_VERTEX_NUM;j++) G1->arcs[i][j].adj = 0;
}//初始化边矩阵,网则初始化为无穷大INFINITY,图则初始化为0 printf("Please enter ArcCell,example:<1,2>,enter '1,2'\n"); for (k=1;k<=G1->arcnum;k++){ scanf ("%d,%d",&v1,&v2); i=LocateVex (G1,v1);//LocataVex定位,G1为指针类型 j=LocateVex (G1,v2); G1->arcs[i][j].adj = 1; G1->arcs[j][i] = G1->arcs[i][j]; } return OK; }
2.DFSTraverse操作
Status DFSTraverse(MGraph G){ Status DFS (MGraph, int );//函数申明 int v; for (v=0; v<G.vexnum; v++) visited[v]=0; for (v=0; v<G.vexnum; v++){ if (visited[v]==0) DFS (G, v); } return OK; } Status DFS(MGraph G, int v){ int FirstAdjVex (MGraph, int ); int NextAdjvex (MGraph, int, int ); int w; visited[v]=1; printf ("%3d",G.vexs[v]); for(w=FirstAdjVex (G, v);w>0;w=NextAdjvex (G, w, v)){ if (visited[w]==0) DFS (G, w); } return OK; } int NextAdjvex (MGraph G, int v, int w) { int i,t=0; for (i=w+1; i<G.vexnum; i++) { if (G.arcs[v][i].adj==1 && visited[i]==0) { t=i; break; } else t=0; } return t; } int FirstAdjVex (MGraph G, int v){ int i,t=0; for (i=0; i<G.vexnum; i++){ if(G.arcs[v][i].adj==1&&visited[i]==0){ t=i; break; } else t=0; } return t; }
3.BFSTraverse操作,需要借助循环队列
3.1循环队列存储结构以及基本操作
typedef struct{ QElemType *base; int front; int rear; }SqQueue; Status InitQueue_Sq(SqQueue *Q){ Q->base=(QElemType *)malloc(maxsize*sizeof(QElemType)); if(!Q->base)exit(OVERFLOW); Q->front=Q->rear=0; return OK; } Status EnQueue_Sq(SqQueue *Q,QElemType e){ if((Q->rear+1)%maxsize==Q->front)exit(0); Q->base[Q->rear]=e; Q->rear=(Q->rear+1)%maxsize; return OK; } Status DeQueue_Sq(SqQueue *Q,QElemType *e){ if(Q->rear==Q->front)exit(0); *e=Q->base[Q->front]; Q->front=(Q->front+1)%maxsize; return OK; } Status GetFront_Sq(SqQueue Q,QElemType *e){ if(Q.rear==Q.front)return ERROR; else *e=Q.base[Q.front]; return OK; }
3.2BFS操作
Status BFSTraverse (MGraph G){ int v,a,i; SqQueue Q; for (v=0; v<G.vexnum; v++) visited[v]=0;//标志数组初始化 InitQueue_Sq (&Q); for (v=0; v<G.vexnum; v++) { if (visited[v] == 0) { visited[v] = 1; printf ("%3d",G.vexs[v]); EnQueue_Sq (&Q,v); } while(Q.rear!=Q.front){ GetFront_Sq (Q,&a); for (i=0; i<G.vexnum; i++){ if (G.arcs[v][i].adj==0) continue; if (visited[v] == 1) continue; else { visited[i] = 1; printf ("%3d",G.vexs[i]); EnQueue_Sq (&Q,i); } } DeQueue_Sq (&Q,&a); } } }
最后一部分:main函数
int main (){ int i,j; MGraph G; CreateGraph (&G); for(i=0;i<G.vexnum;i++) printf ("%3d",G.vexs[i]); printf ("\n"); for (i=0; i<G.vexnum; i++){ for (j=0; j<G.vexnum; j++){ printf ("%2d",G.arcs[i][j]); if (j==G.vexnum-1) printf("\n"); } } DFSTraverse(G); printf("\n"); BFSTraverse (G); system("pause"); return OK; }
程序演示截图
相关文章推荐
- 【数据结构实验】图的深度优先/广度优先遍历
- 对树形结构数据进行广度优先/深度优先遍历
- 图:存储结构、深度优先遍历以及广度优先遍历
- 图的邻接矩阵表示以及深度、广度优先遍历
- python实现数据结构图-广度深度遍历
- 数据结构之深度优先,广度优先遍历
- 数据结构-图-as3实现-有向图 图存储(邻接矩阵),广度深度遍历
- C++数据结构之图的深度和广度遍历
- 【数据结构】图Graph的邻接矩阵,邻接表及深度、广度遍历
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
- C语言以邻接矩阵为存储结构的图的构造以及广度优先,深度优先遍历
- 数据结构之(图之)深度遍历和广度遍历
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- 数据结构之(图)之深度遍历及广度遍历
- C语言以邻接表为存储结构的图的构造以及广度优先,深度优先遍历
- 数据结构:图的遍历--深度优先、广度优先
- 【数据结构与算法】图的深度与广度遍历
- 数据结构:图的遍历--深度优先、广度优先
- 数据结构——图的深度/广度优先遍历