2016-11-29 4 views
0

insert関数は、リンクリストを作成し、そのリンクリストに0からiまでの数字を追加することになっています。しかし、それはまた、リスト/リスト自体の先頭へのポインタを返すことになっているので、それを行う方法を理解できないようです。私は、最初のノードを追加した後にポインタを作成して先頭に設定しようとしましたが、リスト全体ではなく最初のノードのみを返します。誰かが助けてくれますか?ありがとう。ノードを追加した後にリンクリストの先頭にポインタを戻していますか?

+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

これは動作しますが、リストはiから0からiではなく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は実際に作成して完全に新しいリストを埋め込む関数のひどい名前です。

関連する問題