用c'语言实现设计一个基于DOS菜单的应用程序。无向网的基本操作及应用 1.创建无向网的邻接矩阵 2.创建无向网的邻接表
时间: 2024-01-21 17:16:56 浏览: 75
以下是基于DOS菜单的应用程序的C语言实现。该程序实现了无向网的邻接矩阵和邻接表的创建,以及一些基本操作。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 //最大顶点数
#define MAX_ARC_NUM 50 //最大边数
//邻接矩阵表示法
typedef struct {
int vexs[MAX_VERTEX_NUM]; //顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum, arcnum; //顶点数和边数
} MGraph;
//邻接表表示法
typedef struct ArcNode {
int adjvex; //邻接点在顶点数组中的下标
int weight; //边的权值
struct ArcNode *next; //指向下一个邻接点的指针
} ArcNode;
typedef struct VexNode {
int data; //顶点的值
ArcNode *firstarc; //指向第一个邻接点的指针
} VexNode;
typedef struct {
VexNode vexs[MAX_VERTEX_NUM]; //顶点数组
int vexnum, arcnum; //顶点数和边数
} ALGraph;
//创建无向网的邻接矩阵
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
//初始化邻接矩阵
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0;
}
}
//输入顶点值
printf("请输入顶点值:\n");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vexs[i]);
}
//输入边的信息
printf("请输入边的信息(起点, 终点, 权值):\n");
for (k = 0; k < G->arcnum; k++) {
scanf("%d%d%d", &i, &j, &w);
G->arcs[i][j] = w;
G->arcs[j][i] = w; //无向图
}
}
//创建无向网的邻接表
void CreateALGraph(ALGraph *G)
{
int i, j, k, w;
ArcNode *p;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
//输入顶点值
printf("请输入顶点值:\n");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vexs[i].data);
G->vexs[i].firstarc = NULL; //初始化邻接表的表头指针
}
//输入边的信息
printf("请输入边的信息(起点, 终点, 权值):\n");
for (k = 0; k < G->arcnum; k++) {
scanf("%d%d%d", &i, &j, &w);
//创建边节点
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = w;
//将边节点插入到起点的邻接表中
p->next = G->vexs[i].firstarc;
G->vexs[i].firstarc = p;
//重复以上操作,将边节点插入到终点的邻接表中
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = i;
p->weight = w;
p->next = G->vexs[j].firstarc;
G->vexs[j].firstarc = p;
}
}
//输出邻接矩阵
void PrintMGraph(MGraph G)
{
int i, j;
printf("邻接矩阵为:\n");
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) {
printf("%d ", G.arcs[i][j]);
}
printf("\n");
}
}
//输出邻接表
void PrintALGraph(ALGraph G)
{
int i;
ArcNode *p;
printf("邻接表为:\n");
for (i = 0; i < G.vexnum; i++) {
printf("%d:", G.vexs[i].data);
p = G.vexs[i].firstarc;
while (p != NULL) {
printf("%d(%d) ", G.vexs[p->adjvex].data, p->weight);
p = p->next;
}
printf("\n");
}
}
int main()
{
int choice;
MGraph G1;
ALGraph G2;
while (1) {
printf("1.创建无向网的邻接矩阵\n");
printf("2.创建无向网的邻接表\n");
printf("3.输出邻接矩阵\n");
printf("4.输出邻接表\n");
printf("5.退出\n");
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
CreateMGraph(&G1);
break;
case 2:
CreateALGraph(&G2);
break;
case 3:
PrintMGraph(G1);
break;
case 4:
PrintALGraph(G2);
break;
case 5:
exit(0);
default:
printf("输入错误,请重新输入!\n");
}
}
return 0;
}
```
这个程序中,使用`MGraph`和`ALGraph`结构体分别表示无向网的邻接矩阵和邻接表。其中,`CreateMGraph`函数和`CreateALGraph`函数分别用于创建邻接矩阵和邻接表,`PrintMGraph`函数和`PrintALGraph`函数分别用于输出邻接矩阵和邻接表。在`main`函数中,利用`while`循环和`switch`语句实现了基于DOS菜单的交互界面。
阅读全文