【数据结构-图】C语言实现邻接表表示无向图的广度优先遍历

C语言实现邻接表表示无向图的广度优先遍历

  • 邻接表的存储结构
  • 创建邻接表表示的无向图
  • 定义广度优先遍历的队列基本操作
  • 广度优先遍历算法
  • 测试代码整合

邻接表的存储结构

typedef int OtherInfo;
typedef int Status;
//定义邻接表储存结构 
typedef struct ArcNode   //边链表结点 
{
	int adjvex;
	struct ArcNode *nextarc;
	OtherInfo info;
}ArcNode;
typedef struct VNode   //顶点数组 
{
	char data;
	ArcNode *firstArc;
}VNode,adjList[MVNum];
typedef struct
{
	adjList vertices;
	int vexnum,arcnum;
}ALGraph;

创建邻接表表示的无向图

//定位顶点位置
int LocateVex(ALGraph G,char v)
{
	for(int i=0;i<G.vexnum;i++)
		if(G.vertices[i].data == v) return i;
	return -1;
}

//创建邻接表表示图无向图
void CreateUDG(ALGraph *G)
{
	printf("请输入顶点数和边数:");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	printf("请输入%d个顶点:",G->vexnum);
	for(int i=0;i<G->vexnum;i++)
	{
		scanf(" %c",&G->vertices[i].data);
		G->vertices[i].firstArc = NULL;
	}
	for(int i=0;i<G->arcnum;i++)
	{
		int i,j;
		char v1,v2;
		printf("请输入边对应的顶点:");
		scanf(" %c%c",&v1,&v2);
		i=LocateVex(*G,v1);
		j=LocateVex(*G,v2);
		ArcNode *p1 = (ArcNode *)malloc(sizeof(ArcNode));
		p1->nextarc=G->vertices[i].firstArc;
		p1->adjvex = j;
		p1->info = 1;    //无向图权值为1
		G->vertices[i].firstArc = p1;
		//这条边的另一个顶点
		ArcNode *p2 = (ArcNode *)malloc(sizeof(ArcNode));
		p2->nextarc = G->vertices[j].firstArc;
		p2->adjvex = i;
		p2->info = 1;
		G->vertices[j].firstArc = p2; 
	}
}

定义广度优先遍历的队列基本操作

//定义队列存储结构
typedef struct
{
	int *base;
	int front;
	int rear;
}SqQueue;

//初始化队列
Status InitQueue(SqQueue *Q)
{
	Q->base = (int *)malloc(MAXSIZE);
	if(Q->base == NULL) return ERROR;
	Q->front = Q->rear = 0;
	return OK;
}

//入队
Status EnQueue(SqQueue *Q,int e)
{
	if(Q->rear+1 == Q->rear) return ERROR;   //满队
	Q->base[Q->rear] = e;
	Q->rear = (Q->rear+1)%MAXSIZE;
	return OK;
}

//出队
Status DeQueue(SqQueue *Q,int *e)
{
	if(Q->front == Q->rear) return ERROR;   //队空
	*e = Q->base[Q->front];
	Q->front = (Q->front+1)%MAXSIZE;
	return OK;
}

//判断队列是否为空
Status QueueEmpty(SqQueue Q)
{
	if(Q.front == Q.rear) return TRUE;
	return FALSE;
}

广度优先遍历算法


//定义辅助数组
int visited[MVNum]; 

//广度优先遍历
void BFS(ALGraph G,int i)
{
	ArcNode *p;
	SqQueue Q;
	int e;   //记录出队顶点位置 
	//初始化状态数组 
	for(int i=0;i<G.vexnum;i++)
		visited[i]=0;
	//初始化队列
	InitQueue(&Q);
	EnQueue(&Q,i);
	printf("%c",G.vertices[i].data);
	visited[i]=1;
	while(!QueueEmpty(Q))
	{
		DeQueue(&Q,&e);
		p=G.vertices[e].firstArc;
		while(p)
		{
			if(!visited[p->adjvex])
			{
				printf("%c",G.vertices[p->adjvex].data);
				visited[p->adjvex]=1;
				EnQueue(&Q,p->adjvex);
			}
			p=p->nextarc;
		}
	}
}

测试代码整合

#include 
#include 

#define OK 1
#define ERROR 0 
#define MAXSIZE 10
#define MVNum 100
#define TRUE 1
#define FALSE 0

typedef int OtherInfo;
typedef int Status;
//定义队列存储结构
typedef struct
{
	int *base;
	int front;
	int rear;
}SqQueue;

//定义邻接表储存结构 
typedef struct ArcNode   //边链表结点 
{
	int adjvex;
	struct ArcNode *nextarc;
	OtherInfo info;
}ArcNode;
typedef struct VNode   //顶点数组 
{
	char data;
	ArcNode *firstArc;
}VNode,adjList[MVNum];
typedef struct
{
	adjList vertices;
	int vexnum,arcnum;
}ALGraph;

//初始化队列
Status InitQueue(SqQueue *Q)
{
	Q->base = (int *)malloc(MAXSIZE);
	if(Q->base == NULL) return ERROR;
	Q->front = Q->rear = 0;
	return OK;
}

//入队
Status EnQueue(SqQueue *Q,int e)
{
	if(Q->rear+1 == Q->rear) return ERROR;   //满队
	Q->base[Q->rear] = e;
	Q->rear = (Q->rear+1)%MAXSIZE;
	return OK;
}

//出队
Status DeQueue(SqQueue *Q,int *e)
{
	if(Q->front == Q->rear) return ERROR;   //队空
	*e = Q->base[Q->front];
	Q->front = (Q->front+1)%MAXSIZE;
	return OK;
}

//判断队列是否为空
Status QueueEmpty(SqQueue Q)
{
	if(Q.front == Q.rear) return TRUE;
	return FALSE;
}

//定位顶点位置
int LocateVex(ALGraph G,char v)
{
	for(int i=0;i<G.vexnum;i++)
		if(G.vertices[i].data == v) return i;
	return -1;
}

//创建邻接表表示图无向图
void CreateUDG(ALGraph *G)
{
	printf("请输入顶点数和边数:");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	printf("请输入%d个顶点:",G->vexnum);
	for(int i=0;i<G->vexnum;i++)
	{
		scanf(" %c",&G->vertices[i].data);
		G->vertices[i].firstArc = NULL;
	}
	for(int i=0;i<G->arcnum;i++)
	{
		int i,j;
		char v1,v2;
		printf("请输入边对应的顶点:");
		scanf(" %c%c",&v1,&v2);
		i=LocateVex(*G,v1);
		j=LocateVex(*G,v2);
		ArcNode *p1 = (ArcNode *)malloc(sizeof(ArcNode));
		p1->nextarc=G->vertices[i].firstArc;
		p1->adjvex = j;
		p1->info = 1;    //无向图权值为1
		G->vertices[i].firstArc = p1;
		//这条边的另一个顶点
		ArcNode *p2 = (ArcNode *)malloc(sizeof(ArcNode));
		p2->nextarc = G->vertices[j].firstArc;
		p2->adjvex = i;
		p2->info = 1;
		G->vertices[j].firstArc = p2; 
	}
}

//定义辅助数组
int visited[MVNum]; 

//广度优先遍历
void BFS(ALGraph G,int i)
{
	ArcNode *p;
	SqQueue Q;
	int e;   //记录出队顶点位置 
	//初始化状态数组 
	for(int i=0;i<G.vexnum;i++)
		visited[i]=0;
	//初始化队列
	InitQueue(&Q);
	EnQueue(&Q,i);
	printf("%c",G.vertices[i].data);
	visited[i]=1;
	while(!QueueEmpty(Q))
	{
		DeQueue(&Q,&e);
		p=G.vertices[e].firstArc;
		while(p)
		{
			if(!visited[p->adjvex])
			{
				printf("%c",G.vertices[p->adjvex].data);
				visited[p->adjvex]=1;
				EnQueue(&Q,p->adjvex);
			}
			p=p->nextarc;
		}
	}
}

int main()
{
	ALGraph G;
	CreateUDG(&G);
	BFS(G,0);
	return 0;
}

【图】
【数据结构-图】C语言实现邻接表表示无向图的广度优先遍历_第1张图片

【结果】
【数据结构-图】C语言实现邻接表表示无向图的广度优先遍历_第2张图片

你可能感兴趣的:(数据结构,C语言,数据结构,c语言)