c - 测试和学习 C 中的图时出现意外错误
问题描述
我最近开始研究这本关于算法和数据结构的特殊书籍SkienaTheAlgorithmDesignManual.pdf,我不仅在互联网上,而且从我的算法设计老师以及大学时都听到了很多赞美,我最终得到了本书第 153 页(书本身)或 165(pdf 格式)中使用的一些代码存在一些错误。
这是代码:
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define MAXV 1000
typedef struct {
int y;
int weight;
struct edgenode *next;
}edgenode;
typedef struct {
edgenode *edges[MAXV + 1];
int degree[MAXV + 1];
int nvertices;
int nedges;
bool directed;
}graph;
void initialize_graph(graph *g, bool directed);
void read_graph(graph *g, bool directed);
void insert_edge(graph *g, int x, int y, bool directed);
void print_graph(graph *g);
void initialize_graph(graph *g, bool directed) {
int i;
g->nvertices = 0;
g->nedges = 0;
g->directed = directed;
for (i = 1; i <= MAXV; i++) {
g->degree[i] = 0;
g->edges[i] = NULL;
}
}
void read_graph(graph *g, bool directed) {
int i;
int m;
int x, y;
initialize_graph(g, directed);
scanf("%d %d", &(g->nvertices), &m);
for (i = 1; i <= m; i++) {
scanf("%d %d", &x, &y);
insert_edge(g, x, y, directed);
}
}
void insert_edge(graph *g, int x, int y, bool directed) {
edgenode *p;
p = malloc(sizeof(edgenode));
p->weight = NULL;
p->y = y;
p->next = g->edges[x];
g->edges[x] = p;
g->degree[x]++;
if (directed == false)
insert_edge(g, y, x, true);
else
g->nedges++;
}
void print_graph(graph *g) {
int i;
edgenode *p;
for (i = 1; i <= g->nvertices; i++) {
printf("%d ", i);
p = g->edges[i];
while (p != NULL) {
printf(" %d", p->y);
p = p->next;
}
printf("\n");
}
}
main() {
bool directed = true;
graph *g;
read_graph(g, directed);
print_graph(g);
system("pause");
}
以下是错误:
1>c:\users\dragos\source\repos\learninggraph\learninggraph\main.c(47): 警告 C4047: '=': 'int' 与 'void *' 的间接级别不同 1>c:\users \dragos\source\repos\learninggraph\learninggraph\main.c(49): 警告 C4133: '=': 不兼容的类型 - 从 'edgenode *' 到 'edgenode *' 1>c:\users\dragos\source\repos \learninggraph\learninggraph\main.c(65): 警告 C4133: '=': 不兼容的类型 - 从 'edgenode *' 到 'edgenode *' 1>c:\users\dragos\source\repos\learninggraph\learninggraph\main .c(73): error C4700: uninitialized local variable 'g' used 1>Done building project "LearningGraph.vcxproj" -- 失败。========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
我认为主要问题是“不兼容的类型”,但我也可能错了。
解决方案
在insert_edge
p->weight = NULL;
无效,因为weight是int但NULL是指针(通常(void*)0
)
在insert_edge
p->next = g->edges[x];
无效,因为next是未定义的类型struct edgenode *
,但却edges[x]
是edgenode *
. 为了解决这个问题,你必须更换
typedef struct {
int y;
int weight;
struct edgenode *next;
}edgenode;
经过
typedef struct edgenode {
int y;
int weight;
struct edgenode *next;
}edgenode;
原因print_graph
同上
p = p->next;
显式设置main的返回类型为int
在main中,您read_graph
使用g从不设置/初始化调用,因此当它在行为中被取消引用时read_graph
,行为是未定义的,在print_graph
. 只需更换
graph *g; read_graph(g, directed); print_graph(g);
经过
graph g;
read_graph(&g, directed);
print_graph(&g);
完整修改版:
#include <stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#define MAXV 1000
typedef struct edgenode {
int y;
int weight;
struct edgenode *next;
}edgenode;
typedef struct {
edgenode *edges[MAXV + 1];
int degree[MAXV + 1];
int nvertices;
int nedges;
bool directed;
}graph;
void initialize_graph(graph *g, bool directed);
void read_graph(graph *g, bool directed);
void insert_edge(graph *g, int x, int y, bool directed);
void print_graph(graph *g);
void initialize_graph(graph *g, bool directed) {
int i;
g->nvertices = 0;
g->nedges = 0;
g->directed = directed;
for (i = 1; i <= MAXV; i++) {
g->degree[i] = 0;
g->edges[i] = NULL;
}
}
void read_graph(graph *g, bool directed) {
int i;
int m;
int x, y;
initialize_graph(g, directed);
scanf("%d %d", &(g->nvertices), &m);
for (i = 1; i <= m; i++) {
scanf("%d %d", &x, &y);
insert_edge(g, x, y, directed);
}
}
void insert_edge(graph *g, int x, int y, bool directed) {
edgenode *p;
p = malloc(sizeof(edgenode));
p->weight = 0;
p->y = y;
p->next = g->edges[x];
g->edges[x] = p;
g->degree[x]++;
if (directed == false)
insert_edge(g, y, x, true);
else
g->nedges++;
}
void print_graph(graph *g) {
int i;
edgenode *p;
for (i = 1; i <= g->nvertices; i++) {
printf("%d ", i);
p = g->edges[i];
while (p != NULL) {
printf(" %d", p->y);
p = p->next;
}
printf("\n");
}
}
int main() {
bool directed = true;
graph g;
read_graph(&g, directed);
print_graph(&g);
system("pause");
}
编译:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra g.c
pi@raspberrypi:/tmp $
推荐阅读
- r - Cook 的 Beta 回归距离
- karate - 空手道 - 从 json 文件中读取数据并将其分配给动态生成的请求
- python - 为什么 val_loss 和 val_accuracy 没有出现在时代
- jhipster - 我正在启动我的 JHIPSTER maven 服务器,但出现错误
- python - 如何在Python中找到未来时间的纪元时间
- java - Selenium Chrome 驱动程序 - 获取 java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 设置
- python - 每次执行后使用不同名称创建文件夹
- sql - 如何使用纬度和经度找到两点之间的距离
- c# - 无法在不同项目之间共享 ResourceDictionary
- c# - 使用 C# 的当前应用程序的活动时间