在图形程序中使用malloc

时间:2011-11-10 13:28:41

标签: c++ algorithm graph-theory

我有以下代码,用于使用相邻列表

创建图形结构
#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 ==========

我做错了什么,如何解决?

2 个答案:

答案 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