#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100intDfsVist[MAXSIZE];
intBfsVist[MAXSIZE];
typedefstructEdgeLink{
intLocal; structEdgeLink*next; }Edge,*ELINK;
typedefstructVertexLink{
intVertex; ELINKFirstNode; }Vertex[MAXSIZE],*VLINK;
typedefstructMyGraph{
intVnum; intEnum; VertexList; }MyGraph;
voidCreateLink(MyGraph*T)
{
inti,j;
intv1,v2;
ELINKp; ELINKq;
printf("请输入顶点数和边数(空格隔开):\n");
scanf("%d%d",&(T->Vnum),&(T->Enum));
for(i=0;i<T->Vnum;i++)
{
printf("请输入第%d个顶点的信息:\n",i+1);
scanf("%d",&(T->List[i].Vertex)); T->List[i].FirstNode=NULL; }
printf("---------------------------\n");
for(i=0;i<T->Vnum;i++)
{
printf("顶点下标为:%d 顶点数据为: %d\n",i,T->List[i].Vertex);
}
printf("---------------------------\n");
for(i=0;i<T->Enum;i++)
{
printf("请输入两个连接顶点下标(空格隔开):\n");
scanf("%d%d",&v1,&v2);
getchar();
q= (ELINK)malloc(sizeof(Edge)); q->Local=v2; q->next=NULL; if(!T->List[v1].FirstNode){ T->List[v1].FirstNode=q;
}else{
p=T->List[v1].FirstNode; while(p->next) {
p=p->next;
}
p->next=q; }
q= (ELINK)malloc(sizeof(Edge)); q->Local=v1; q->next=NULL; if(!T->List[v2].FirstNode){ T->List[v2].FirstNode=q;
}else{
p=T->List[v2].FirstNode; while(p->next) {
p=p->next;
}
p->next=q; }
}
}
voidPrintLink(MyGraph*S)
{
MyGraph*T=S;
ELINKQ; inti;
printf("打印邻接表结果如下:\n");
for(i=0;i<T->Vnum;i++)
{
Q=T->List[i].FirstNode; printf("%d--->",i);
while(1)
{
if(Q==NULL)
{
putchar('\n');
break;
}
printf("------->%3d",Q->Local);
Q=Q->next; }
}
putchar('\n');
}
voidDFS_Link(MyGraph*T,intn)
{
inti,j;
ELINKq; if(n<0||n>=T->Vnum)
{
printf("输入有误\n");
return;
}
DfsVist[n] =1; printf(" %d",T->List[n].Vertex);
q=T->List[n].FirstNode; while(q!=NULL)
{
if(DfsVist[q->Local]!=1)
{
j=q->Local;
DFS_Link(T,j);
}
q=q->next;
}
}
voidInit_DFSLINK(MyGraph*Q)
{
inti;
for(i=0;i<Q->Vnum;i++)
{
DfsVist[i] =0;
}
for(i=0;i<Q->Vnum;i++)
{
if(!DfsVist[i])
{
DFS_Link(Q,i); }
}
putchar('\n');
}
voidBFS(MyGraph*S,intt)
{
ELINKP; inti;
intv; intQueue[MAXSIZE];
intfront=0; intrear=0; printf("%d ",S->List[t].Vertex); BfsVist[t] =1; rear= (rear+1)%MAXSIZE; Queue[rear] =t; while(front!=rear) {
front= (front+1)%MAXSIZE; v=Queue[front]; P=S->List[v].FirstNode; while(P!=NULL)
{
if(BfsVist[P->Local] ==0)
{
printf("%d ",P->Local+1); BfsVist[P->Local] =1; rear= (rear+1)%MAXSIZE; Queue[rear] =P->Local; }
P=P->next; }
}
}
voidInit_BFS(MyGraph*S)
{
inti;
for(i=0;i<S->Vnum;i++)
{
BfsVist[i] =0; }
for(i=0;i<S->Vnum;i++)
{
if(BfsVist[i]==0)
BFS(S,i);
}
}
intmain()
{
MyGraph*S;
S= (MyGraph*)malloc(sizeof(MyGraph));
CreateLink(S);
PrintLink(S);
printf("深度遍历搜索为:\n");
Init_DFSLINK(S);
printf("广度遍历搜索为:\n");
Init_BFS(S);
return0;
}