2016-03-26 19 views
-1

私はポインタをメインのリンクされたリストの私のアドレスに渡そうとしています。それをメモリに割り当てる関数に渡し、次のノードに移動します。ヘッドノードを壊す。リンクされたリストとポインタ

typedef struct { 
    int data; 
    struct node_list *next; 
}node_list; 

typedef struct { 
    struct node_list *head; 
}list; 

void insert_list(node_list **c, int num); 

void main() 
{ 
    int num; 
    list *list_odd = (list*)calloc(1, sizeof(list)); 
    node_list *c = &list_odd->head; 

    while (num != -1) 
    { 
     if (num % 2) 
      insert_list(c, num); 
    } 
} 

void insert_list(node_list **c, int num) 
{ 
    if (*c == NULL) 
    { 
     *c = (node_list*)malloc(sizeof(node_list)); // it allocates the memory in the right place. 
     (*c)->data = num; 
     (*c) = (*c)->next; // but this step breaks the starting list pointer 
    } 
    else 
    { 
     (*c)->next = (node_list*)malloc(sizeof(node_list)); 
     (*c)->data = num; 
     (*c) = (*c)->next; 
    } 
} 

編集:私は明確にするために、自分自身を説明していないことがあります。私はそれにメモリを割り当てる一方で、リンクリストの先頭に私のリストポイント場合、次に行う(* C)=(* C) - >次に、私の頭はもはや乞食を指していません。私が達成しようとしているのは、リストの開始と次のノードの位置の保存です。

+0

問題がありますか?もしそうなら、それは何ですか?そして、あなたがデバッガを踏んだときに何について知りましたか? –

+1

@ Danzコンパイルでは、タイプnode_listとstruct node_listの互換性のないポインタが使用されているため、メッセージが発行されます。 –

+0

私のリストがリンクリストの先頭を指していて、それにメモリを割り当ててから(* c)=(* c) - >次にすると、私の頭はもはや懇願を指摘しなくなります。私が達成しようとしているのは、リストの開始と次のノードの位置の保存です。 – Dannz

答えて

0

私は両面で単独でリンクされたリストを提案したいと思います。

ここではデモンストレーションプログラムです。

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

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

typedef struct list 
{ 
    node *head; 
    node *tail; 
} list; 

int push_back(list *lst, int data) 
{ 
    node *new_node = malloc(sizeof(node)); 
    int success = new_node != NULL; 

    if (success) 
    { 
     new_node->data = data; 
     new_node->next = NULL; 

     if (lst->tail == NULL) 
     { 
      lst->tail = lst->head = new_node; 
     } 
     else 
     { 
      lst->tail = lst->tail->next = new_node; 
     }    
    } 

    return success; 
} 

void display(list *lst) 
{ 
    for (node *current = lst->head; current != NULL; current = current->next) 
    { 
     printf("%d ", current->data); 
    } 
    printf("\n"); 
} 

int main(void) 
{ 
    list lst = { NULL, NULL }; 

    int data; 

    while (scanf("%d", &data) == 1 && data != -1) 
    { 
     if (data % 2 != 0) push_back(&lst, data); 
    } 

    display(&lst); 

    return 0; 
} 

番号

0 1 2 3 4 5 6 7 8 9 -1 

のこのシーケンスを入力する場合、出力は

1 3 5 7 9 

リストの末尾に新たなノードを追加の複雑さはO(1であるであろう)。

+0

あなたは 'malloc'の戻りコードをチェックして' push_back'から返すのに苦労しましたが、プログラムは引き続き実行され、実際に失敗した場合にクラッシュします;) – Pod

+0

@Podこれはdemontrativeプログラムです。アプローチ。必要に応じて、プログラムに追加のチェックとメソッドを追加できます。 –

+0

@Podところで、実際にノードを追加しなくてもプログラムがクラッシュすることはありません。リストは単に空になります。 –

0

私が達成しようとしているのは、リストの開始と次のノードの位置の保存です。

あなたは何をしようとしているのかよくわからないので、同等のプログラムを作成しました。この方法をリストに追加するのが遅すぎるとわかった場合は、プログラムを変更して{head、tail}のペアを維持するか、項目をリストの先頭に追加する必要があります。あなたのテキストから、あなたは頭を同じように保つように思えます - それで、{頭、尾}のペアがおそらく最高です。

#include <stdlib.h> //added 
#include <stdio.h> //added 
#include <assert.h> 

typedef struct node_list_t { //changed 
    int data; 
    struct node_list_t *next; //changed 
} node_list; 

typedef struct list_t { //gave the struct a tag 
    node_list *head; //use the typedef name, not the struct name 
}list; 

void insert_list(list *my_list, int num); 

void main() 
{ 
    int num = 0; // initialised 
    list my_list = {0}; // changed to be on stack. Could be calloc'd if you like 
    node_list* printer; 

    while (num != 50) //changed limit 
    { 
     if (num % 2) 
     { 
      // we're just passing in the list 
      insert_list(&my_list, num); 
     } 

     num += 1; //actually incrementing number. :) 
    } 


    for (printer = my_list.head; 
      printer; 
       printer = printer->next) 
    { 
     printf("%d\n", printer->data); 
    } 
} 

void insert_list(list *my_list, int num) 
{ 
    node_list *c = (node_list*) calloc(1, sizeof(node_list)); 
    c->data = num; 

    assert(!c->next); 

    if (!my_list->head) 
    { 
     // if the head is not initialised, then make C the head 
     my_list->head = c; 
    } 
    else 
    { 
     // otherwise stick it on the end of the list. 
     node_list *p; 
     for (p = my_list->head; 
       p->next; 
        p = p->next) 
     { 
      //do nothing 
     } 
     p->next = c; 
    } 
} 
関連する問題