2013-02-16 96 views
0

我正在处理一个项目,我正在尝试构建一个节点数组作为堆,以便在数组的每个索引中,我可以存储一个名称和值。本质上,我希望我的构造函数将第一个索引的值设置为-1,以便我可以判断它是否为空(值为-1表示空索引)。从节点阵列的Seg故障

问题是我得到一个seg故障,我不知道为什么。下面是错误代码:

头文件:

class tripe 
{ 

public: 

    tripe(); 
    void initialize(string filename); //initialize tripe data struct 
    void insert(string name, int grade); //insert given pair into structure 
    void search(string prefix); //print list of entries that matches prefix 
    void findMin(); //print min grade entry 
    void buildheap(string name,string grade,int size); 

    heapnode *heap[100]; //TROUBLESOME VARIABLE 
    trinode *head; 
    trinode *let[25]; 

}; 

class heapnode 
{ 

public: 

    string student; 
    int score; //WANT THIS TO BE -1 FOR FIRST INDEX OF HEAP ARRAY 
}; 

C++文件:

tripe::tripe() 
{ 
for (int i = 0; i < 100; i++) 
    { 
     heap[i] = NULL; 
    } 

    heap[1]->score = -1; //SEG FAULT 
} 

其实我注意到,每当尝试访问我的堆阵列比分变量,我会毫无例外地获得一场瘫痪。我的构造函数是否需要做其他事情?任何有关这个问题的帮助将不胜感激!

P.S.我需要为这个项目使用一个节点数组,所以我的堆的实现不能改变。

回答

0

您在堆[1]中存储NULL。当你通过NULL间接的时候,你会遇到分段错误。这就是应该发生的事情。堆不是节点数组,而是指向节点的指针数组。如果这是故意的,那么在实际使用这些指针之前,您必须为指向这些指针的内存分配一些内存。既然你说你需要使用“节点阵列”,我想这是真的,因此,你需要改变你的声明是类型heapnode的数组:

heapnode heap[100]; 

那么你的构造将可能是这样的:“”

tripe::tripe() 
{ 
for (int i = 0; i < 100; i++) 
    { 
     heap[i].score = -1; 
    } 
} 

显然,在堆节点的任何其他引用将不得不改变使用而不是“ - >”。

+0

啊,非常感谢你!我仍然是一个用节点和指针工作的noob,所以我无法弄清楚我的生活。我已经改变了声明,把 - >的改成了。这一切都起作用。再次感谢! – 2013-02-17 20:08:06

+0

很好用,祝你好运! – 2013-02-18 00:13:17