2017-08-03 67 views
0

我對數據結構太新了,實際上我昨天才開始。下面是代碼:鏈接列表出現問題(添加和打印)

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

struct node 
{ 
    int x; 
    node *next; 
}; 

void addToList(node *r, int a); 
void printList(node *r); 
int main() 
{ 
    node *root; 
    root = NULL; 

    for (int i = 0; i < 5; i++) 
    { 
     int a; 
     scanf("%d", &a); 
     addToList(root, a); 
    } 

    printList(root); 

    return 0; 
} 

void addToList(node *r, int a) 
{ 
    while (r != NULL) 
     r = r -> next; 

    r = (node *)malloc(sizeof(node)); 
    r -> x = a; 
    r -> next = NULL; 
} 

void printList(node *r) 
{ 
    while (r != NULL) 
    { 
     printf("%d ", r -> x); 
     r = r -> next; 
    } 

    printf("\n"); 
} 

我希望程序獲取新的5元到列表中,然後打印它們。但該計劃的結束沒有發生。我的錯是什麼?

+0

應該'空隙addToList(節點* R,INT A){ 而(!R->下一= NULL) R = R - >下; r-> next =(node *)malloc(sizeof(node)); r-> next-> x = a; r-> next-> next = NULL; }' – roottraveller

+0

抱歉,但沒有奏效。 – Atreidex

+0

它定義了第一個元素後工作。我應該永遠定義第一個元素嗎?沒有辦法完全清空列表? – Atreidex

回答

1

您有root = NULL但您的addtoList函數檢查是否root !=NULL。所以測試失敗了,沒有增加。 你應該有這樣的事情,而不是:

void addToList(node *r, int a) { 
     struct node *temp; 
     temp=(struct node *)malloc(sizeof(struct node)); 
     temp->data = a; 
     if (r== NULL) { 
      r = temp; 
      r->next = NULL; 
     } 
     else { 
      temp->next = r; 
      r = temp; 
     } 
} 
+0

但while循環檢查我們是否在最後一個元素。 – Atreidex

+0

第一次運行時,root = null,測試將失敗。 – Mekicha

+0

@Mekicha它仍然不會改變'root'指向的地方。 – SHG

1

的問題是在addToList()功能。如果您想更新列表的根節點,你必須像定義你的函數:

void addToList(node **r, int a) 

否則,你要發送的指針root,做任何你在函數內部做。但它不會影響root的值main(),它仍然是NULL

如果要更改指針的值,則必須從main()發送指向函數==>addToList(&root, a);的地址。

所以現在我們可以更新root指向哪裏。但這還不夠,因爲你想root總是指向列表的開始==>你只想在第一次調用addToList()時更新它。

最後一個問題是將新創建的節點添加爲列表中的最後一個節點。您可以通過將臨時指針保存到最後一個節點來實現這一點。見我的評論的代碼(標誌着我與<<<變化):

void addToList(node **root, int a)     <<< 
{ 
    node *r = *root;         <<< 
    node *last = NULL;        <<< 

    while (r != NULL) { 
     last = r;         <<< 
     r = r -> next; 
    } 

    r = (node *)malloc(sizeof(node)); 
    r -> x = a; 
    r -> next = NULL; 
    if (last == NULL) {        <<< 
     // this is true only on the first call to 
     // addToList, so we update root only once 
     *root = r; 
    } else { 
     // all other times we add the new node to be the last one 
     last->next = r; 
    } 
} 
1

在這裏,第一個錯誤是,你還沒有采取*root指針變量作爲全球性的,所以它不會更新*root時的值插入一個新節點。它將保留*root的值爲NULL

下面的代碼有它的評論,這將解釋你很容易做的各種錯誤。

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

struct node 
{ 
    int x; 
    node *next; 
}; 
node *root;  //Declaring the *root as global 

void addToList(int a); 
void printList(); 
//removing the *root as parameter from both the functions 

int main() 
{ 
    root = NULL; 
    for (int i = 0; i < 5; i++) 
    { 
    int a; 
    scanf("%d", &a); 
    addToList(a); 
    } 
    printList(); 
    return 0; 
} 

void addToList(int a) 
{ 
    //Declaring a temporary pointer(*temp) to avoid the value loss of the *root pointer 
    node *temp=root; 

    //Declaring a new node to save the data taken from the user 
    node *nn = (node *)malloc(sizeof(node)); 

    //Assigning the values to the new node(*nn) 
    nn->x=a; 
    nn->next=NULL; 

    //Checking that the root node is NULL or not 
    //If root is empty, then new node is assigned to *root 
    if(root == NULL) 
    { 
     root=nn; 
    } 
    //Else, we will first find the last node of the linklist using the *temp pointer 
    else 
    { 
     while (temp->next != NULL) 
      temp = temp -> next; 

     //Assigning the new node after the last node of the linklist 
     temp->next=nn; 
    } 
} 

void printList() 
{ 
    node *r=root; 
    while (r != NULL) 
    { 
     printf("%d ", r -> x); 
     r = r -> next; 
    } 
    printf("\n"); 
}