/*【基本要求】
以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集*/ //________头文件___________________________________________________________ #include<iostream> using namespace std;
//_______无向图的邻接多重表存储表示p166____________________________________ const int NUM=20;
const int Data_Num=2;//每个顶点所表示的数据 typedef char VertexType[Data_Num];
/*
#define MAX_VERTEX_NUM 20 typedef struct emnu{int unvisited;int visited;} VisitIf;
typedef struct InfoType{}; typedef struct VertexType{}; */
typedef struct EBox{ int mark; //访问标记
int ivex,jvex; //该边依附的2个顶点位置 struct EBox *ilink,*jlink; //分别指向依附这2个顶点的下一条边
//InfoType *info; //该边信息指针 }EBox;
typedef struct VexBox { VertexType data; EBox *firstedge; //指向第一条依附该顶点的边 }VexBox;
typedef struct{ VexBox adjmulist[NUM];
int vexnum,edgenum; //无向图的当前顶点和边数 }AMLGraph;
//_________________________队列的定义_____________________________________ typedef int QElemType; typedef struct QNode { QElemType data; struct QNode *next;
}QNode,*QueuePtr;
typedef struct { QueuePtr front,rear;
}LinkQueue;
//_____________________寻找指定数据______________________________________________ //寻找输入的数据在图中的位置,若不存在则返回-1
int LocateVex(AMLGraph G,VertexType u) { int i; for(i=0;i<G.vexnum;i++) if(strcmp(u,G.adjmulist[i].data)==0) return i; return -1; }
//________________________构造无向图_______________________________________________ //采用邻接多重表存储表示,构造无向图G
int CreateGraph(AMLGraph &G) { cout<<"请输入图的顶点数: "; cin>>G.vexnum;//输入图当前的顶点数 cout<<"请输入图的弧数: "; cin>>G.edgenum;//输入图当前的边数 cout<<"请输入每个顶点所对应的值:"<<endl; for(int i=0;i<G.vexnum;i++) { cin>>G.adjmulist[i].data;//输入顶点值 G.adjmulist[i].firstedge=NULL;//初始化指针 } VertexType v1,v2; EBox *p; int j;//每条弧所关联的两个结点 for(int k=0;k<G.edgenum;k++) { cout<<"请输入第"<<k+1<<"弧的始点和终点:"; cin>>v1;cin>>v2; i=LocateVex(G,v1);j=LocateVex(G,v2);/
/确定v1和v2在图G中的位置 p=(EBox *)malloc(sizeof(EBox)); //对弧结点进行赋值 (*p).mark=0; (*p).ivex=i; (*p).jvex=j; (*p).ilink=G.adjmulist[i].firstedge; (*p).jlink=G.adjmulist[j].firstedge; G.adjmulist[i].firstedge=G.adjmulist[j].firstedge=p; } return 1; }
//返回V的值
VertexType* GetVex(AMLGraph G,int v) { if(v>G.vexnum||v<0) exit(0); return &G.adjmulist[v].data; }
//返回V的第一个邻接点的序号,若没有则返回-1
int FirstAdjVex(AMLGraph G,VertexType v) { int i; i=LocateVex(G,v); if(i<0) return -1; if(G.adjmulist[i].firstedge)//V有邻接结点 if(G.adjmulist[i].firstedge->ivex==i) return G.adjmulist[i].firstedge->jvex; else return G.adjmulist[i].firstedge->ivex; else return -1; }
//返回V的(相对于W)的下一个邻接结点的序号,若W是V的最后一个邻接结点,则返回-1
int NextAdjVex(AMLGraph G,VertexType v,VertexType w)
{
int i,j; EBox *p;
i=LocateVex(G,v); j=LocateVex(G,w); if(i<0||j<0) return -1;
p=G.adjmulist[i].firstedge; while(p) if(p->ivex==i&&p->jvex!=j) p=p->ilink; else if(p->jvex==i&&p->ivex!=j) p=p->jlink; else break; if(p&&p->ivex==i&&p->jvex==j) { p=p->ilink; if(p&&p->ivex==i) return p->jvex; else if(p&&p->jvex==i) return p->jvex; } if(p&&p->ivex==j&&p->jvex==i) { p=p->jlink; if(p&&p->ivex==i) return p->jvex; else if(p&&p->jvex==i) return p->jvex; } return -1;
}
//__________________________队列的操作_________________________________________
int visite[NUM];//访问标志数组 int (*VisitFunc)(VertexType v);
void DFS(AMLGraph G,int v) {
}
int j; EBox *p;
VisitFunc(G.adjmulist[v].data); visite[v]=1;//该顶点已经被访问 p=G.adjmulist[v].firstedge; while(p) { j=p->ivex==v?p->jvex:p->ivex; if(!visite[j]) DFS(G,j); p=p->ivex==v?p->ilink:p->jlink; }
//________深度优先搜索_______________________________________________________ void DFSTraverse(AMLGraph G,int(*Visit)(VertexType)) { int v,start; VisitFunc=Visit; for(v=0;v<G.vexnum;v++) visite[v]=0; cout<<"请输入你要开始进行查找的位置:"; cin>>start; cout<<"按广深度优先搜索的结果是:"<<endl; for(v=start;v<G.vexnum;v++) { if(v>=G.vexnum) { for(v=0;v<G.vexnum;v++) { if(!visite[v]) DFS(G,v); }//内层for }//if else { if(!visite[v]) DFS(G,v); }//else }//外层for cout<<"\b\b\b ";
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍在线全文阅读。
相关推荐: