这是我的代码:
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;
}
}
的main.cpp
#include"GraphBuilder.h"
using namespace std;
void main()
{
GraphBuilder gb;
gb.CreateGraph();
gb.printGraph();
}
我在VS2012上运行代码,它总是弹出发生Access违规的错误。我不知道为什么会出现这个错误,我是C ++的新生。请告诉我如何更正我的代码。 谢谢你的帮助。
答案 0 :(得分:5)
你的编译器不警告你吗?
const int total_of_nodes = 0, , total_of_edges = 0;
和
fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);
这不可能是好事。你正在修改const对象,它是未定义的行为。
答案 1 :(得分: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];
答案 2 :(得分:3)
似乎永远不会分配header
。
答案 3 :(得分:2)
除非我错过了,否则你似乎没有初始化你的“标题”变量,所以
for(i=0;i<total_of_nodes;i++)
{
header[i].data = i;
header[i].next = NULL;
}
可能会导致一些错误,因为header [i]可能指向任何地方......
您必须初始化标题列表。
答案 4 :(得分:1)
你应该在使用指针之前分配它,否则即使程序可以成功编译也会出现运行时错误。