0

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

问题是我遇到了段错误,我不知道为什么。这是错误的代码:

头文件:

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
}

事实上,我注意到,每当尝试访问堆数组中的 score 变量时,我都会得到一个 segault。我的构造函数需要做其他事情吗?对此问题的任何帮助将不胜感激!

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

4

1 回答 1

0

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

heapnode heap[100];

那么你的构造函数可能看起来像这样:

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

显然,对堆中节点的任何其他引用都必须更改为使用“.”。运算符而不是“->”。

于 2013-02-17T18:41:58.130 回答