无向图的构建及广度优先遍历---邻接表实现

来源:互联网 发布:java分割字符串 编辑:程序博客网 时间:2024/06/05 21:18

相关问题及基本理论已于前面的几篇博客中说明,现仅仅给出code。


code

/*无向图的构建(邻接表实现)及其广度优先遍历*/#include <stdio.h>#include <stdlib.h>#define MAX_VERTEX_NUM 30typedef char VtType;bool visted[MAX_VERTEX_NUM];//遍历标记typedef struct chain{int vid;//邻接表表头索引struct chain* next;}Queue;//先入先出队列Queue* head=NULL;typedef struct ARC{int adj;struct ARC* nextarc;}ArcNode;//表节点typedef struct{VtType data;ArcNode* firstarc;}VNODE,VList[MAX_VERTEX_NUM];//一维表头typedef struct{VList vertices;int vexnum,arcnum;}VLGraph;//邻接表图void AddArc(VLGraph &G,int m,int n)//表中添加m结点到n结点的路径{ArcNode* np,*curp,*save;np=(ArcNode*)malloc(sizeof(ArcNode));np->adj=n;np->nextarc=NULL;curp=G.vertices[m].firstarc;if(curp==NULL){G.vertices[m].firstarc=np;//第一个节点为空直接添加}else{while(curp->adj < np->adj)//不为空时,后移实现节点索引的递增排列{save=curp;curp=curp->nextarc;if(curp==NULL){break;}}if(curp==NULL){save->nextarc=np;}else{if(curp==G.vertices[m].firstarc){save=G.vertices[m].firstarc;G.vertices[m].firstarc=np;np->nextarc=save;}else{save->nextarc=np;np->nextarc=curp;}}}}void CreateG(VLGraph &G)//创建无向图{int i;G.vexnum=8;G.arcnum=9;for(i=0;i<G.vexnum;i++){G.vertices[i].firstarc=NULL;G.vertices[i].data=97+i;}AddArc(G,0,1);AddArc(G,1,0);AddArc(G,3,1);AddArc(G,1,3);AddArc(G,3,7);AddArc(G,7,3);AddArc(G,4,7);AddArc(G,7,4);AddArc(G,4,1);AddArc(G,1,4);AddArc(G,0,2);AddArc(G,2,0);AddArc(G,2,5);AddArc(G,5,2);AddArc(G,2,6);AddArc(G,6,2);AddArc(G,5,6);AddArc(G,6,5);return;}void ShowVlist(VLGraph G)//邻接表输出{int i;ArcNode* curp;printf("The adjacent list is:\n");for(i=0;i<G.vexnum;i++){printf("%c",G.vertices[i].data);curp=G.vertices[i].firstarc;while(curp!=NULL){printf("-->%d",curp->adj);curp=curp->nextarc;}printf("-->NULL\n");}return;}void BFS(VLGraph G,int v)//广度优先遍历递归函数{ArcNode* curp;Queue* temp,*newnode;if(visted[v]!=true){printf("%c ",G.vertices[v].data);visted[v]=true;}curp=G.vertices[v].firstarc;while(curp!=NULL){if(visted[curp->adj]!=true){printf("%c ",G.vertices[curp->adj].data);visted[curp->adj]=true;if(head==NULL){head=(Queue*)malloc(sizeof(Queue));head->vid=curp->adj;head->next=NULL;}else{temp=head;while(temp->next=NULL){temp=temp->next;}newnode=(Queue*)malloc(sizeof(Queue));newnode->vid=curp->adj;newnode->next=NULL;temp->next=newnode;}}curp=curp->nextarc;}while(head!=NULL){temp=head;head=head->next;BFS(G,temp->vid);free(temp);}return;}void BFSTraverse(VLGraph G)//广度优先遍历接口函数{int i;printf("The breadth traverse result is:\n");for(i=0;i<G.vexnum;i++){visted[i]=false;}for(i=0;i<G.vexnum;i++){if(visted[i]==false){BFS(G,i);}}return;}int main(void){VLGraph G;CreateG(G);ShowVlist(G);printf("\n");BFSTraverse(G);printf("\n\n");system("pause");return 0;}


1 0