2015-06-25 54 views
0

我想寫插入數字(從用戶)功能的節點(每個節點1號)的鏈接列表,然後將它們排序,按照升序方式。 我寫了這個功能:排序按照升序方式

void insertnode(struct n_node *head) 
{ 
    struct n_node *temp = head; 
    int number; 
    printf("Please insert a number to the node\n"); 
    scanf("%d", &number); 
    while (number != SENTRY) 
    { 
     while ((temp->next != NULL) && (temp->next->num < number)) 
     { 
      temp = temp->next; 
     } 
     struct n_node *addNode = (struct n_node*)malloc(sizeof(struct n_node)); 
     addNode->num = number; 
     if (temp->next == NULL && number < temp->num) 
     { 
      addNode->next = temp; 
      head = addNode; 
     } 
     else 
     { 
      addNode->next = temp->next; 
      temp->next = addNode; 
     } 
     temp = head; 
     scanf("%d", &number); 
    } 
    options(); 
} 

它編譯但右後我插入第一個數字是停,讓我在這條線突破的消息,並指出:

while ((temp->next != NULL) && (temp->next->num < number)) 

沒有出現在錯誤列表,任何幫助表示讚賞,謝謝!

+0

請[爲什麼不投(http://stackoverflow.com/q/605845/2173917)()''中的malloc C'的'返回值和家庭。 –

+0

此外,總是檢查'malloc()'成功 –

+1

請注意,您無法通過新節點更新到列表的開頭。 – BLUEPIXY

回答

2

在你的算法,你是不是在正確的順序測試的特殊情況:

  • 如果列表是空的,headNULL和測試temp->next != NULL調用未定義的行爲。
  • 如果數量比第一個節點的數量少,也沒有必要去嘗試,並遍歷目錄,節點需要在頭部被插入。

你應該首先分配新節點和一個測試檢查特殊情況:

struct n_node *addNode = malloc(sizeof(struct n_node)); 
addNode->num = number; 

if (head == NULL || number < head->num) { 
    addNode->next = head; 
    head = addNode; 
} 

否則,你的迭代循環是正確的,該節點是當你到達被temp後插入假條件:

while (temp->next != NULL && temp->next->num < number) { 
     temp = temp->next; 
    } 
    addNode->next = temp->next; 
    temp->next = addNode; 

循環變得簡單多了:

void insertnode(struct n_node **headp) { 
    struct n_node *head = *headp; 
    int number; 
    printf("Please insert a number to the node\n"); 

    while (scanf("%d", &number) == 1 && number != SENTRY) { 
     struct n_node *addNode = malloc(sizeof(struct n_node)); 
     if (addNode == NULL) { 
      printf("out of memory\n"); 
      return; 
     } 
     addNode->num = number; 

     if (head == NULL || number < head->num) { 
      addNode->next = head; 
      *headp = head = addNode; 
     } else { 
      struct n_node *temp = head; 
      while (temp->next != NULL && temp->next->num < number) { 
       temp = temp->next; 
      } 
      addNode->next = temp->next; 
      temp->next = addNode; 
     } 
    } 
    options(); // head is not passed to the function? 
} 

還要注意在API的變化,使功能更新呼叫者的範圍列表頭,變更後的文件或補充一個神奇的數字非數字輸入月底停止掃描數字。

+1

你的'臨時'未被聲明。 – Jokerah

+0

此功能也不起作用,因爲當我嘗試向節點輸入一個數字時,它會得到兩個數字,然後再次停止。 – Jokerah

+0

@Jokerah:你準確地輸入了什麼? – chqrlie