2014-02-25 78 views
0

main函數中,我用n = 50和next = NULL構成一個節點。當我將add添加到鏈表時,儘管它已被添加,但它在遍歷時不會顯示。發生這種情況的原因是因爲當調用add函數時,指向具有50的節點的start指針未更新爲指向具有10的新節點。 (第28行到第34行)。在c中鏈接列表遍歷

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

typedef struct node 
{ 
    int n; 
    struct node* next; 
} node; 

void traverse(node* start) 
{ 
    while(true) 
    { 
     printf("%i\n",start->n); 
     start = start->next; 
     if(start == NULL) 
     { 
      break; 
     } 
    } 
} 

void add(int num, node* start) 
{ 
    node* previous = NULL; 
    node* current = start; 
    if(num<current->n) 
    { 
//------------------------------------------------------------------------------ 

     //The problem is inside this if block. 
     node* tmp = malloc(sizeof(node)); 
     tmp->next = current; 
     current = tmp; 
//------------------------------------------------------------------------------- 

    } 
    else 
    { 
     while(true) 
     { 
      previous = current; 
      current = current->next; 
      if(current == NULL) 
      { 
       node *tmp = malloc(sizeof(node)); 
       tmp->n = num; 
       tmp->next = NULL; 
       previous->next = tmp; 
       break; 
      } 
      else 
      { 
       if(current->n > num) 
       { 
        node *tmp = malloc(sizeof(node)); 
        tmp->n = num; 
        tmp->next = current; 
        previous->next = tmp; 
        break; 
       } 
      } 
     } 
    } 
} 
int main(void) 
{ 
    node* start = malloc(sizeof(node)); 
    start->n = 50; 
    start->next = NULL; 
    add(10,start); 
    traverse(start); 
} 

我該如何解決這個問題?

+2

你的函數應該能夠正確地管理一個* empty *列表(即空頭指針)。在'main()'中加載一個導入哨兵noad'start'的柺杖最好是脆弱的,結果函數依賴於它(例如:如果傳遞NULL指針,'traverse'將調用UB)。而你的'add()'比它需要的時間長大約85%。 – WhozCraig

+0

@WhozCraig在add()中我需要'current'和'previous'嗎?我怎樣才能縮短'add()'? –

+1

沒有。你可以用一個臨時指針和一個指向指針(你將作爲參數傳遞)來做到這一點。 [**現場直播**](http://ideone.com/OwzYFk) – WhozCraig

回答

3

您需要將指針作爲指針傳遞給add函數中的指針,以便您可以在指定的位置準確地修改它。宣言應該看起來像void add(int num, node** start)

此外,您應該注意在程序結束前釋放分配給列表的內存。