图的建立及输出 任务:建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网),能够输入图的顶点和边的信息,并存储到相应存储结构中,然后输出图的相关信息。
时间: 2023-12-23 17:05:04 浏览: 74
图的创建(有向图,无向图,有向网,无向网)及输出
4星 · 用户满意度95%
好的,我可以帮你解决这个问题。首先,我们需要确定图的类型,假设我们选择有向图作为示例。那么,我们可以使用邻接表作为图的存储结构。
具体实现如下:
1. 定义图的顶点结构体:
```c++
typedef struct VertexNode {
int vertex; // 顶点值
struct EdgeNode* head; // 指向第一条出边的指针
} VertexNode;
```
2. 定义图的边结构体:
```c++
typedef struct EdgeNode {
int adjvex; // 边的终点在顶点数组中的下标
int weight; // 边的权值(如果是带权图)
struct EdgeNode* next; // 指向下一条边的指针
} EdgeNode;
```
3. 定义图的类型:
```c++
typedef struct {
VertexNode vexs[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
int edgenum; // 边数
} Graph;
```
4. 实现建图函数:
```c++
void CreateGraph(Graph* G) {
printf("请输入图的顶点数和边数:\n");
scanf("%d%d", &(G->vexnum), &(G->edgenum));
printf("请输入图的顶点信息:\n");
for (int i = 0; i < G->vexnum; ++i) {
scanf("%d", &(G->vexs[i].vertex));
G->vexs[i].head = NULL;
}
printf("请输入图的边信息:\n");
for (int i = 0; i < G->edgenum; ++i) {
int start, end;
printf("请输入第%d条边的起点和终点:\n", i+1);
scanf("%d%d", &start, &end);
EdgeNode* edge_node = (EdgeNode*)malloc(sizeof(EdgeNode));
edge_node->adjvex = end;
edge_node->next = G->vexs[start].head;
G->vexs[start].head = edge_node;
}
}
```
5. 实现输出图的函数:
```c++
void PrintGraph(Graph G) {
printf("输出图的顶点信息:\n");
for (int i = 0; i < G.vexnum; ++i) {
printf("顶点%d: %d\n", i, G.vexs[i].vertex);
}
printf("输出图的边信息:\n");
for (int i = 0; i < G.vexnum; ++i) {
EdgeNode* edge_node = G.vexs[i].head;
while (edge_node != NULL) {
printf("边<%d, %d>\n", i, edge_node->adjvex);
edge_node = edge_node->next;
}
}
}
```
这样,我们就完成了有向图的建立及输出。你可以根据需要修改或扩展代码实现其他类型的图。
阅读全文