#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
#define INF 0x3f3f3f3f
typedef char VertexType[10];
typedef struct edgenode
{
int adjvex;
int weight;
struct edgenode * nextarc;
} ArcNode;
typedef struct vexnode
{
VertexType data;
ArcNode * firstarc;
}VHeadNode;
typedef struct
{
int n,e;
VHeadNode adjlist[MAXVEX];
}AdjGraph;
void CreateGraph(AdjGraph * &G,int A[][MAXVEX],int n,int e)//创立
{
int i,j;
ArcNode * p;
G=(AdjGraph *)malloc(sizeof(AdjGraph));
G->n=n;G->e=e;
for(i=0;i<G->n;i++)
G->adjlist[i].firstarc=NULL;
for(i=0;i<G->n;i++)
for(j=G->n-1;j>=0;j--)
if(A[i][j]>0&&A[i][j]<INF)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->weight=A[i][j];
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
}
void DestroyGraph(AdjGraph *&G)//销毁
{
int i;
ArcNode *pre,*p;
for(i=0;i<G->n;i++)
{
pre=G->adjlist[i].firstarc;
if(pre!=NULL){
p=pre->nextarc;
while (p!=NULL)
{
free(pre);
pre=p;p=p->nextarc;
}
free(pre);
}
}
free(G);
}
void DispGraph(AdjGraph *G)//输出图
{
ArcNode *p;
int i;
for(i=0;i<G->n;i++)
{
printf("[%2d]",i);
p=G->adjlist[i].firstarc;
if(p!=NULL)
printf("->");
while(p!=NULL){
printf("%d(%d)",p->adjvex,p->weight);
p=p->nextarc;
}
printf("\n");
}
}
int visited[MAXVEX]={0}; //全局变量
void DFS(AdjGraph *G,int v)
{ int w; ArcNode *p;
printf("%d ",v); //访问v顶点
visited[v]=1;
p=G->adjlist[v].firstarc; //找v的第一个相邻点
while (p!=NULL) //找v的所有相邻点
{ w= p->adjvex; //顶点v的相邻点w
if (visited[w]==0) //顶点w未访问过
DFS(G,w); //从w出发深度优先遍历
p=p->nextarc; //找v的下一个相邻点
}
}
void BFS(AdjGraph *G,int vi)
{ int i,v,visited[MAXVEX]; ArcNode *p;
int Qu[MAXVEX],front=0,rear=0; //定义一个循环队列Qu
for (i=0;i<G->n;i++) visited[i]=0; //visited数组置初值0
printf("%d ",vi); //访问初始顶点
visited[vi]=1;
rear=(rear+1)%MAXVEX; Qu[rear]=vi; //初始顶点进队
while (front!=rear) //队不为空时循环
{ front=(front+1) % MAXVEX;
v=Qu[front]; //出队顶点v
p=G->adjlist[v].firstarc; //查找v的第一个相邻点
while (p!=NULL) //查找v的所有相邻点
{ if (visited[p->adjvex]==0) //未访问过则访问之
{ printf("%d ",p->adjvex); //访问该点并进队
visited[p->adjvex]=1;
rear=(rear+1) % MAXVEX;
Qu[rear]=p->adjvex;
}
p=p->nextarc; //查找v的下一个相邻点
}
}
}
void main(){
AdjGraph *G;
int n=5,e=5,i;
int A[MAXVEX][MAXVEX]={{0,1,1,0,0},{1,0,1,1,0},{1,1,0,0,1},{0,1,0,0,0},{0,0,1,0,0}};
CreateGraph(G,A,n,e);
printf("图G的存储结构:\n");DispGraph(G);
printf("DFS:");DFS(G,0);printf("\n");
printf("BFS:");BFS(G,0);printf("\n");
DestroyGraph(G);
}