2016-08-01 16 views
-3

私は単独でリンクされたリストに取り組んでおり、問題を解決することができません(問題はNULLポインタを使って関数を追加していると思います)。問題はリストに最初の数値を追加して残りをスキップすることです関数の追加の呼び出しの。理解できません

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

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

struct node* head = NULL; 

int add(int val) 
{ 
    if(head == NULL) 
    { 
    head = (struct node*)malloc(sizeof(struct node)); 
    head->i = val; 
    } 
    else 
    { 
    struct node* current = head; 
    while(current != NULL) 
    { 
     current = current->next; 
    } 
    current = (struct node*)malloc(sizeof(struct node)); 
    current->i = val; 
    } 
} 

int print(struct node* first) 
{ 
    while(first != NULL) 
    { 
    printf("%d\n",first->i); 
    first = first->next; 
    } 
} 

int main() 
{ 
    add(36); 
    add(46); 
    add(97); 
    print(head); 
    return 0; 
} 
+1

@underscore_dこれはC++と呼ばれています。リンクされたリストを尋ねる人々を止めようとするなら、ここでは無関係です。 – immibis

答えて

2

2つの問題があります。まず、新しいノードを作成するときに、nextをNULLに設定しないでください。だからリストを反復すると、ゴミデータの読み込みが終了し、undefined behaviorが呼び出されます。

次の問題は、空でないリストを反復処理すると、リストの末尾が「脱落」するため、ループの最後にcurrentがNULLであり、リストの最後にリンクがないことです。 current->nextがヌルのときに停止してから新しいノードを作成する必要があります。

void add(int val)  // change return type to void since nothing is being returned 
{ 
    if(head == NULL) 
    { 
    head = malloc(sizeof(struct node)); // don't cast return value of malloc 
    head->i = val; 
    head->next = NULL;     // terminate list 
    } 
    else 
    { 
    struct node* current = head; 
    while(current->next != NULL)   // loop until you're on the last node 
    { 
     current = current->next; 
    } 
    current->next = malloc(sizeof(struct node)); 
    current->next->i = val; 
    current->next->next = NULL;   // terminate list 
    } 
} 
+0

私は、初期化されていないポインタがcのNULLポインタと同じだと思っていました。 –

+0

@neeraj_nigam 'calloc'で各ノードを初期化するオプションもあります。詳細は、[here](http://en.cppreference.com/w/c/memory/calloc)を参照してください。呼び出し構文は少し異なりますが、あまりにもクレイジーではありません。 – callyalater

2

あなたは(両方head->nextcurrent->nextパスのため)NULLnode->nextを設定されることはありません。 mallocを使用して割り当てを行っても、割り当てられたメモリはクリアされないため、これを自分で行う必要があります。あなたは第二の要素を追加するときcurrentNULLに達するまで

はまた、あなたが反復されていますが、新しい要素を指すようにprevious_node->nextを設定することはありませんので、あなたは決して実際に「リンク」あなたのリンクリストで何か。

また、shouldn't cast the result of malloc in Cです。

2

あなたが目以降のノードを追加することの効果が表示されていない主な理由は、あなたがヘッドノードではない新しいノードを割り当てるとき、あなただけのローカル変数にポインタを格納していることであるcurrent機能のadd()代わりに、前のノードのポインタnextに格納する必要があります。また@Lousyも観察されるように、あなたがNULLに新しいノードのnextポインタを設定しない、ということ

struct node* current = head; 
    while (current->next != NULL) { 
     current = current->next; 
    } 
    current->next = malloc(sizeof(*current->next)); 

注:元のコードでこれを比較してください。これらのフィールドに値を割り当てるまで、その内容は不確定です。

関連する問題