C语言数据结构实验代码如下:
//无向图基本操作的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define MAXINT 0
#define MVNUM 100
typedef int VerTexType;
typedef int ArcType;
typedef struct {
VerTexType vex[MVNUM];
ArcType arcs[MVNUM][MVNUM];
int vexnum, arcnum;
}AMGraph;
//队列结构体
typedef struct queue
{
int data[MVNUM];
int front;
int rear;
}que;
que* Q = NULL;
//获取指定点在顶点表中的位置
int LocateVex(AMGraph* G, VerTexType e) {
for (int i = 0; i < G->vexnum; i++) {
if (G->vex[i] == e) {
return i;
}
}
return -1;//找不到返回-1
}
//无向图的创建(邻接矩阵)
int CreateUDN(AMGraph* G) {
printf("请输入总顶点数:");
scanf("%d", &G->vexnum);
printf("请输入总边数:");
scanf("%d", &G->arcnum);
printf("请依次输入点的信息:");
for (int i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vex[i]);
}
//初始化邻接矩阵,边的权值均为极大值
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = MAXINT;
}
}
//构建邻接矩阵
int temp1, temp2, weight, row, column;
for (int i = 0; i < G->arcnum; i++) {
printf("请输入两个点,及他们所依附的边的权值:");
scanf("%d %d %d", &temp1, &temp2, &weight);
row = LocateVex(G, temp1);
column = LocateVex(G, temp2);
if (row == -1 || column == -1) {
printf("顶点表中没有该元素");
return 1;
}
G->arcs[row][column] = weight;
//无向图其对称边的权值也为weight
G->arcs[column][row] = weight;
}
return 0;
}
//定义一个标记数组
int visited[MVNUM];
//深度优先搜索
void DFS(AMGraph* G, int v) {
printf("%d ", G->vex[v]);
//标记已访问顶点,默认为1访问
visited[v] = 1;
for (int i = 0; i < G->vexnum; i++) {
if (G->arcs[v][i] != 0 && visited[i] == 0) {
DFS(G, i);
}
}
}
DFSTraverse(AMGraph* G) {
int v;
for (v = 0; v < MVNUM; v++) {
visited[v] = 0;
}
for (v = 0; v < G->vexnum; v++) {
if (visited[v] == 0) {
DFS(G, v);
}
}
}
//初始化队列
void initque(que* qu) {
qu->front = qu->rear = 0;
}
//入队
void push(que* qu, int x)
{
if (qu->rear + 1 == MVNUM)
{
printf("队满无法入队");
}
else
{
qu->data[qu->rear] = x;
qu->rear++;
}
}
//出队
int pop(que* qu)
{
int temp;
if (qu->rear == qu->front)
{
printf("队列为空无法出队\n");
}
else
{
qu->front++;
temp = qu->data[qu->front - 1];
return temp;
}
}
//判断队空
int empty(que* qu)
{
if (qu->front == qu->rear)
{
return 1;
}
else
{
return 0;
}
}
//广度优先搜索
void BFSuse(AMGraph* G, int k)
{
int i, j;
que* qu;
qu = (que*)malloc(sizeof(que));
initque(qu);
visited[k] = 1;
push(qu, k);
printf("%d ", G->vex[k]);
while (empty(qu) != 1)
{
i = pop(qu);
for (j = 0; j < G->vexnum; j++)
{
if (G->arcs[i][j] == 1 && !visited[j])
{
printf("%d ", G->vex[j]);
visited[j] = 1;
push(qu, j);
}
}
}
}
void BFS(AMGraph* G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = 0;
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
BFSuse(G, i);
}
}
}
//打印邻接矩阵
void PrintGragh(AMGraph* G) {
for (int i = 0; i < G->vexnum; i++)
{
printf("\t%d", G->vex[i]);
}
printf("\n");
for (int i = 0; i < G->vexnum; i++)
{
printf("%d\t", G->vex[i]);
for (int j = 0; j < G->vexnum; j++)
{
printf("%d\t", G->arcs[i][j]);
}
printf("\n\n");
}
}
//销毁图
void DestoryGraph(AMGraph* G)
{
AMGraph* pre, * p;
for (int i = 0; i < G->vexnum; i++)
{
pre = G->vex[i];
if (pre != NULL) {
int temp = 0;
p = pre->arcs[temp];
while (p != NULL)
{
free(pre);
AMGraph* pre = p;
p = pre->arcs[temp++];
}
free(pre);
}
}
free(G);
}
void menu() {
AMGraph* G = (AMGraph*)malloc(sizeof(AMGraph));
printf("------------无向图基本操作的实现------------\n");
printf("1.建立一个无向图\n");
printf("2.退出菜单\n");
printf("请输入你所选择的操作数:");
int i = 0;
while (1) {
scanf("%d", &i);
switch (i) {
case 1:
if (CreateUDN(G)) {
printf("无向图创建失败");
}
break;
case 2:
printf("--------------------------------------------");
return;
default:
printf("\n输入的操作数有误,请重新输入:");
}
if (i == 1) {
break;
}
}
while (1) {
printf("\n");
printf("1.深度优先遍历输出无向图\n");
printf("2.广度优先遍历输出无向图\n");
printf("3.打印该图的邻接矩阵\n");
printf("4.销毁图并退出");
printf("请输入你所选择的操作数:");
scanf("%d", &i);
switch (i) {
case 1:
printf("深度优先遍历无向图为:");
DFSTraverse(G);
printf("\n");
break;
case 2:
printf("广度优先遍历无向图为:");
BFS(G);
printf("\n");
break;
case 3:
printf("打印邻接矩阵为:\n");
PrintGragh(G);
printf("\n");
break;
case 4:
printf("图已销毁\n");
printf("--------------------------------------------");
DestoryGraph(G);
return;
break;
default:
printf("\n输入的操作数有误,请重新输入:");
}
}
}
//菜单运行
void main() {
menu();
}
ps.陕理工22级数据结构第四次实验记录