此代码必须在字符“q”之前插入字符“p”,“q”出现在列表中的次数。

当我调用函数insert_before(insert_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) ;
}

最佳答案

问题

假设您有一个包含唯一元素“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

关于c++ - 我调用函数时C++列表程序卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40030942/

10-12 14:24
查看更多