用C语言写一段代码,有向无权图的增删改查,用邻接矩阵存储,可以从文件读取数据
时间: 2023-12-18 22:03:08 浏览: 33
以下是一个简单的用邻接矩阵存储的有向无权图的增删改查代码,可以从文件读取数据。注意,这里假设图中节点的编号从1开始。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大节点数
// 邻接矩阵存储结构
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 节点数组
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertex_num; // 节点数
int edge_num; // 边数
} Graph;
// 初始化图
void initGraph(Graph *g) {
int i, j;
g->vertex_num = 0;
g->edge_num = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
g->vertex[i] = 0;
for (j = 0; j < MAX_VERTEX_NUM; j++) {
g->edge[i][j] = 0;
}
}
}
// 添加节点
void addVertex(Graph *g, int v) {
g->vertex[g->vertex_num++] = v;
}
// 添加边
void addEdge(Graph *g, int v1, int v2) {
g->edge[v1 - 1][v2 - 1] = 1;
g->edge_num++;
}
// 删除节点
void deleteVertex(Graph *g, int v) {
int i, j;
// 删除节点
for (i = 0; i < g->vertex_num; i++) {
if (g->vertex[i] == v) {
for (j = i; j < g->vertex_num - 1; j++) {
g->vertex[j] = g->vertex[j + 1];
}
g->vertex_num--;
break;
}
}
// 删除相关边
for (i = 0; i < g->vertex_num; i++) {
for (j = v - 1; j < g->vertex_num - 1; j++) {
g->edge[i][j] = g->edge[i][j + 1];
}
}
for (i = v - 1; i < g->vertex_num - 1; i++) {
for (j = 0; j < g->vertex_num; j++) {
g->edge[i][j] = g->edge[i + 1][j];
}
}
g->edge_num = 0;
for (i = 0; i < g->vertex_num; i++) {
for (j = 0; j < g->vertex_num; j++) {
if (g->edge[i][j] == 1) {
g->edge_num++;
}
}
}
}
// 删除边
void deleteEdge(Graph *g, int v1, int v2) {
g->edge[v1 - 1][v2 - 1] = 0;
g->edge_num--;
}
// 查找节点
int findVertex(Graph *g, int v) {
int i;
for (i = 0; i < g->vertex_num; i++) {
if (g->vertex[i] == v) {
return i + 1;
}
}
return -1;
}
// 从文件读取数据
void readFromFile(Graph *g, char *filename) {
FILE *fp;
int v1, v2;
if ((fp = fopen(filename, "r")) == NULL) {
printf("Cannot open file.\n");
exit(1);
}
while (fscanf(fp, "%d %d", &v1, &v2) != EOF) {
if (findVertex(g, v1) == -1) {
addVertex(g, v1);
}
if (findVertex(g, v2) == -1) {
addVertex(g, v2);
}
addEdge(g, v1, v2);
}
fclose(fp);
}
// 打印节点
void printVertex(Graph *g) {
int i;
printf("Vertex: ");
for (i = 0; i < g->vertex_num; i++) {
printf("%d ", g->vertex[i]);
}
printf("\n");
}
// 打印边
void printEdge(Graph *g) {
int i, j;
printf("Edge:\n");
for (i = 0; i < g->vertex_num; i++) {
for (j = 0; j < g->vertex_num; j++) {
if (g->edge[i][j] == 1) {
printf("(%d,%d)\n", g->vertex[i], g->vertex[j]);
}
}
}
}
int main() {
Graph g;
initGraph(&g);
readFromFile(&g, "data.txt");
printVertex(&g);
printEdge(&g);
addVertex(&g, 6);
addEdge(&g, 1, 6);
deleteVertex(&g, 2);
deleteEdge(&g, 3, 4);
printVertex(&g);
printEdge(&g);
return 0;
}
```
假设数据文件`data.txt`的格式为:
```
1 2
1 3
2 3
3 4
4 1
```
输出结果为:
```
Vertex: 1 2 3 4
Edge:
(1,2)
(1,3)
(2,3)
(3,4)
(4,1)
Vertex: 1 3 4 6
Edge:
(1,3)
(3,4)
(4,1)
(1,6)
```