当前位置: 首页 > 工具软件 > 泛搜 > 使用案例 >

深搜,广搜

寿阳华
2023-12-01
//实验要求: 
//用邻接表存储一个无向图,
//深度优先,广度优先遍历
//拓扑排序
 #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;
}

 

 类似资料: