此代码必须在字符'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) ;
}
答案 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”: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;
}
}
}