#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNODE 30//最大节点数
int graph[MAXNODE][MAXNODE]={{0,1,1,0,0,0},{1,0,0,1,0,0},{1,0,0,0,0,1},\
{0,1,0,0,1,0},{0,0,0,1,0,0},{0,0,1,0,0,0}};//默认无向图
char sign[MAXNODE]={'a','b','c','d','e','f'};//默认节点标志
int num_node=6,num_edge=7;//节点数 边数
int queue[MAXNODE],stack[MAXNODE],stack_2[MAXNODE];//队列 栈
int *end_queue=NULL,*end_stack=NULL,*end_stack_2=stack_2;//队列指针 栈指针
void in_queue(int a);//入队函数
int out_queue();//出队函数
int insearch_queue(int i);//查找队列
void display_queue();//显示队列
void in_stack(int a);//入栈函数
int out_stack();//出栈函数
int insearch_stack(int i);//查找栈
void display_stack();//显示栈
void main()
{
/* // There are declarations!
void display_graph();//显示无向图
void init(int choose);//初始化函数
void build();//建立无向图
void DFS(char a);//深度优先
void BFS(char a);//广度优先
*/
int i,j,k;
int choose;
char c;
while (choose!=1 && choose!=2)
{
printf("**********************************************************\n");
printf(" 1、构建无向路径图 2、使用默认无向路径图 3、退出程序\n");
printf("**********************************************************\n");
printf("请选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
init(choose);
build();
break;
case 2:
init(choose);
break;
case 3:exit(0);
break;
default:printf("请输入1-3!\n");
break;
}
}
display_graph();
while (1)
{
printf("******************************************\n");
printf(" 1、广度优先 2、深度优先 3、退出程序\n");
printf("******************************************\n");
printf("请选择:");
scanf("%d",&choose);
getchar();
switch(choose)
{
case 1:
printf("输入起点:");
scanf("%c",&c);
getchar();
BFS(c);
break;
case 2:
printf("输入起点:");
scanf("%c",&c);
getchar();
DFS(c);
break;
case 3:exit(0);
break;
default:printf("请输入1-3!\n");
break;
}
}
}
void init(int choose)
{
int i,j;
if (choose==1)
{
for (i=0;i<MAXNODE;i++)
{
for (j=0;j<MAXNODE;j++)
{
graph[i][j]=0;
}
}
}
for (i=0;i<20;i++)
{
queue[i]=-1;
}
for (i=0;i<20;i++)
{
stack_2[i]=stack[i]=-1;
}
}
void build()
{
void link(char a,char b);//连接节点
int i,j;
char a,b;
printf("请输入顶点数,边数(用逗号分开,例如:8,5):");//输入节点数边数
scanf("%d,%d",&num_node,&num_edge);
getchar();
for (i=0;i<num_node;i++)//输入节点标志
{
printf("输入NO.%d标志(一个字符):",i+1);
scanf("%c",&sign[i]);
getchar();
}
printf("请输入边(用逗号分开,例如:a,b):");
for (i=0;i<num_edge;i++)//输入边
{
printf("输入第%d条边:",i+1);
scanf("%c,%c",&a,&b);
getchar();
printf("%c %c\n",a,b);
link(a,b);
}
}
void link(char a,char b)
{
int a_num,b_num,i;
for (i=0;i<num_node;i++)
{
if (a==sign[i])
{
a_num=i;
break;
}
}
for (i=0;i<num_node;i++)
{
if (b==sign[i])
{
b_num=i;
break;
}
}
graph[a_num][b_num]=1;
graph[b_num][a_num]=1;
}
void display_graph()
{
int i,j;
printf("构建的无向图如下:\n ");
for (j=0;j<num_node;j++)
{
printf("%-2c",sign[j]);
}
printf("\n");
for (i=0;i<num_node;i++)
{
printf("%-2c",sign[i]);
for (j=0;j<num_node;j++)
{
printf("%-2d",graph[i][j]);
}
printf("\n");
}
}
void DFS(char a)
{
int i,a_num,j,repect;
for (i=0;i<num_node;i++)//字母对应数字行
{
if (a==sign[i])
{
a_num=i;
break;
}
}
in_stack(a_num);
for (j=0;j<30;j++)
{
for(i=0;i<num_node;i++)
{
if(graph[*end_stack][i]==1)
{
if (insearch_stack(i)!=1)
{
in_stack(i);
i=-1;
}
}
}
if (out_stack()==1)
{
break;
}
}
printf("深度优先:");
for (i=0;stack_2[i]!=-1;i++)
{
printf("%c ",sign[stack_2[i]]);
}
printf("\n\n");
}
void BFS(char a)
{
int a_num,i,j,repect;
int *p;
for (i=0;i<num_node;i++)//找出字母对应行
{
if (a==sign[i])
{
a_num=i;
break;
}
}
in_queue(a_num);
for (j=0;j<30;j++)
{
for(i=0;i<num_node;i++)
{
if(graph[*end_queue][i]==1)
{
if (insearch_queue(i)!=1)
{
in_queue(i);
}
}
}
if (out_queue()==1)
{
break;
}
}
p=queue;
printf("广度优先:");
for (i=num_node;i>0;i--)
{
printf("%c ",sign[*(p+i-1)]);
}
printf("\n\n");
}
void in_queue(int a)
{
int *p;
if (end_queue==NULL)
{
end_queue=queue;
*end_queue=a;
}
else
{
for (p=queue;*p!=-1;p++)
{
}
p--;
for (;;p--)
{
*(p+1)=*p;
if (p==queue)
{
*p=a;
break;
}
}
end_queue++;
}
// printf("in:");
//display_queue();
}
int out_queue()
{
if (end_queue!=queue)
{
end_queue--;
// printf("out:");
// display_queue();
return 0;
}
else
{
end_queue=NULL;
// printf("out:");
// display_queue();
return 1;
}
}
int insearch_queue(int i)
{
int j;
for(j=0;j<20;j++)
{
if(i==queue[j])
{
return 1;
}
}
return 0;
}
void display_queue()
{
int *p,i;
p=queue;
for (i=0;i<20;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
void in_stack(int a)
{
*end_stack_2=a;
end_stack_2++;
if (end_stack==NULL)
{
end_stack=stack;
*end_stack=a;
// printf("in:");
// display_stack();
}
else
{
end_stack++;
*end_stack=a;
// printf("in:");
// display_stack();
}
}
int out_stack()
{
if (end_stack!=stack)
{
*end_stack=-1;
end_stack--;
// printf("out:");
// display_stack();
return 0;
}
else
{
*end_stack=-1;
end_stack=NULL;
// printf("out:");
// display_stack();
return 1;
}
}
int insearch_stack(int i)
{
int j;
for(j=0;j<20;j++)
{
if(i==stack_2[j])
{
return 1;
}
}
return 0;
}
void display_stack()
{
int *p,i;
p=stack;
for (i=0;i<20;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
深度、广度优先遍历算法C实现
最新推荐文章于 2021-05-24 09:25:14 发布