2016-11-29 41 views
0
struct node { 
    struct node *next; 
    int num; 
} Node; 


Node *insert(int i) { 
    Node *head; 
    for (int c = 0; c < i; c++) { 
     head = malloc(sizeof(Node)); 
     head.num = i; 
     head = head->next; 
    } 
} 

插入函數應該創建一個鏈表,並將從0到i的數字添加到該鏈表中。但是,它也應該返回一個指向列表/列表本身開始的指針,我似乎無法弄清楚如何去做。我試過製作一個指針並在添加第一個節點後將其設置爲等於head,但它只返回第一個節點而不是整個列表。有人可以幫忙嗎?謝謝。添加節點後返回指向鏈接列表開頭的指針?

+0

你最大的問題是你沒有給head-> next分配任何值,所以你根本就沒有創建鏈表,只是一堆節點在空間中漂浮 – happydave

+0

我不確定我理解。因爲我正在重新分配頭部,head-> next的num值不會是1嗎?所以它會是一個0-> 1-> 2-> 3 .....-> c的鏈表,對嗎? –

+0

當你分配'head = head-> next;'你分配一個未初始化的指針到你剛分配的指針上。你泄漏了內存並存儲了一個未定義的指針。你有大問題。該函數也應該返回一個值,但不是。 –

回答

0

您可能想要記住前一個節點,因此您可以分配其下一個指針。當你添加一個節點時,將其下一個指針設置爲舊的頭,現在它成爲列表的新頭。你可以在循環的最後一次迭代之後返回。

Node *insert(int i) { 
    Node *head, *prev = NULL; 
    for (int c = 0; c < i; c++) { 
     head = malloc(sizeof(Node)); 
     head->num = i; 
     head->next = prev; 
     prev = head; 
    } 
    return head; 
} 

更新:插入在列表的末尾每一個新的元素,你需要更多的簿記:

Node *insert(int i) { 
    Node *last_node = NULL; 
    Node *first_node = NULL; 
    for (int c = 0; c < i; c++) { 
     Node *node = malloc(sizeof(Node)); 
     node->num = i; 
     node->next = NULL; 
     if (!last_node) { 
      // Remember the first node, so we can return it. 
      first_node = node; 
     } 
     else { 
      // Otherwise, append to the existing list. 
      last_node->next = node; 
     } 
     last_node = node; 
    } 
    return first_node; 
} 
+0

這工作,但列表現在從我到0而不是0到我。有什麼辦法可以使它不顛倒列表的順序? –

+0

@ P.Sate:是的,它可以完成。你應該可以做到。您需要保留一個指向列表中最後一個項目的指針,以及第一個項目。您將返回第一個,但在最後一個之後添加新項目。 –

0

這是因爲引入另一個變量一樣簡單。您目前有head來跟蹤列表的頭部;添加其他跟蹤列表

struct node { 
    struct node *next; 
    int num; 
} Node; 

Node *insert(int i) { 
    Node *head; 
    Node *tail; 
    head = malloc(sizeof(Node)); 
    head.num = 0; 
    tail = head; 
    for (int c = 1; c < i; c++) { 
     // allocate a new node at the end of the list: 
     tail->next = malloc(sizeof(Node)); 
     // set "tail" to point to the new tail node: 
     tail = tail->next; 
     tail->num = c; 
    } 

    return head; 
} 

你也可以,如果有必要增加一個特殊的案例i == 0

順便說一句 - 我意識到這可能是給你一個練習的任務 - 但insert是一個實際上創建和填充一個全新列表的函數的可怕名稱。