簡體   English   中英

鏈表中的排序插入程序

[英]Sorted insert program in a linked list

我是數據結構的初學者,現在正在學習鏈表。 我遇到了一個關於排序插入的程序,其中我有一個 add() function 以按排序順序添加節點

         /*Linked List program to add ascending order sorted nodes in     

         the list */
 #include <stdio.h>
  #include <stdlib.h>
enter code here
 struct node {
   int data ;
   struct node link;

 };

 void add(struct node **q,int num){
    struct node *r,*temp = *q;
    r = malloc(sizeof(struct node )); //Data Allocated
    r->data = num;

    if(*q==NULL ||(*q)->data >num){
     *q = r;
     (*q)->link = temp;

    }else{
      while(temp !=NULL){
         if(temp->data <=num &&(temp->link->data >num                    
                                             ||temp->link==NULL)){
             r->link = temp->link;
             temp->link=r;
             return;
         }
          temp = temp->link;
      }

    }

 }

 void main(){
 struct node *p;
 p = NULL;

 }

我希望按升序添加節點,但是當我輸入數據時會顯示錯誤。我正在使用代碼塊在 C 中運行程序

我認為它必須與結束條件 temp->link == null 相關,但我無法確定該部分代碼的確切條件。請幫助!

  1. 結構struct node的定義不正確。 我認為這是一個錯字。 它應該是struct node *link;

  2. 您遍歷循環的條件不正確。 如評論中所述,您正在訪問temp->link以防它可能是NULL

  3. 您沒有檢查要添加的數字大於所有數字並且要添加到列表末尾的條件。

修改后的 function 如下。

 void add(struct node **q,int num){
    struct node *r,*temp = *q;
    r = malloc(sizeof(struct node )); //Data Allocated
    r->data = num;
    r->link = NULL;

    if(*q==NULL ||(*q)->data >num){
     *q = r;
     (*q)->link = temp;

    }else{
      while(temp->link !=NULL){
         if(temp->data <=num &&(temp->link->data >num)){
             r->link = temp->link;
             temp->link=r;
             return;
         }
         temp = temp->link;
      }
      temp ->link = r; // add at the end as not added at any other location.
    }
}

除了Rishikesh Raje回答(您需要在 struct: struct node* link;內使用指針;您需要首先檢查link是否為 null,然后訪問link->data ),循環可以簡化很多:

// advance only, if we need to insert (at least) after temp->link:
while(temp->link && temp->link->data <= num)
{
    temp = temp->link;
}
// once the loop is done, temp points to the last element smaller than num, so:
r->link = temp->link;
temp->link = r;

在此期間,我們不需要檢查temp->data > num 如果之前滿足循環條件,我們只重新進入循環,它已經准確地檢查了這個條件; 仍然是第一個循環運行; 但是,在這種情況下,循環之前的if已經覆蓋了條件。

旁注:是否需要在現有元素之后插入新元素? 如果沒有,在前面插入會更快一些,您只需將<=替換為<並將>替換為>= ...

你應該使用

( temp->link == NULL || temp->link->data > num )

代替

( temp->link->data > num || temp->link == NULL )

因為如果 temp->link 是 NULL,第一個代碼在檢查第一個條件后立即返回 true,不會檢查第二個條件,因此不會出錯。 但是當你像在第二個表達式中那樣使用它時,如果 temp->link 是 NULL,你會得到一個錯誤,因為你試圖使用代碼到達 NULL ZA8CFDE6331BD59EB2AC666F8911C4B 的名為“數據”的字段

temp->link->data

暫無
暫無

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

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