数据结构——c语言 邻接矩阵

戳这里还有其他数据结构的题目噢

https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501


设计并验证如下算法:图采用邻接矩阵表示,实现无向图的深度优先搜索与有向图的广度优先搜索。

直接上代码: 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#define MAX_VERTICES 100 //假设图有100个顶点
#define MAX_WEIGHT 32767 //加权图(网)不邻接时为10000,但输出为“∞”

typedef int boole;
typedef int ElemType;
boole visited[MAX_VERTICES]; //访问标志数组

//图结构
typedef struct
{
	int Vertices[MAX_VERTICES]; //顶点信息的数组
	int AdjacencyMatrix[MAX_VERTICES][MAX_VERTICES]; //边信息的数组。
	int numvex; //当前的顶点数
	int numarc; //当前的边数
}AdMatrix;

//队列结构
typedef struct Qnode
{
	ElemType data;
	struct Qnode *next;
}Qnode, *Qptr;     //定义节点

typedef struct LINKQUEUE
{
	Qptr front;
	Qptr rear;
}LinkQueue;       //定义队首、队尾指针

//图的生成函数
void CreateGraph1(AdMatrix *G)
{
	int n, e, vi, vj;
	printf("请输入有向图的顶点数和边数(空格隔开):");
	scanf("%d%d", &n, &e);
	G->numvex = n;
	G->numarc = e;
	//AdjacencyMatrix初始化
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			//无权图的初始化
			G->AdjacencyMatrix[i][j] = 0;
		}
	}
	//Vertices数组的创建
	for (int i = 0; i < G->numvex; i++)
	{
		printf("\n 请输入第%d个顶点的信息(整数):\n", i + 1);
		scanf("%d", &G->Vertices[i]);
	}
	//AdjacencyMatrix数组的建立
	for (int i = 0; i < G->numarc; i++)
	{
		printf("请输入边的信息i,j(空格分开):\n");
		scanf("%d%d", &vi, &vj);
		G->AdjacencyMatrix[vi - 1][vj - 1] = 1;
	}
}

void CreateGraph2(AdMatrix *G)
{
	int n, e, vi, vj;
	printf("请输入无向图的顶点数和边数(空格隔开):");
	scanf("%d%d", &n, &e);
	G->numvex = n;
	G->numarc = e;
	//AdjacencyMatrix初始化
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			//无权图的初始化
			G->AdjacencyMatrix[i][j] = 0;

		}
	}
	//Vertices数组的创建
	for (int i = 0; i < G->numvex; i++)
	{
		printf("\n 请输入第%d个顶点的信息(整数):\n", i + 1);
		scanf("%d", &G->Vertices[i]);
	}
	//AdjacencyMatrix数组的建立
	for (int i = 0; i < G->numarc; i++)
	{
		printf("请输入边的信息i,j(空格分开):\n");
		scanf("%d%d", &vi, &vj);
		G->AdjacencyMatrix[vi - 1][vj - 1] = 1;
		G->AdjacencyMatrix[vj - 1][vi - 1] = 1;//无向图具有对称性,通过其实现;有向图不需要这条语句。
	}
}

//输出邻接矩阵的信息
void ShowGraph(AdMatrix *G)
{
	int i, j;
	printf("输出顶点的信息:\n");
	for (i = 0; i < G->numvex; i++)
	{
		printf("%d ", G->Vertices[i]);
	}
	printf("\n输出邻接矩阵的信息: \n");
	printf("  ");
	for (i = 0; i < G->numvex; i++)
	{
		printf("%d ", i + 1);
	}
	for (i = 0; i < G->numvex; i++)
	{
		printf("\n%d ", i + 1);
		for (j = 0; j < G->numvex; j++)
		{
			if (G->AdjacencyMatrix[i][j] == MAX_WEIGHT)
			{
				printf("%s ", "∞");
			}
			else
			{
				printf("%d ", G->AdjacencyMatrix[i][j]);
			}
		}
		printf("\n");
	}
}

// 深度优先遍历
void DFS(AdMatrix *G, int i)
{
	int j;
	visited[i] = 1; //访问过的结点标记为1
	printf("%d->", G->Vertices[i]);
	for (j = 0; j< G->numvex; j++)
	{
		if (G->AdjacencyMatrix[i][j] == 1 && !visited[j])
		{
			DFS(G, j);
		}
	}
}

void DFStraverse(AdMatrix *G)
{
	for (int i = 0; i < G->numvex; i++)
	{
		visited[i] = 0; //初始化标记数组为0
	}
	for (int i = 0; i < G->numvex; i++)
	{
		if (!visited[i])
		{
			DFS(G, i);
		}
	}
}

//广度优先遍历—用一个队列实现
void InitQueue(LinkQueue *q) //队列初始化
{
	//定义头结点,队首队尾都指向头结点
	Qptr firstnode = (Qptr)malloc(sizeof(Qnode));
	q->front = q->rear = firstnode;
	if (!q->front)
	{
		exit(0);
	}
	q->front->next = NULL;
}
//入队列
void PushQueue(LinkQueue *q, ElemType e) 
{
	//在队尾插入元素
	Qptr p = (Qptr)malloc(sizeof(Qnode));
	if (!p)
	{
		exit(0);
	}
	p->data = e;
	p->next = NULL;
	q->rear->next = p;
	q->rear = p;
}
//出队列
void DetQueue(LinkQueue *q, ElemType &e)
{
	//出队列在队首进行
	if (q->front == q->rear)
	{
		printf("队列中无元素!\n");
		exit(0);
	}
	Qptr p = q->front->next;
	e = p->data;
	q->front->next = p->next;
	if (q->rear == p)
	{
		q->rear = q->front;
	}
	free(p);
}
//检验是否为空
int QueueEmpty(LinkQueue *q)
{
	if (q->front == q->rear)
		return 0;
	else
		return 1;
}
//广度优先遍历
void BFSTraverse(AdMatrix *G)
{
	int k;
	LinkQueue Q;
	InitQueue(&Q);
	for (int i = 0; i < G->numvex; i++)
	{
		visited[i] = 0; //初始化标记数组
	}
	for (int i = 0; i < G->numvex; i++)
	{
		if (!visited[i])
		{
			visited[i] = 1;
			printf("%d->", G->Vertices[i]);
			PushQueue(&Q, i);
		}
		while (QueueEmpty(&Q))
		{
			DetQueue(&Q, k);
			for (int j = 0; j < G->numvex; j++)
			{
				if (G->AdjacencyMatrix[k][j] == 1 && !visited[j])
				{
					visited[j] = 1;
					printf("%d->", G->Vertices[j]);
					PushQueue(&Q, j);
				}
			}
		}
	}
}

int main()
{
	AdMatrix G1,G2;
	
	CreateGraph1(&G1);//有向图 
	ShowGraph(&G1);
		
	printf("\n广度优先遍历:\n");
	BFSTraverse(&G1);
	printf("\n\n"); 
	
	CreateGraph2(&G2);//无向图 
	ShowGraph(&G2); 

	printf("\n深度优先遍历:\n");
	DFStraverse(&G2);
	printf("\n\n");


	system("pause");
	return 0;
}

 (代码如有雷同,可能存在借鉴他人部分代码情况)

(请不要直接复制使用。总结的代码仅供参考,希望读者借此代码自身可以理解学习)

如果代码对您有帮助,不要忘记评论收藏噢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起当风萧

如果喜欢请支持一下~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值