此代码必须在字符“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”的列表:first
和last
都指向该单个节点。节点的next
指针将是nullptr
。
当执行insert_before()
时,您从c=first
开始。因此c
指向这个唯一的节点,该节点的next
为nullptr
。不幸的是,该指令: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/