我有以下代码,用于使用相邻列表
创建图形结构#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
#define MAX 1000
typedef struct {
int y;
int weight;
struct edgenode *next;
}edgenode;
typedef struct
{
edgenode* edges[MAX+1];
int degree[MAX+1];
int nvertices;
int ndegrees;
int nedges;
bool directed;
}graph;
void initialize(graph *g,bool directed){
int i;
g->nvertices=0;
g->nedges=0;
g->directed=directed;
for(i=1;i<=MAX;i++)g->degree[i]=0;
for(i=1;i<=MAX;i++)g->edges[i]=NULL;
}
void insert(graph *g,int x,int y,bool directed){
edgenode *p;
p=malloc(sizeof(edgenode));
}
int main(){
return 0;
}
当我尝试编译它时,我收到以下错误:
1>------ Build started: Project: graph_list, Configuration: Debug Win32 ------
1> graph_list.cpp
1>c:\users\dato\documents\visual studio 2010\projects\graph_list\graph_list\graph_list.cpp(12): error C2371: 'edgenode' : redefinition; different basic types
1> c:\users\dato\documents\visual studio 2010\projects\graph_list\graph_list\graph_list.cpp(11) : see declaration of 'edgenode'
1>c:\users\dato\documents\visual studio 2010\projects\graph_list\graph_list\graph_list.cpp(35):
error C2027: use of undefined type 'edgenode'
1> c:\users\dato\documents\visual studio 2010\projects\graph_list\graph_list\graph_list.cpp(11) : see declaration of 'edgenode'
1>c:\users\dato\documents\visual studio 2010\projects\graph_list\graph_list\graph_list.cpp(35): error C2440: '=' : cannot convert from 'void *' to 'edgenode *'
1> Conversion from 'void*' to pointer to non-'void' requires an explicit cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我做错了什么,如何解决?
答案 0 :(得分:4)
在C ++中,您必须将malloc()
的结果转换为正确的类型:
p = (edgenode*)malloc(sizeof(edgenode));
此外,你不应该使用typedef
,当然不是你的方式:
struct edgenode {
int y;
int weight;
struct edgenode *next;
};
您的代码看起来像是C和C ++的奇怪组合。没有什么可以阻止你做这件事,但这可能是一个坏主意。您应该决定是否要用C或C ++编写。
答案 1 :(得分:2)
您对edgenode
的使用不一致:
typedef struct {
int y;
int weight;
struct edgenode *next;
} edgenode;
在next
的声明中,您使用类型struct edgenode
,但您声明的结构是一个匿名结构,它将typedef与名称{{1 }}。为了能够将结构称为edgenode
,您必须将该名称添加到声明中:
struct edgenode
第二个错误是因为你不能隐式地将typedef struct edgenode {
...
} edgenode;
转换为C ++中的其他指针类型,你必须显式地转换void*
的结果或使用C ++ malloc
。