簡體   English   中英

雙向鏈表插入在中間

[英]doubly linked list insert at middle

誰能識別我的代碼中引起分段錯誤的內容? 請修改/糾正錯誤的部分。

void InsertAtMid (Node *head){

    int num,count=0,i;
    Node *ptr=head;
    Node *newnode=NULL;
    Node *newnode2=head;

    printf("Enter node to be inserted: ");
    scanf("%d", &num);

    if (head==NULL){
            newnode = head;
            newnode=(Node *)malloc(sizeof(Node));
            newnode->x=num;
            newnode->next=NULL;
            newnode->prev=NULL;
    } else {
            ptr=head->next;
            while(ptr->x!=(count/2)){
                ptr=ptr->next;
            }
            newnode->next=ptr->next;
            newnode->prev=ptr;
            ptr->next->prev=newnode;
            ptr->next=newnode;
    }
}

因此,根據我對您的代碼的理解-以下應該[大部分]有效:

void InsertAtMid (Node **head){
    int num = 0;
    int count = 0
    int advance = 0;
    Node *ptr = *head;
    Node *newnode = NULL;

    printf("Enter node to be inserted: ");
    scanf("%d", &num);

    if (*head == NULL) {
      *head = (Node *)malloc(sizeof(Node));
      ptr = *head;
      ptr->x = num;
      ptr->next = NULL;
      ptr->prev = NULL;
    } else {
      // *** Count the number of items
      ptr = *head;
      while (ptr != NULL) {
         ptr = ptr->next;
         count++;
      }

      // *** Move to the middle of the list
      ptr = *head;
      while (advance < (count/2)){
         ptr = ptr->next;
         advance++;
      }

      // *** Insert the new value
      newnode = (Node *)malloc(sizeof(Node));
      newnode->x = num;
      newnode->next = ptr->next;
      newnode->prev = ptr;
      ptr->next->prev = newnode;
      ptr->next = newnode;
   }
}

以下是我解決的問題:

  • 您是在某個時候分配給head的,但是由於沒有傳遞“ head”作為參考,因此該值不會在第一次調用該函數之后被保留。 不用說,您需要一個指向節點類型的指針的指針。
  • 您從未計算過列表中的項目數。 通常,“ head”指針將存儲此信息,並且在添加節點時會增加該信息,但是由於沒有這種唯一的確定它的方法是遍歷列表直到找到計數。
  • 除非初始化頭指針,否則您從未分配空間供新節點插入。 這也是一個問題。

希望對您有所幫助。 祝你好運!

int num,count=0,i;
...
ptr=head->next;
while(ptr->x!=(count/2)){
    ptr=ptr->next;

count初始化為0,並且從未更改。

因此,除非您為x輸入“ 0”,否則while循環每次都會走出列表的末尾。

測試以找出在什么情況下您的代碼段錯誤。

您會發現,當head == NULL時,它可以正常工作,但是如果head不為null,則會失敗。

因此,您知道您的錯誤在else塊中的某處。

在調試器中逐步執行正在運行的代碼(如果您不知道怎么做,那么學習它永遠不會太早:每當您使用調試器解決問題時,您都會想到“為什么不早點解決?”。)

弄清您期望發生的情況,觀察調試器中的變量,以及當實際值偏離您的期望時,說明原因。

對我來說尚不清楚您期望在代碼中發生什么,但是對於具有一個節點的列表,實際發生的是:

  • 它將執行ptr=head->next; -因此ptr現在為NULL
  • 然后對於while條件,它將嘗試取消對ptr->x引用,並且由於ptr為NULL,它將進行段錯誤。

一個快速的解決方法是:

while(ptr != NULL && ptr->x ....) {

但是您需要考慮這是否是您想要的實際邏輯; 而一旦您克服了這些麻煩,就會遇到其他問題(例如, count永不改變),這些問題可以用調試器以相同的方式加以解決。

暫無
暫無

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

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