输入格式:
在第1行输入图的类型,
1表示有向图,0表示无向图。在第2行输入构造图的顶点,个数 N 不超过100。例如:图有5个顶点,则输入
ABCDE。后面 N 行,分别输入与ABCDE顶点相连的顶点。例如无向图样例1:
BD,表示A-B和A-D相连;下一行输入:ACE,表示B-A、B-C和B-E相连。再如有向图样例2:BD,表示A->B和A->D;下一行无输入,表示顶点B无初始点的边。以此类推。测试数据保证有效。且
图的存储结构采用链式存储,构造时使用头插法。输出格式:
参照主函数及
输出样例。输出字符串中使用中文标点符号。输入样例1:
0 ABCDE BD ACE BDE AC BC输出样例1:
------------------------------ 无向图的顶点数:5 无向图的弧数:6 ------------------------------ 图的邻接表: [0]A->[3]->[1]->NULL [1]B->[4]->[2]->[0]->NULL [2]C->[4]->[3]->[1]->NULL [3]D->[2]->[0]->NULL [4]E->[2]->[1]->NULL ------------------------------ 图的深度优先遍历序列:ADCEB ------------------------------ 图的广度优先遍历序列:ADBCE ------------------------------输入样例2:
1 ABCDE BD B CE输出样例2:
------------------------------ 有向图的顶点数:5 有向图的弧数:5 ------------------------------ 图的邻接表: [0]A->[3]->[1]->NULL [1]B->NULL [2]C->[1]->NULL [3]D->[4]->[2]->NULL [4]E->NULL ------------------------------ 图的深度优先遍历序列:ADECB ------------------------------ 图的广度优先遍历序列:ADBEC ---------------------------
#include <stdio.h>
#include <malloc.h>
#define MAX_VERTEX_NUM 100
typedef char VertexType;
//图的邻接表存储表示
typedef struct ArcNode //表结点
{
int adjvex; //与顶点相连的邻接点下标
struct ArcNode *nextarc; //指向顶点的下一个邻接点
}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
{
int v[MAX_VERTEX_NUM];
int frot, rear;
}SqQueue;
void InitSqQueue(SqQueue &Q); // 构造一个空队列
void EnSqQueue(SqQueue &Q, int v); // 入队操作
int DeSqQueue(SqQueue &Q); // 出队操作
void CreatALG(ALGraph &G); //构造图
int LocateVex(ALGraph &G, VertexType ch); //图的顶点定位
void PrintALG(ALGraph &G); //打印链接表(已知)
void DFSTraverse(ALGraph &G); //深度优先遍历图
void DFS(ALGraph &G, int i);
void BFSTraverse(ALGraph &G); //广度优先遍历图
int visited[MAX_VERTEX_NUM]; //访问标识数组,全局变量
int main()
{
ALGraph G;
CreatALG(G);
printf("------------------------------\n");
if(G.kind == 0)
printf("无向图的顶点数:%d\n无向图的弧数:%d\n", G.vexnum, G.arcnum);
else
printf("有向图的顶点数:%d\n有向图的弧数:%d\n", G.vexnum, G.arcnum);
printf("------------------------------\n");
printf("图的邻接表:\n\n");
PrintALG(G);
printf("------------------------------\n");
printf("图的深度优先遍历序列:");
DFSTraverse(G);
printf("\n------------------------------\n");
printf("图的广度优先遍历序列:");
BFSTraverse(G);
printf("\n------------------------------\n");
return 0;
}
void PrintALG(ALGraph &G)
{
ArcNode *temp;
if(G.vexnum == 0)
{
printf("图为空!\n");
return;
}
for(int i = 0; i < G.vexnum; i++)
{
printf("[%d]%c->", i, G.vertices[i].data);
temp = G.vertices[i].firstarc;
while(temp)
{
printf("[%d]->", temp->adjvex);
temp = temp->nextarc;
}
printf("NULL\n");
}
return;
}
void InitSqQueue(SqQueue &Q) // 构造一个空队列
{
Q.frot=Q.rear=0;
return;
}
void EnSqQueue(SqQueue &Q, int v) // 入队操作
{
if((Q.rear+1)%MAX_VERTEX_NUM==Q.frot)
{
printf("队列满,入队失败!\n");
return;
}
Q.v[Q.rear]=v;
Q.rear=(Q.rear+1)%MAX_VERTEX_NUM;
return;
}
int DeSqQueue(SqQueue &Q)// 出队操作
{
if(Q.frot==Q.rear) return -1;
int t=Q.v[Q.frot];
Q.frot=(Q.frot+1)%MAX_VERTEX_NUM;
return t;
}
void CreatALG(ALGraph &G) //构造图
{
VertexType ch;
int i=0,sum=0;
scanf("%d",&G.kind);
getchar();
while((ch=getchar())!='\n')
{
G.vertices[i].data=ch;
G.vertices[i].firstarc=NULL;
i++;
}
G.vexnum=i;
for(i=0;i<G.vexnum;i++)
while((ch=getchar())!='\n')
{
ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=LocateVex(G,ch);
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
sum++;
}
if(!G.kind) G.arcnum=sum/2;
else G.arcnum=sum;
return;
}
int LocateVex(ALGraph &G, VertexType ch) //图的顶点定位
{
int i;
for(i=0;i<G.vexnum;i++)
if(ch==G.vertices[i].data)
return i;
return -1;
}
void DFSTraverse(ALGraph &G) //深度优先遍历图
{
int i;
for(i=0;i<G.vexnum;i++) visited[i]=0;
for(i=0;i<G.vexnum;i++)
if(!visited[i]) DFS(G,i);
}
void DFS(ALGraph &G, int i)
{
visited[i]=1;
printf("%c",G.vertices[i].data);
for(ArcNode *p=G.vertices[i].firstarc;p;p=p->nextarc)
if(!visited[p->adjvex])
DFS(G,p->adjvex);
}
void BFSTraverse(ALGraph &G) //广度优先遍历图
{
int i,index;
SqQueue Q;
InitSqQueue(Q);
for(i=0;i<G.vexnum;i++)
visited[i]=0;
for(i=0;i<G.vexnum;i++)
{
if(!visited[i])
{
visited[i]=1;
printf("%c",G.vertices[i].data);
EnSqQueue(Q,i);
while(Q.frot!=Q.rear) //若队不为空
{
index=DeSqQueue(Q);
for(ArcNode *p=G.vertices[index].firstarc;p;p=p->nextarc)
if(!visited[p->adjvex])
{
visited[p->adjvex]=1;
printf("%c",G.vertices[p->adjvex].data);
EnSqQueue(Q,p->adjvex);
}
}
}
}
}

2541

被折叠的 条评论
为什么被折叠?



