簡體   English   中英

我調用函數時C ++列表程序凍結

[英]C++ list program freeze when i call a function

此代碼必須在字符“ 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) ; 
}

當找到值p ,將在找到的條目之前插入一個新條目。

這意味着,下次您將再次找到相同的條目,並在找到的條目之前插入另一個新條目

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

會變成

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

然后它將變成

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

等等。

因為這將永遠不會結束(直到內存用完),所以該程序似乎凍結了。

在if {}中,將c = c-> next更改為c = a-> next。

問題所在

假設您有一個包含唯一元素'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;
      }
   }  
}

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM