这句代码哪里有问题:void AddVertex(Graph* G, int v) { G->vertices[G->vexnum++].data = v;}
时间: 2024-01-22 20:17:27 浏览: 24
这段代码是向图中添加一个顶点,看起来没有问题。但是需要注意以下两点:
1. 函数的参数是一个指向图的指针,但是没有进行指针有效性检查,如果传入的指针为空指针,会导致程序崩溃。因此,在函数内部最好加上判断指针是否为 NULL 的语句。
2. 在函数中,使用了 G->vexnum++,这样可能会导致图的顶点数超过预期。因此,在函数中需要先检查顶点数是否已经达到了最大值,如果达到了最大值,则不能再添加顶点了。
下面是修正后的代码:
```
void AddVertex(Graph* G, int v) {
if (G == NULL) {
printf("Error: graph pointer is null.\n");
return;
}
if (G->vexnum >= MAX_VERTEX_NUM) {
printf("Error: graph has reached the maximum number of vertices.\n");
return;
}
G->vertices[G->vexnum++].data = v;
}
```
相关问题
将下列代码改成六个结点10条边的无向图:#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最大结点数 typedef struct ArcNode { // 弧结点类型 int adjvex; // 邻接点在顶点数组中的下标 struct ArcNode* next; // 指向下一个邻接点的指针 } ArcNode; typedef struct VertexNode { // 顶点类型 char data; // 顶点信息 ArcNode* firstarc; // 指向第一个邻接点的指针 } VertexNode, AdjList[MAX_VERTEX_NUM]; typedef struct Graph { // 图类型 AdjList vertices; // 顶点数组 int vexnum, arcnum; // 顶点数、弧数 } Graph; // 初始化图 void InitGraph(Graph* G) { G->vexnum = G->arcnum = 0; for (int i = 0; i < MAX_VERTEX_NUM; ++i) { G->vertices[i].data = '\0'; G->vertices[i].firstarc = NULL; } } // 添加结点 void AddVertex(Graph* G, char ch) { G->vertices[G->vexnum].data = ch; ++G->vexnum; } // 添加边 void AddEdge(Graph* G, int v1, int v2) { ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = v2; p->next = G->vertices[v1].firstarc; G->vertices[v1].firstarc = p; ++G->arcnum; } // 输出每个结点的度 void PrintDegree(Graph* G) { for (int i = 0; i < G->vexnum; ++i) { int degree = 0; ArcNode* p = G->vertices[i].firstarc; while (p) { ++degree; p = p->next; } printf("结点%c的度为%d\n", G->vertices[i].data, degree); } } int main() { Graph G; InitGraph(&G); AddVertex(&G, 'A'); AddVertex(&G, 'B'); AddVertex(&G, 'C'); AddVertex(&G, 'D'); AddEdge(&G, 0, 1); AddEdge(&G, 0, 2); AddEdge(&G, 1, 2); AddEdge(&G, 2, 0); AddEdge(&G, 2, 3); AddEdge(&G, 3, 3); PrintDegree(&G); return 0; }
将代码改成六个结点十条边的无向图,可以按照以下方式修改:
1. 修改结点数为6,即将MAX_VERTEX_NUM改为6,同时在InitGraph函数中将G->vexnum初始值改为6。
2. 根据题目要求,顶点分别为A、B、C、D、E、F。因此在main函数中添加以下语句:
```
AddVertex(&G, 'A');
AddVertex(&G, 'B');
AddVertex(&G, 'C');
AddVertex(&G, 'D');
AddVertex(&G, 'E');
AddVertex(&G, 'F');
```
3. 添加边的过程中,注意无向图的边是双向的,因此需要添加两条边。具体来说,添加边的代码如下:
```
AddEdge(&G, 0, 1); // A-B
AddEdge(&G, 1, 0); // B-A
AddEdge(&G, 0, 2); // A-C
AddEdge(&G, 2, 0); // C-A
AddEdge(&G, 1, 2); // B-C
AddEdge(&G, 2, 1); // C-B
AddEdge(&G, 2, 3); // C-D
AddEdge(&G, 3, 2); // D-C
AddEdge(&G, 3, 4); // D-E
AddEdge(&G, 4, 3); // E-D
```
4. 最后,修改输出语句中的结点名称为题目给定的名称即可。修改后的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 6 // 最大结点数
typedef struct ArcNode { // 弧结点类型
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode* next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VertexNode { // 顶点类型
char data; // 顶点信息
ArcNode* firstarc; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct Graph { // 图类型
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数、弧数
} Graph;
// 初始化图
void InitGraph(Graph* G) {
G->vexnum = 6;
G->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; ++i) {
G->vertices[i].data = '\0';
G->vertices[i].firstarc = NULL;
}
}
// 添加结点
void AddVertex(Graph* G, char ch) {
G->vertices[G->vexnum].data = ch;
++G->vexnum;
}
// 添加边
void AddEdge(Graph* G, int v1, int v2) {
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v2;
p->next = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p;
++G->arcnum;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v1;
p->next = G->vertices[v2].firstarc;
G->vertices[v2].firstarc = p;
++G->arcnum;
}
// 输出每个结点的度
void PrintDegree(Graph* G) {
for (int i = 0; i < G->vexnum; ++i) {
int degree = 0;
ArcNode* p = G->vertices[i].firstarc;
while (p) {
++degree;
p = p->next;
}
printf("结点%c的度为%d\n", G->vertices[i].data, degree);
}
}
int main() {
Graph G;
InitGraph(&G);
AddVertex(&G, 'A');
AddVertex(&G, 'B');
AddVertex(&G, 'C');
AddVertex(&G, 'D');
AddVertex(&G, 'E');
AddVertex(&G, 'F');
AddEdge(&G, 0, 1); // A-B
AddEdge(&G, 1, 0); // B-A
AddEdge(&G, 0, 2); // A-C
AddEdge(&G, 2, 0); // C-A
AddEdge(&G, 1, 2); // B-C
AddEdge(&G, 2, 1); // C-B
AddEdge(&G, 2, 3); // C-D
AddEdge(&G, 3, 2); // D-C
AddEdge(&G, 3, 4); // D-E
AddEdge(&G, 4, 3); // E-D
PrintDegree(&G);
return 0;
}
```
c语言用邻接表和邻接矩阵分别表示图并输出每个节点的度代码
邻接表表示图并输出每个节点的度的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大结点数
typedef struct ArcNode { // 弧结点类型
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode* next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VertexNode { // 顶点类型
char data; // 顶点信息
ArcNode* firstarc; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct Graph { // 图类型
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数、弧数
} Graph;
// 初始化图
void InitGraph(Graph* G) {
G->vexnum = G->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; ++i) {
G->vertices[i].data = '\0';
G->vertices[i].firstarc = NULL;
}
}
// 添加结点
void AddVertex(Graph* G, char ch) {
G->vertices[G->vexnum].data = ch;
++G->vexnum;
}
// 添加边
void AddEdge(Graph* G, int v1, int v2) {
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v2;
p->next = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p;
++G->arcnum;
}
// 输出每个结点的度
void PrintDegree(Graph* G) {
for (int i = 0; i < G->vexnum; ++i) {
int degree = 0;
ArcNode* p = G->vertices[i].firstarc;
while (p) {
++degree;
p = p->next;
}
printf("结点%c的度为%d\n", G->vertices[i].data, degree);
}
}
int main() {
Graph G;
InitGraph(&G);
AddVertex(&G, 'A');
AddVertex(&G, 'B');
AddVertex(&G, 'C');
AddVertex(&G, 'D');
AddEdge(&G, 0, 1);
AddEdge(&G, 0, 2);
AddEdge(&G, 1, 2);
AddEdge(&G, 2, 0);
AddEdge(&G, 2, 3);
AddEdge(&G, 3, 3);
PrintDegree(&G);
return 0;
}
```
邻接矩阵表示图并输出每个节点的度的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 100 // 最大结点数
typedef struct Graph { // 图类型
char vexs[MAX_VERTEX_NUM]; // 顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数、弧数
} Graph;
// 初始化图
void InitGraph(Graph* G) {
G->vexnum = G->arcnum = 0;
memset(G->arcs, 0, sizeof(G->arcs));
}
// 添加结点
void AddVertex(Graph* G, char ch) {
G->vexs[G->vexnum] = ch;
++G->vexnum;
}
// 添加边
void AddEdge(Graph* G, int v1, int v2) {
G->arcs[v1][v2] = 1;
++G->arcnum;
}
// 输出每个结点的度
void PrintDegree(Graph* G) {
for (int i = 0; i < G->vexnum; ++i) {
int degree = 0;
for (int j = 0; j < G->vexnum; ++j) {
if (G->arcs[i][j]) {
++degree;
}
}
printf("结点%c的度为%d\n", G->vexs[i], degree);
}
}
int main() {
Graph G;
InitGraph(&G);
AddVertex(&G, 'A');
AddVertex(&G, 'B');
AddVertex(&G, 'C');
AddVertex(&G, 'D');
AddEdge(&G, 0, 1);
AddEdge(&G, 0, 2);
AddEdge(&G, 1, 2);
AddEdge(&G, 2, 0);
AddEdge(&G, 2, 3);
AddEdge(&G, 3, 3);
PrintDegree(&G);
return 0;
}
```