深搜,广搜

来源:互联网 发布:控制系统仿真软件 编辑:程序博客网 时间:2024/05/01 04:14
//实验要求: //用邻接表存储一个无向图,//深度优先,广度优先遍历//拓扑排序 #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;}

0 0
原创粉丝点击