[英]Function call causes C++ program to freeze unless stepped-through in debugger
[英]C++ list program freeze when i call a function
此代碼必須在字符“ 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) ;
}
當找到值p
,將在找到的條目之前插入一個新條目。
這意味着,下次您將再次找到相同的條目,並在找到的條目之前插入另一個新條目
+---+ +---+
| x |->| p |
+---+ +---+
c
會變成
+---+ +---+ +---+
| x |->| q |->| p |
+---+ +---+ +---+
c
然后它將變成
+---+ +---+ +---+ +---+
| x |->| q |->| q |->| p |
+---+ +---+ +---+ +---+
c
等等。
因為這將永遠不會結束(直到內存用完),所以該程序似乎凍結了。
在if {}中,將c = c-> next更改為c = a-> next。
問題所在
假設您有一個包含唯一元素'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;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.