我调用函数时C ++列表程序冻结

时间:2016-10-13 21:02:57

标签: c++ list

此代码必须在字符'q'之前插入字符'p'在列表中出现多少次'q'。

当我调用函数insert_beforeinsert_before('q','p'))时,我的程序会冻结。我不在这里写所有代码。该程序的其余部分工作正常。

struct node
{
   char character;
   node* next;
};
node *fisrt , *end;
void insert_before(char val_search,char val_inserted)
{
   node *c,*a;
   c=first;
   do {
      if (c->next->character==val_search)
      {
          a= new node ;
          a->character=val_inserted ;
          a->next=c->next;
          c->next=a;
          c=c->next; 
      }
      else 
          c=c->next; 
   } while (c) ; 
}

3 个答案:

答案 0 :(得分:1)

当您找到值p时,在找到的条目之前插入一个新条目

这意味着,下次您再次找到相同的条目并在找到的条目之前插入另一个新条目

+---+  +---+
| x |->| p |
+---+  +---+
  c

将成为

+---+  +---+  +---+
| x |->| q |->| p |
+---+  +---+  +---+
         c

然后它将成为

+---+  +---+  +---+  +---+
| x |->| q |->| q |->| p |
+---+  +---+  +---+  +---+
                c

等等。

因为这永远不会结束(直到你的内存耗尽),程序似乎会冻结。

答案 1 :(得分:0)

如果在{}内,请在c = a-> next旁边更改c = c->

答案 2 :(得分:0)

问题

假设您有一个列表中包含唯一元素“q”:firstlast都指向该单个节点。并且节点的next指针将是nullptr

执行insert_before()时,请从c=first开始。因此c指向此nextnullptr的唯一节点。不幸的是,这条指令:if (c->next->character==val_search)将取消引用nullptr。这是未定义的行为,可能会导致您描述的症状。

如果您的搜索值不是第一个元素,那么您的代码原则上会起作用。不幸的是,在插入元素之后,你继续循环:然后你循环在新元素,条件将再次为真,这样你将再次插入一个新元素,依此类推,无休止地循环,直到你的列表耗尽所有的记忆。这也会导致冻结。 顺便说一下,你真的想在列表中的所有'q'之前插入'p'吗?

第一次更正

纠正循环,更加小心:

void insert_before(char val_search,char val_inserted)
{
   node *c,*a;
   for (c=first; c && c->next; c=c->next) {
      if (c->next->character==val_search)
      {
          a= new node ;
          a->character=val_inserted ;
          a->next=c->next;
          c->next=a;
          c=a;
      }
   }  
}

请注意,此代码与您的代码完全相同,无法正确处理列表前面的插入。

第二次修复:

为了能够在前面插入,你需要这样的东西:

void insert_before(char val_search,char val_inserted)
{
   node *c,*a, *prev=nullptr;
   for (c=first; c ; prev=c, c=c->next) {
      if (c->character==val_search)
      {
          a= new node ;
          a->character=val_inserted ;
          a->next=c;
          if (prev)
             prev->next=a;
          else first=a;
      }
   }  
}

Live demo