2013-04-16 150 views
2

經過近3年,我開始重新學習C創建排序的鏈接列表

我創建了一個Linked list,並且希望將其擴展爲創建排序鏈接列表。這裏是我的代碼:

typedef struct node{ 
int data; 
struct node *ptr; 
}node; 

node* insert(node* head, int num){ 
node *temp,*prev,*next; 
temp = (node*)malloc(sizeof(node)); 
temp->data = num; 
temp->ptr = '\0'; 
if(head=='\0'){ 
    head=temp; 
}else{ 
    next = head; 
    prev = next; 
    while(next->data<=num){ 
     prev = next; 
     next = next->ptr; 
    } 
    if(next==NULL){ 
     prev->ptr = temp; 
    }else{ 
     temp->ptr = prev->ptr; 
     prev-> ptr = temp; 
    } 

} 
return head; 
} 

void main(){ 
int num; 
node *head, *p; 
head = '\0'; 
do{ 
    printf("Enter a number"); 
    scanf("%d",&num); 
    if(num!=0) 
     head = insert(head,num); 
}while(num!=0); 
p = head; 
printf("\nThe numbers are:\n"); 
while(p!='\0'){ 
    printf("%d ",p->data); 
    p = p->ptr; 
} 
} 

這是我的想法。我遍歷列表,直到找到一個數字>=爲止。我將前一個節點存儲在prevnext節點中包含當前值。如果接下來是null,那麼列表結束並且列表中的數字是最高的,因此它將被插入到最後的位置,如果該數字是中間的某個位置,則prev節點的地址部分被存儲在臨時節點中地址部分現在臨時節點指針保存下一個節點的地址。

編輯:我的代碼問題是如果我輸入1,2我得到錯誤信息爲a.exe has stopped working。我正在使用MinGW進行編譯。我打破了循環時,用戶輸入0

+2

''\ 0''與NULL不相同。 http://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0 – mohit

+0

@mohit,''\ 0''將和'NULL'完全一樣。它在語義上並不真正有意義,但它應該沒問題。 –

回答

3

你必須改變線路

while(next->data<=num) 

while(next!='\0' && next->data<=num) 

當您插入第二個元素next'\0'在第二迭代試圖讓datanext->data一起導致分段錯誤。

隨着改變的狀況中,而如果next!='\0'將爲假(因此next=='\0')的同時被中止並且由於&&的短路next->data不計算。


編輯

你在你的代碼更多的問題。

如果你看看輸入2 1 0那麼具有正確工作的程序的輸出應該是1 2,但它的代替是2 1。問題在於,在你的insert函數中,你不會考慮插入當前最小元素的情況,它將成爲新的頭部。

另一個問題是你最終沒有釋放內存,導致內存泄漏。

我改變你的代碼正確行爲:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node{ 
    int data; 
    struct node *ptr; 
} node; 

node* insert(node* head, int num) { 
    node *temp, *prev, *next; 
    temp = (node*)malloc(sizeof(node)); 
    temp->data = num; 
    temp->ptr = NULL; 
    if(!head){ 
     head=temp; 
    } else{ 
     prev = NULL; 
     next = head; 
     while(next && next->data<=num){ 
      prev = next; 
      next = next->ptr; 
     } 
     if(!next){ 
      prev->ptr = temp; 
     } else{ 
      if(prev) { 
       temp->ptr = prev->ptr; 
       prev-> ptr = temp; 
      } else { 
       temp->ptr = head; 
       head = temp; 
      }    
     } 
    } 
    return head; 
} 

void free_list(node *head) { 
    node *prev = head; 
    node *cur = head; 
    while(cur) { 
     prev = cur; 
     cur = prev->ptr; 
     free(prev); 
    }  
} 

int main(){ 
    int num; 
    node *head, *p; 
    head = NULL; 
    do { 
     printf("Enter a number"); 
     scanf("%d",&num); 
     if(num) { 
      head = insert(head, num); 
     } 
    } while(num); 
    p = head; 
    printf("\nThe numbers are:\n"); 
    while(p) { 
     printf("%d ", p->data); 
     p = p->ptr; 
    } 
    free_list(head); 
    return 0; 
} 

我的代碼中看到https://ideone.com/wT5iQ8在testinput連同正確的輸出。

+1

爲什麼要比較一個字符的指針?無論如何,只要'while(next && next-> data <= num)'就足夠了。 –

+1

@FredLarson你說得對,OP應該使用'NULL'而不是''\ 0'',但我想盡可能少地改變他的代碼:)。它也適用於''\ 0''。 – halex

+0

是的,它會工作,但... blech。 –