0

这是我的代码:

GraphBuilder.h

//#pragma once
#include<iostream>
#include<stdio.h>
#include<fstream>
#include <stdlib.h>
#include <string>
using namespace std;

#define MaxVertexNum 500000    

struct Node{
    int data;
    struct Edge *next;
};

struct Edge{
    int data;
    int weight;
    struct Edge* next;
};



class GraphBuilder
{
public:
    GraphBuilder();
    void CreateGraph();
    void printGraph();
    Node *header;
    int total_of_nodes, total_of_edges;

private:
};

GraphBuilder.cpp

#include"GraphBuilder.h"
using namespace std;

GraphBuilder::GraphBuilder()
{
}

void GraphBuilder::CreateGraph()
{
    int i,j,k;
    int vex1, vex2, weight;
    char a;
    Edge *tmp, *newNode;     
    FILE *fp;
    int line= -1;
    fp = fopen("Text1.txt", "r");


    if(fp == NULL)
    {
        cout<<"Cannot open file!\n";
        return;
    }
    while(!feof(fp))
    {
        if(line == -1)
        {
            fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);    
            line++;
        }
        else break;
    }

    for(i=0;i<total_of_nodes;i++) 
    {
        header[i].data = i;   
        header[i].next = NULL;
    }    
    while(!feof(fp))
    {
        if(line == -1)
        {
            fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);  
            line++;
        }
        else
        {
            fscanf(fp, "%d %d %d", &vex1, &vex2, &weight);    
            newNode = (Edge *)malloc(sizeof(Edge));   
            newNode->data = vex2;          
            newNode->weight = weight;
            newNode->next = NULL;
            if (header[vex1].next == NULL)
                header[vex1].next = newNode;   
            else 
            {
                tmp = header[vex1].next;
                header[vex1].next = newNode;
                newNode->next = tmp;
            }
        }
    }
}

void GraphBuilder::printGraph()
{
    int i;
    Edge* tmp;
    for (i=0; i<total_of_nodes; i++)
    {
        cout<<header[i].data;
        if (header[i].next != NULL)
        {
            tmp = header[i].next;
            cout<<"->"<<tmp->data;
            while (tmp->next != NULL)
            {
                cout<<"->"<<tmp->data;
            }
        }
        cout<<endl;
    }
}

主文件

#include"GraphBuilder.h"
using namespace std;

void main()
{
    GraphBuilder gb;
    gb.CreateGraph();
    gb.printGraph();
}

我在VS2012上运行代码,总是弹出访问冲突发生的错误。不知道为什么会出现这个错误,我是C++的大一新生。请告诉我如何更正我的代码。谢谢你的帮助。

4

5 回答 5

5

你的编译器没有警告你吗?

const int total_of_nodes = 0, , total_of_edges = 0;

fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);

那可不好。您正在修改 const 对象,这是未定义的行为。

于 2013-08-22T10:24:44.120 回答
4

您的访问冲突问题来自访问您的标头数组而之前没有为其分配空间:

for(i=0;i<total_of_nodes;i++) 
    {
        header[i].data = i;   
        header[i].next = NULL;
    } 

通过以下方式使用动态分配:

Node *header;
...
header=(Node*) malloc(SIZE*sizeof(Node));

或者

Node *header = new Node[SIZE];

或使用以下方法静态分配标题:

Node *header[SIZE];
于 2013-08-22T10:28:45.847 回答
3

似乎header从未分配过。

于 2013-08-22T10:26:37.727 回答
2

除非我错过了,否则您似乎没有初始化您的“标题”变量,所以

for(i=0;i<total_of_nodes;i++) 
{
    header[i].data = i;   
    header[i].next = NULL;
}

可能会导致一些错误,因为 header[i] 可能指向任何地方......

您必须初始化标题列表。

于 2013-08-22T10:34:04.050 回答
1

在使用指针之前应该分配它,否则即使程序可以编译成功也会出现运行时错误。

于 2013-08-22T12:50:30.823 回答