int *degree = (int *)malloc(sizeof(int) * g.N)初始化吗
时间: 2023-11-18 12:05:36 浏览: 99
在使用 `malloc` 动态分配内存时,建议在分配内存的同时进行初始化,以避免出现未初始化的内存访问问题。因此,你可以使用以下代码进行初始化:
```
int *degree = (int *)malloc(sizeof(int) * g.N);
memset(degree, 0, sizeof(int) * g.N);
```
这样可以将 `degree` 数组中的所有元素初始化为 0。
相关问题
将下列代码改成六个结点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;
}
```
完善下列代码#include <stdio.h> const int N = 10; //判断无向图是否欧拉图 //返回值为奇度数结点数 int euler1(int** a, int n) { //**********************begin*********************************** //**********************end************************************** } int main( ) { int** a1;//无向图 int n, i, j; scanf("%d", &n);//读入结点数 if (n > N) { printf("error\n"); return 0; } a1 = new int* [n]; for (i = 0; i < n; i++) { a1[i] = new int[n]; for (j = 0; j < n; j++) { a1[i][j] = 0; } } while (1) { scanf("%d%d", &i, &j);//读入无向边 //********************begin************************* //******************end***************************** } int odd = euler1(a1, n); if (odd == 0) { printf("a is euler\n"); } else if (odd == 2) printf("a is semi-euler\n"); else printf("a is not euler\n"); }
下面是完善后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
const int N = 10;
// 返回奇度数结点个数
int euler1(int** a, int n) {
int* degree = (int*)malloc(n * sizeof(int)); // 存储每个结点的度数
// 初始化所有结点的度数为0
for (int i = 0; i < n; i++) {
degree[i] = 0;
}
// 计算每个结点的度数
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 1) {
degree[i]++;
degree[j]++;
}
}
}
int odd = 0; // 记录奇度数结点个数
for (int i = 0; i < n; i++) {
if (degree[i] % 2 == 1) {
odd++;
}
}
free(degree); // 释放动态分配的内存
return odd;
}
int main() {
int** a1; // 无向图
int n, i, j;
scanf("%d", &n); // 读入结点数
if (n > N) {
printf("error\n");
return 0;
}
// 动态分配二维数组
a1 = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
a1[i] = (int*)malloc(n * sizeof(int));
for (j = 0; j < n; j++) {
a1[i][j] = 0;
}
}
// 读入无向边
while (1) {
scanf("%d%d", &i, &j);
if (i == -1 && j == -1) { // 输入-1 -1 结束输入
break;
}
if (i >= n || j >= n) { // 输入的结点编号超过范围,退出程序
printf("error\n");
return 0;
}
a1[i][j] = 1;
a1[j][i] = 1;
}
int odd = euler1(a1, n); // 计算奇度数结点个数
// 判断是否为欧拉图或半欧拉图
if (odd == 0) {
printf("a is euler\n");
} else if (odd == 2) {
printf("a is semi-euler\n");
} else {
printf("a is not euler\n");
}
// 释放动态分配的内存
for (i = 0; i < n; i++) {
free(a1[i]);
}
free(a1);
return 0;
}
```
主要的修改包括:
1. 在 `#include` 头文件中加入 `stdlib.h`,以便使用 `malloc` 和 `free` 函数。
2. 在 `main` 函数中,动态分配二维数组 `a1`,并在程序结束时释放动态分配的内存。
3. 修改循环条件,在读入结点编号超过范围时,输出错误信息并退出程序。
4. 在读入无向边时,加入输入 `-1 -1` 以结束输入。
5. 在计算奇度数结点个数时,使用动态分配的数组 `degree`,并在计算结束后释放动态分配的内存。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)