用C语言写一段代码,有向无权图的建立、删除、修改、查询用邻接矩阵存储,可以从文件读取数据 并进行键盘操作
时间: 2023-12-18 17:05:26 浏览: 58
以下是用C语言实现有向无权图的建立、删除、修改、查询,使用邻接矩阵存储,可以从文件读取数据并进行键盘操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 顶点数的最大值
#define INFINITY 65535 // 表示无穷大
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点数据
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边的邻接矩阵
int vertex_num; // 顶点数
int arc_num; // 边数
} Graph;
// 创建有向无权图
void createGraph(Graph *G) {
int i, j, k, w;
char filename[20];
FILE *fp;
printf("请输入文件名:");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
fscanf(fp, "%d %d", &G->vertex_num, &G->arc_num);
for (i = 0; i < G->vertex_num; i++) {
fscanf(fp, "%d", &G->vertex[i]);
}
for (i = 0; i < G->vertex_num; i++) {
for (j = 0; j < G->vertex_num; j++) {
G->arcs[i][j] = INFINITY;
}
}
for (k = 0; k < G->arc_num; k++) {
fscanf(fp, "%d %d %d", &i, &j, &w);
G->arcs[i][j] = w;
}
fclose(fp);
}
// 添加顶点
void addVertex(Graph *G) {
if (G->vertex_num >= MAX_VERTEX_NUM) {
printf("顶点数已达到最大值!\n");
return;
}
printf("请输入要添加的顶点:");
scanf("%d", &G->vertex[G->vertex_num]);
// 初始化新加入的顶点与其他顶点之间的边为无穷大
for (int i = 0; i < G->vertex_num; i++) {
G->arcs[i][G->vertex_num] = INFINITY;
G->arcs[G->vertex_num][i] = INFINITY;
}
G->vertex_num++;
}
// 添加边
void addArc(Graph *G) {
int i, j, w;
printf("请输入要添加边的起点和终点:");
scanf("%d %d", &i, &j);
printf("请输入要添加边的权重:");
scanf("%d", &w);
G->arcs[i][j] = w;
}
// 删除顶点
void deleteVertex(Graph *G) {
int i, j, k;
printf("请输入要删除的顶点:");
scanf("%d", &k);
// 删除顶点数据
for (i = k; i < G->vertex_num-1; i++) {
G->vertex[i] = G->vertex[i+1];
}
G->vertex_num--;
// 删除与该顶点有关的边
for (i = 0; i < G->vertex_num; i++) {
for (j = k; j < G->vertex_num-1; j++) {
G->arcs[i][j] = G->arcs[i][j+1];
}
G->arcs[i][G->vertex_num-1] = INFINITY;
}
for (i = k; i < G->vertex_num-1; i++) {
for (j = 0; j < G->vertex_num; j++) {
G->arcs[i][j] = G->arcs[i+1][j];
}
}
}
// 删除边
void deleteArc(Graph *G) {
int i, j;
printf("请输入要删除边的起点和终点:");
scanf("%d %d", &i, &j);
G->arcs[i][j] = INFINITY;
}
// 查询邻接矩阵
void displayMatrix(Graph *G) {
int i, j;
printf("邻接矩阵:\n");
for (i = 0; i < G->vertex_num; i++) {
for (j = 0; j < G->vertex_num; j++) {
printf("%d\t", G->arcs[i][j]);
}
printf("\n");
}
}
int main() {
Graph G;
int choice;
createGraph(&G);
while (1) {
printf("\n1. 添加顶点\n2. 添加边\n3. 删除顶点\n4. 删除边\n5. 查询邻接矩阵\n0. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
addVertex(&G);
break;
case 2:
addArc(&G);
break;
case 3:
deleteVertex(&G);
break;
case 4:
deleteArc(&G);
break;
case 5:
displayMatrix(&G);
break;
case 0:
exit(0);
default:
printf("输入错误,请重新选择操作!\n");
}
}
return 0;
}
```
在文件中存储图的数据,例如:
```
5 7
1 2 3 4 5
0 1 1
0 3 2
1 2 4
1 4 7
2 0 1
3 4 5
4 2 8
```
第一行为顶点数和边数,第二行为顶点数据,后面每一行为一条边的起点、终点和权重。可以根据需要修改。