源代码:
#include<stdio.h>
#define MVNum 100 //最大顶点数
typedef int OtherInfo; //定义数据类型
typedef char VerTexType; //定义数据类型
typedef struct ArcNode //边结点
{
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc;//指向下一条边的指针
OtherInfo info; //和边相关的信息
}ArcNode;
typedef struct VNode //顶点信息
{
VerTexType data;
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum]; //邻接表类型
typedef struct //邻接表
{
AdjList vertices;
int vexnum,arcnum; //图的点数和边数
}ALGraph;
typedef struct
{
char data[MVNum];
int front; //头指针
int rear; //尾指针
}SqQueue;
bool visited[MVNum]; //访问标志数组
int LocateVex(ALGraph G,char v)//确定V在G中的位置
{
int i;
for(i = 0; i < G.vexnum;i++)
{
if(G.vertices[i].data == v) //如果找到,返回其序号
break;
}
return i;
}
int CreateUDG(ALGraph &G)
{
int v1,v2,w = 1,i,j;
ArcNode *p1,*p2;
printf(“请输入总顶点数和总边数:”);
scanf("%d %d",&G.vexnum,&G.arcnum);
printf(“请输入顶点值:\n”);
for(i = 0; i < G.vexnum;i++)
{
scanf(" %c",&G.vertices[i].data);//输入顶点值
G.vertices[i].firstarc = NULL; //初始化表头结点的指针域为空
}
for(int k = 0;k < G.arcnum;k++)//输入各边,构造邻接表
{
printf(“请输入一条边(第%d条边)连接的两个顶点:”,k+1);
scanf(" %c %c",&v1,&v2);//输入一条边依附的顶点
i = LocateVex(G,v1);
j = LocateVex(G,v2);
p1 = new ArcNode; //生成一个新的边结点
p1->adjvex = j; //邻接点序号为j
p1->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p1; //将新结点插入顶点的边表头部
p2 = new ArcNode; //生成另一个对称的新的边结点
p2->adjvex = i;
p2->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p2;
}
return 0;
}
void DisMGraph(ALGraph G)//输出构造的邻接矩阵
{
int i;
ArcNode *p;
for(i = 0;i < G.vexnum;i++)
{
printf("[%d]:",i);
printf(" %c “,G.vertices[i].data);
for(p = G.vertices[i].firstarc;p != NULL;p = p->nextarc)
printf(”->%d",p->adjvex);
printf("\n");
}
}
void DFS_AL(ALGraph G,int s)
{
int w;
ArcNode *p;
printf("%c “,G.vertices[s].data);//输出第s个顶点
visited[s] = true; //设置标志数组值为true
p = G.vertices[s].firstarc;
while(p != NULL)
{
w = p->adjvex;
if(!visited[w])
DFS_AL(G,w);
p = p->nextarc;
}
}
void InitQueue(SqQueue &Q)//队列初始化
{
Q.front = 0;
Q.rear = 0;
}
bool EnQueue(SqQueue &Q, int e)//入队
{
if( ( Q.rear+1 ) % MVNum == Q.front )//判断队列是否满
return false;
Q.data[Q.rear] = e;
Q.rear = (Q.rear+1)%MVNum;
return true;
}
bool DeQueue(SqQueue &Q,int &e) //出队
{
if( Q.front == Q.rear )
return NULL;
e = Q.data[Q.front];
Q.front = (Q.front+1)%MVNum;
return true;
}
bool QueueEmpty(SqQueue Q) //队列判空
{
return Q.front == Q.rear?true:false;
}
void BFS_AL(ALGraph G,int s)
{
int i,w,data;
ArcNode *p;
for(i = 0; i < G.vexnum; i++)
visited[i] = false;
printf(”%c “,G.vertices[s].data);//输出第s个顶点
visited[s] = true; //设置标志数组值为true
SqQueue Q;
InitQueue(Q);
EnQueue(Q,s); //s进队
while(!QueueEmpty(Q))//队列非空
{
DeQueue(Q,data); //队头元素出队并置为data
p=G.vertices[data].firstarc;
while(p != NULL)
{
w = p->adjvex;
if(!visited[w])//对未访问的顶点做BFS
{
visited[w] = true;
printf(”%c “,w+‘a’);
EnQueue(Q,w);//将此顶点入队
}
p = p->nextarc;
}
}
}
int main()
{
char v;
int i;
ALGraph G;
CreateUDG(G);
DisMGraph(G);
printf(“请输入开始遍历的顶点:\n”);
printf(“深度优先搜索遍历:\n”);
scanf(” %c",&v);
for(i = 0;i < G.vexnum;i++)
{
if(v == G.vertices[i].data)
break;
}
DFS_AL(G,i);
printf("\n广度优先搜索遍历:\n");
BFS_AL(G,i);
return 0;
}
运行示例:
无向连通图邻接表的创建输出广度深度遍历
最新推荐文章于 2022-08-28 01:22:59 发布