用C语言写代码,Internet网络通路的建立、删除、修改、查询,用邻接表,有向无权图
时间: 2023-12-10 13:41:29 浏览: 146
以下是用C语言实现Internet网络通路的建立、删除、修改、查询的代码,使用邻接表来表示有向无权图:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表中的边结构体
typedef struct EdgeNode {
int adjvex; // 该边指向的顶点位置
struct EdgeNode* next; // 指向下一条边的指针
} EdgeNode;
// 邻接表中的顶点结构体
typedef struct VertexNode {
int data; // 顶点数据
EdgeNode* firstedge; // 指向第一条依附该顶点的边的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
// 邻接表结构体
typedef struct {
AdjList adjList; // 图中所有顶点的邻接表
int vertexNum; // 顶点数
int edgeNum; // 边数
} GraphAdjList;
// 初始化邻接表
void initGraph(GraphAdjList* G) {
G->vertexNum = 0;
G->edgeNum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
G->adjList[i].data = 0;
G->adjList[i].firstedge = NULL;
}
}
// 在邻接表中插入边
void insertEdge(GraphAdjList* G, int from, int to) {
EdgeNode* edge = (EdgeNode*)malloc(sizeof(EdgeNode));
edge->adjvex = to;
edge->next = G->adjList[from].firstedge;
G->adjList[from].firstedge = edge;
G->edgeNum++;
}
// 在邻接表中删除边
void deleteEdge(GraphAdjList* G, int from, int to) {
EdgeNode* edge = G->adjList[from].firstedge;
EdgeNode* pre = NULL;
while (edge != NULL && edge->adjvex != to) {
pre = edge;
edge = edge->next;
}
if (edge != NULL) {
if (pre == NULL) {
G->adjList[from].firstedge = edge->next;
} else {
pre->next = edge->next;
}
free(edge);
G->edgeNum--;
}
}
// 修改邻接表中的边
void modifyEdge(GraphAdjList* G, int from, int to, int newTo) {
deleteEdge(G, from, to);
insertEdge(G, from, newTo);
}
// 查询邻接表中的边
int findEdge(GraphAdjList* G, int from, int to) {
EdgeNode* edge = G->adjList[from].firstedge;
while (edge != NULL && edge->adjvex != to) {
edge = edge->next;
}
if (edge != NULL) {
return 1;
} else {
return 0;
}
}
// 打印邻接表
void printGraph(GraphAdjList* G) {
printf("VertexNum: %d, EdgeNum: %d\n", G->vertexNum, G->edgeNum);
for (int i = 0; i < G->vertexNum; i++) {
printf("Vertex %d: ", G->adjList[i].data);
EdgeNode* edge = G->adjList[i].firstedge;
while (edge != NULL) {
printf("%d ", edge->adjvex);
edge = edge->next;
}
printf("\n");
}
}
int main() {
GraphAdjList G;
initGraph(&G);
// 添加顶点
for (int i = 1; i <= 5; i++) {
G.adjList[i-1].data = i;
G.vertexNum++;
}
// 添加边
insertEdge(&G, 0, 1);
insertEdge(&G, 0, 2);
insertEdge(&G, 1, 3);
insertEdge(&G, 2, 3);
insertEdge(&G, 2, 4);
insertEdge(&G, 3, 4);
printGraph(&G);
// 删除边
deleteEdge(&G, 2, 3);
printGraph(&G);
// 修改边
modifyEdge(&G, 1, 3, 4);
printGraph(&G);
// 查询边
printf("Edge %d -> %d: %d\n", 0, 1, findEdge(&G, 0, 1));
printf("Edge %d -> %d: %d\n", 1, 2, findEdge(&G, 1, 2));
return 0;
}
```
该程序首先定义了邻接表中的边结构体和顶点结构体,然后定义了邻接表结构体,其中包含了所有顶点的邻接表、顶点数和边数等信息。
接着,定义了一些操作函数,包括初始化邻接表、插入边、删除边、修改边和查询边等。这些函数的实现都比较简单,主要是对邻接表进行操作。
最后,在主函数中,我们添加了5个顶点,然后添加了6条边,并打印了邻接表。接着,我们删除了一条边,再次打印邻接表。然后,我们修改了一条边,再次打印邻接表。最后,我们查询了两条边,并输出结果。
以上就是用C语言实现Internet网络通路的建立、删除、修改、查询的代码,使用邻接表来表示有向无权图。