2013-08-22 41 views
0

這是我的代碼:我的C++程序可以運行,但總是彈出錯誤

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上運行代碼,它alwa ys彈出發生訪問衝突的錯誤。我不知道爲什麼會出現這個錯誤,我是一名C++新生。請告訴我如何更正我的代碼。 感謝您的幫助。

+6

您是否試過通過調試器運行它以準確找到違規發生的位置? – Sinkingpoint

+0

創建一個析構函數,該函數關閉文件並釋放動態分配的內存。 – KBart

+2

您正在寫入'const int'變量。這是未定義的行爲。 –

回答

4

你的訪問衝突的問題來自訪問你的頭陣列無需爲它以前分配空間:

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

或可替代

Node *header = new Node[SIZE]; 
:要麼通過使用動態分配

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

或通過使用以下參數靜態分配您的標頭:

Node *header[SIZE]; 
+0

非常感謝,它現在可以運行。 – Entel

5

你的編譯器不會警告你嗎?

const int total_of_nodes = 0, , total_of_edges = 0; 

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

這不可能是好的。你正在修改const對象,這是未定義的行爲。

+4

「您的編譯器是不是?警告你?」 - 「確實如此,但這些只是警告,對嗎?」 – 2013-08-22 10:27:34

+0

非常感謝。 – Entel

3

看來header從未分配。

+0

非常感謝。 – Entel

2

除非我已經錯過了,你似乎並沒有把初始化你的「頭」的變量,因此

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

很可能導致自頭[I]可以指向任何地方的一些錯誤。 ..

您必須初始化標題列表。

+0

非常感謝。 – Entel

1

您應該在使用指針之前分配它,否則即使程序編譯成功也會出現運行時錯誤。

相關問題