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