处理动态数据结构时代码中的神秘错误

时间:2015-01-14 20:04:50

标签: c++

我是C ++的初学者,一整天都在寻找我的错误,但我找不到它。 我想创建一个动态数据结构并在其中添加一些元素。但我的第一种方式不起作用,我无法找到原因。

我现在有2个案例。一个有效,一个失败。我知道我可以使用第二种方式而不是问这个问题,但我认为我真的不了解重要的事情,我相信我会再次犯同样的错误。

所以这里是代码:

struct a{
  int count;
  int value;
  a* first;
  a* next;
};

失败案例(第一条道路):

int main(){
  a alist = { 0, 12, NULL, NULL }; //init the first one
  alist.first = &alist;

  for (int i = 0; i < 20; i++){  //creat some dyn. linked structures    
    if (alist.next == NULL){
      alist.next = new a;
      alist.next->count = i;
      alist.next->first = alist.first;
      alist.next->next = NULL;
      alist.next->value = 12; //just a test value
      alist = *(alist.next);            
    }
  }

  alist = *(alist.first); //reset to start from the beginning 
  cout << "count of created Structs:" << endl;
  for (int i = 0; i < 20; i++){  //show count if structs exists
    if (alist.next != NULL){
      cout << "_" << i << endl;
      alist = *(alist.next);
    }
  }
  return 0;
}

输出:

count of created Structs:

工作案例:

int main(){
  a* alist = new a{ 0, 12, NULL, NULL }; //init the first one
  alist->first = alist;

  for (int i = 0; i < 20; i++){  //creat some dyn. linked structures    
    if (alist->next == NULL){
      alist->next = new a;
      alist->next->count = i;
      alist->next->value = 12; //just a test value
      alist->next->first = alist->first;
      alist->next->next = NULL;
      alist = alist->next;
    }
  }

  alist = alist->first; //reset to start from the beginning 
  cout << "count of created Structs:" << endl;
  for (int i = 0; i < 20; i++){  //show countnumber if structs exists
    if (alist->next != NULL){
      cout << "_" << i << endl;
      alist = (alist->next);
    }
  }
  return 0;
}

输出:

count of created Structs:
_0,_0,_1,_2,_3,..._19

1 个答案:

答案 0 :(得分:3)

声明

alist = *(alist.next);

在每个循环迭代中使用列表中的alist链接覆盖本地对象next。在最后一次迭代中,它使用nextNULL的对象进行设置。每个对象的first指针都指向被覆盖的本地对象。当您尝试显示创建的结构时,检查next是否为NULL的第一个评估将失败。

第二个版本没有覆盖,因为您使用的是指针赋值而不是对象复制。