cout<<endl; }
//队列的初始化
int InitQueue(LinkQueue *Q) { (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if(!(*Q).front) exit(0); (*Q).front->next=NULL; return 1;
}
//判断队列是否为空,为空则返回1,否则返回0
int QueueEmpty(LinkQueue Q) { if(Q.front==Q.rear) return 1; else return 0; }
//向队列中插入元素
int EnQueue(LinkQueue *Q,QElemType e) { QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(0); p->data=e; p->next=NULL; (*Q).rear->next=p; (*Q).rear=p; return 1; }
//若队列不为空,则删除对头元素,并返回1;否则返回 0
int DeQueue(LinkQueue *Q,QElemType *e) { QueuePtr p; if((*Q).front==(*Q).rear) return 0; p=(*Q).front->next; *e=p->data; (*Q).front->next=p->next;
if((*Q).rear==p) (*Q).rear=(*Q).front; free(p); return 1; }
/**
Boolean visited[MAX]; //访问标志数组 Status(*VisitFunc)(int v); //函数变量 void DFSTraverse(Graph G,Status(*Visit)(int v))
{ //对图G做深度优先遍历 VisitFunc=Visit //使用全局变量VisitFunc,使DFS不必设函数指针参数 for(v=0;v<G.vexnum;++v)visited[v]=FALSE; //访问标志数组初始化 for(v=0;v<G.vexnum;++v) if(!visited[v]) DFS(G,v); //对尚未访问的顶点调用DFS }
void DFS(Graph G,int v) { //从第V个顶点出发递归地深度优先遍历图G visited[v]=TRUE;VisitFunc(v);//访问第v个顶点 for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w) if(!visited[w]) DFS(G,w); } **/
//_________广度优先搜索_____________________________________________________ //广度优先非递归遍历图G
void BFSTraverse(AMLGraph G,int(*Visit)(VertexType)) { int u,v,w,start=0; VertexType w1,u1; LinkQueue Q; for(v=0;v<G.vexnum;v++) visite[v]=0; InitQueue(&Q); cout<<"请输入你要开始进行查找的位置:"; cin>>start; cout<<"按广度优先搜索的结果是:"<<endl; for(v=start;v<G.vexnum;v++)
{ if(!visite[v]) { visite[v]=1; Visit(G.adjmulist[v].data); EnQueue(&Q,v);//v入队列 while(!QueueEmpty(Q)) { DeQueue(&Q,&u); strcpy(u1,*GetVex(G,u)); for(w=FirstAdjVex(G,u1);w>=0;w=NextAdjVex(G,u1,strcpy(w1,*GetVex(G,w)))) if(!visite[w]) { visite[w]=1; Visit(G.adjmulist[w].data); EnQueue(&Q,w); } } } }//for InitQueue(&Q); for(v=0;v<start;v++) { if(!visite[v]) { visite[v]=1; Visit(G.adjmulist[v].data); EnQueue(&Q,v);//v入队列 while(!QueueEmpty(Q)) { DeQueue(&Q,&u); strcpy(u1,*GetVex(G,u)); for(w=FirstAdjVex(G,u1);w>=0;w=NextAdjVex(G,u1,strcpy(w1,*GetVex(G,w)))) if(!visite[w]) { visite[w]=1; Visit(G.adjmulist[w].data); EnQueue(&Q,w); } } }
}//for cout<<"\b\b\b "; cout<<endl; }
//把边的访问标记设置为0,即未被访问
void MarkUnVisited(AMLGraph G) { int i; EBox *p; for(i=0;i<G.vexnum;i++) { p=G.adjmulist[i].firstedge; while(p) { p->mark=0; if(p->ivex==i) p=p->ilink; else p=p->jlink; } } }
/**
void BFSTraverse(Graph G,Status(* visit)(int v)){
//按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited for(v=0;v<G.vexnum;++v) visited[v]=FALSE; InitQueue(Q) //置空的辅助队列Q for(v=0;v<G.vexnum;++V) if(!visited[v]){ //v尚未访问 visited[v]=TRUE;Visit(v); EnQueue(Q,v); //v入队列 while(!QueueEmpty(Q)){ DeQueue(Q,v); //对头元素出队并置为u for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
if(!Visited[w]){ //w为u的尚未访问的邻接顶点 Visited[w]=TRUE; Visit(w); EnQueue(Q,W); }//if }//while }//if
}//BFSTraverse **/
//显示构造的无向图(包括定点数、顶点、边数、边) void Display(AMLGraph G) {
int i; EBox *p; MarkUnVisited(G); cout<<G.vexnum<<"个顶点:"; for(i=0;i<G.vexnum;i++) cout<<G.adjmulist[i].data<<" "; cout<<"; "<<G.edgenum<<"条边:"<<endl; for(i=0;i<G.vexnum;i++) { p=G.adjmulist[i].firstedge; while(p) if(p->ivex==i) { if(!p->mark) { cout<<G.adjmulist[i].data<<"-->"<<G.adjmulist[p->jvex].data<<" "; p->mark=1;//已经被访问过了 } p=p->ilink; } else { if(!p->mark) { cout<<G.adjmulist[p->ivex].data<<"-->"<<G.adjmulist[i].data<<" "; p->mark=1;//已经被访问过了 } p=p->jlink; }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍(2)在线全文阅读。
相关推荐: