//实验要求: //用邻接表存储一个无向图, //深度优先,广度优先遍历 //拓扑排序 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int status ; struct ljno //邻接表数据类型 { int x; //存储数据 ljno* next; }ss; struct ALGraph { ljno *data ; int vexnum,exnum;//顶点个数和边的个数 }; status InitGraph(ALGraph &G) { printf("请输入顶点的总个数:"); scanf("%d",&G.vexnum); if((G.data=(ljno*)malloc(sizeof(ljno)*(G.vexnum+1)))==NULL) //下标为0的空间舍去不用 exit(-1); for(int i=1;i<=G.vexnum;++i) G.data[i].x=i,G.data[i].next=NULL; } status insert(ALGraph &G,int a,int b) //将数据 b 插入第a 行 //升序插入 { ljno *p,*q,*t; q=&G.data[a]; p=q->next;// printf("----\n"); while(p) { if(b==(p->x)) break; else if(b<(p->x)) { t=(ljno*)malloc(sizeof(ljno)); if(NULL==t) exit(-1); q->next=t; t->x=b; t->next=p; } p=p->next; q=q->next; } if(NULL==p&&b!=q->x) { t=(ljno*)malloc(sizeof(ljno)); if(NULL==t) exit(-1); q->next=t; t->x=b; t->next=p; } } status CreatGraph(ALGraph &G) //创建邻接矩阵 { printf("请输入边的总条数:"); scanf("%d",&G.exnum) ; for(int a,b,i=1;i<=G.exnum;++i) { scanf("%d%d",&a,&b); insert(G,a,b); insert(G,b,a); // 无序图!!! } } void DFS(ALGraph G,int v,int visit[]) // 深度优先遍历 { ljno* p=&G.data[v]; for(p=p->next;p;p=p->next) { if(!visit[p->x]) { visit[p->x]=1; printf("->%d",p->x); DFS(G,p->x,visit); } } } void DFSTraver(ALGraph G,int visit[]) { for(int i=1;i<=G.vexnum;++i) { if(!visit[i]) { printf("->%d",i); visit[i]=1; } DFS(G,i,visit); } printf("\n"); } struct Queue { int* base; int front; int real; //指向队尾的上一个位置 }Q; status initQueue(Queue &Q) { Q.base=(int *)malloc(100*sizeof(int)); if(!Q.base) { printf(" 内存分配失败,程序终止!\n"); exit(-1); } Q.front=Q.real=0; return 1; } bool emptyQueue(Queue Q) { if(Q.front==Q.real) return true; return false; } void Enqueue(Queue &Q,int v) // 入队 { //printf("入队元素为:%d\n",v); Q.base[Q.real]=v; Q.real++; } void Dequeue(Queue &Q,int &u) //出队 { if(!emptyQueue(Q)) { u=Q.base[Q.front]; Q.front++; } //printf("删除元素为:%d\n",u); } void printqueue(Queue Q) { int k=Q.front; printf("\n****************\n"); while(k!=Q.real) { printf(" %d",Q.base[k]); k++; }printf("\n****************\n"); } void BFS(ALGraph G,int v,int visit[],Queue &Q) // 广度优先遍历 { int u; //initQueue(Q); !!!!!! 出错位置 ljno* p=&G.data[v]; for(p=p->next;p;p=p->next) { if(!visit[p->x]) { visit[p->x]=1; Enqueue(Q,p->x); //printqueue(Q) ; printf("->%d",p->x); } } //vv(Q); while(!emptyQueue(Q)) { Dequeue(Q,u); //printqueue(Q) ; BFS(G,u,visit,Q); } } void BFSTraver(ALGraph G,int visit[]) { for(int i=1;i<=G.vexnum;++i) { if(!visit[i]) { visit[i]=1; printf("->%d",i); } initQueue (Q); BFS(G,i,visit,Q); } printf("\n"); } /*void vi(ALGraph G) //输出 邻接表 { for(int i=1;i<=G.exnum;++i) { ljno* p=&G.data[i]; while(p) { printf("%d,",p->x); p=p->next; } printf("\n"); } }*/ int main() { ALGraph G; InitGraph(G); int visit[100]; memset(visit,0,sizeof(visit)); CreatGraph(G); printf("深度优先搜索:\n"); DFSTraver(G,visit); //vi(G); memset(visit,0,sizeof(visit)); printf("广度优先搜索:\n") ; BFSTraver(G,visit); return 0; }
时间: 2024-10-06 15:42:21