戳这里还有其他数据结构的题目噢
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;
}
(代码如有雷同,可能存在借鉴他人部分代码情况)
(请不要直接复制使用。总结的代码仅供参考,希望读者借此代码自身可以理解学习)
如果代码对您有帮助,不要忘记评论收藏噢~