#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define MAXQSIZE 100
#define OK 1
typedef char VertexType;
typedef char QElemType;
typedef int InfoType;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
typedef struct SqQueue
{
QElemType *base;
int front;
int rear;
}SqQueue;
//返回顶点v在图顶点向量中的位置
int LocateVex(ALGraph G,char v)
{ int i;
for(int i=0;v!=G.vertices[i].data&&i<G.vexnum;++i);
if(i>=G.vexnum)
return -1;
return i;
}
//建立无向图邻接链表
void creatUDG(ALGraph &G)
{
int i,j;
char v1,v2;
ArcNode *s,*t;
printf("输入无向图的顶点数:");
scanf("%d",&G.vexnum);
printf("输入无向图的边数:");
scanf("%d",&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
printf("输入第%d的顶点的信息:",i+1);
scanf("%s",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for(int i1=0;i1<G.arcnum;i1++)//该弧所指的顶点的位置
{
printf("输入第%d条边依附的第一个顶点:",i1+1);
scanf("%s",&v1);
printf("输入第%d条边依附的第二个顶点:",i1+1);
scanf("%s",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s=(ArcNode *)malloc(sizeof(ArcNode));
t=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;//弧所指的顶点的位置为j
s->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=s;
t->adjvex=i;//弧所指的顶点的位置为j
t->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=t;
}
}
//初始化辅助队列
int InitQueue(SqQueue &Q)
{
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
{
printf("分配地址失败!");
return 0;
}
Q.front=Q.rear=0;
return(OK);
}
//以访问顶点入队
int EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)//队列已满
{
printf("队列已满!");
return 0;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return(OK);
}
//判断是否为空
int QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return(OK);
else
return(0);
}
//辅助队列对头顶点出队
char DeQueue(SqQueue &Q)
{
QElemType e;
if(Q.front==Q.rear)
{
printf("队列为空!");
return 0;
}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return(e);
}
//广度优先非递归遍历图G
void BFSTraverse(ALGraph G)
{
int v,w,u;
char e;
ArcNode *s;
int visited[MAX_VERTEX_NUM];//访问标志数组
SqQueue Q;//遍历辅助队列
for(v=0;v<G.vexnum;++v)
visited[v]=0;//初始化标志数组visited[]
InitQueue(Q);//初始化队列
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)//尚未访问的点
{
visited[v]=1;
printf("%c->",G.vertices[v].data);
EnQueue(Q,G.vertices[v].data);//已访问顶点入队
while(!QueueEmpty(Q))//辅助队列非空
{
e=DeQueue(Q);//返回辅助队列队头顶点
u=LocateVex(G,e);
s=(ArcNode*)malloc(sizeof(ArcNode));
s=G.vertices[u].firstarc;
while(s!=NULL)//顶点e还有邻接顶点
{
w=s->adjvex;
if(visited[w]==0)
{
visited[w]=1;
printf("%c->",G.vertices[w].data);
EnQueue(Q,G.vertices[w].data);
}
s=s->nextarc;
}
}
}
printf("完成\n");
}
//输出邻接表
void printAdjList(ALGraph G)
{
int i;
ArcNode *p;
printf("%4s%6s%12s\n","编号","顶点","相邻边编号");
for(i=0;i<G.vexnum;i++)
{
printf("%4d%5c",i,G.vertices[i].data);
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
printf("%3d",p->adjvex);//弧所指的顶点的位置
printf("\n");
}
}
int main(){
ALGraph G;
creatUDG(G);//调用无向图创建函数CreateDG()
printf("无向图的邻接表为;\n");
printAdjList(G);//打印简历的无向图的邻接表
printf("广度优先遍历该无向图:\n");
BFSTraverse(G);//调用图的广度优先函数BFSTraverse()
}
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define MAXQSIZE 100
#define OK 1
typedef char VertexType;
typedef char QElemType;
typedef int InfoType;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
typedef struct SqQueue
{
QElemType *base;
int front;
int rear;
}SqQueue;
//返回顶点v在图顶点向量中的位置
int LocateVex(ALGraph G,char v)
{ int i;
for(int i=0;v!=G.vertices[i].data&&i<G.vexnum;++i);
if(i>=G.vexnum)
return -1;
return i;
}
//建立无向图邻接链表
void creatUDG(ALGraph &G)
{
int i,j;
char v1,v2;
ArcNode *s,*t;
printf("输入无向图的顶点数:");
scanf("%d",&G.vexnum);
printf("输入无向图的边数:");
scanf("%d",&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
printf("输入第%d的顶点的信息:",i+1);
scanf("%s",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for(int i1=0;i1<G.arcnum;i1++)//该弧所指的顶点的位置
{
printf("输入第%d条边依附的第一个顶点:",i1+1);
scanf("%s",&v1);
printf("输入第%d条边依附的第二个顶点:",i1+1);
scanf("%s",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s=(ArcNode *)malloc(sizeof(ArcNode));
t=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;//弧所指的顶点的位置为j
s->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=s;
t->adjvex=i;//弧所指的顶点的位置为j
t->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=t;
}
}
//初始化辅助队列
int InitQueue(SqQueue &Q)
{
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
{
printf("分配地址失败!");
return 0;
}
Q.front=Q.rear=0;
return(OK);
}
//以访问顶点入队
int EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)//队列已满
{
printf("队列已满!");
return 0;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return(OK);
}
//判断是否为空
int QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return(OK);
else
return(0);
}
//辅助队列对头顶点出队
char DeQueue(SqQueue &Q)
{
QElemType e;
if(Q.front==Q.rear)
{
printf("队列为空!");
return 0;
}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return(e);
}
//广度优先非递归遍历图G
void BFSTraverse(ALGraph G)
{
int v,w,u;
char e;
ArcNode *s;
int visited[MAX_VERTEX_NUM];//访问标志数组
SqQueue Q;//遍历辅助队列
for(v=0;v<G.vexnum;++v)
visited[v]=0;//初始化标志数组visited[]
InitQueue(Q);//初始化队列
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)//尚未访问的点
{
visited[v]=1;
printf("%c->",G.vertices[v].data);
EnQueue(Q,G.vertices[v].data);//已访问顶点入队
while(!QueueEmpty(Q))//辅助队列非空
{
e=DeQueue(Q);//返回辅助队列队头顶点
u=LocateVex(G,e);
s=(ArcNode*)malloc(sizeof(ArcNode));
s=G.vertices[u].firstarc;
while(s!=NULL)//顶点e还有邻接顶点
{
w=s->adjvex;
if(visited[w]==0)
{
visited[w]=1;
printf("%c->",G.vertices[w].data);
EnQueue(Q,G.vertices[w].data);
}
s=s->nextarc;
}
}
}
printf("完成\n");
}
//输出邻接表
void printAdjList(ALGraph G)
{
int i;
ArcNode *p;
printf("%4s%6s%12s\n","编号","顶点","相邻边编号");
for(i=0;i<G.vexnum;i++)
{
printf("%4d%5c",i,G.vertices[i].data);
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
printf("%3d",p->adjvex);//弧所指的顶点的位置
printf("\n");
}
}
int main(){
ALGraph G;
creatUDG(G);//调用无向图创建函数CreateDG()
printf("无向图的邻接表为;\n");
printAdjList(G);//打印简历的无向图的邻接表
printf("广度优先遍历该无向图:\n");
BFSTraverse(G);//调用图的广度优先函数BFSTraverse()
}