2016-03-22 13 views
-3

いくつかの関数が与えられていますが、主なメソッドが動作するように見えます(マスターリスト)。私はあなたが1マスターリストとinsert_at_frontそれに追加するが、それだけの最初のリスト(10)を印刷することが起こると思います。誰もがリンクされたリストを取得する方法を知っていますか?事前に感謝:)リンクされたリスト(構造体へのポインタ)の作成方法-c

#include <stdlib.h> 
#include "week1.h" 

void insert_at_front(List *self, int data) 
{ 
    List newNode = (List)malloc(sizeof(struct node)); 
    newNode->data = data; 
    newNode->next = *self; 
    *self = newNode; 

} 

void print_list(List *self) 
{ 
    List current = *self; 

    while (current != NULL) 
    { 
     printf("%d\n", current->data); 
     current = current->next; 
    } 
    printf("\n"); 
} 

int main(void) 
{ 

    List *master; 


    insert_at_front(&master, 10); 
    insert_at_front(&master, 20); 

    print_list(&master); 

    return 0; 
} 

ヘッダー:あなたのstruct nodeへのポインタとして

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

void print_list(List *self); 
void insert_at_front(List *self, int data); 
+1

チュートリアル[ここ](http://pastebin.com/HC1DLK4M) – sp2danny

+1

それは重複しません@manniL。 OPは、コードが期待していることをやっていない理由を尋ねています。彼女は "リンクされたリストはどういう仕組みになっていますか"についての説明を求めていません。 – muXXmit2X

答えて

1

あなたtypedefedListのでList *masterの宣言は、実際nodeへponterへのポインタです。 master&master)のアドレスを取得すると、nodeへのポインタへのポインタへのポインタが取得されます。なく、かなりあなたは:)

編集nodeへのポインタにmasterの宣言を変更する必要があるし、それのアドレスに

List master; // before: List* master 

insert_at_front(&master, 10); 
insert_at_front(&master, 20); 

print_list(&master); 

を取得したいもの:

をも<stdio.h>を含めますprintfを使用しています。あなたがmallocを呼び出しますがfreeを呼び出すことはありませんでメ​​モリを割り当てているので、あなたもmemory leakを作成している時点では


通常、あなたができることは、最初にメモリを割り当てたものを書いた直後にメモリを解放するためのクリーンアップ関数を書くことです。クリーンアップは次のようになります。

void delete_list(List* self) 
{ 
    while ((*self)->next) 
    { 
    List tmp = *self; 
    List last; 
    while (tmp->next != NULL) 
    { 
     last = tmp; 
     tmp = tmp->next; 
    } 
    free(last->next); // delete the last node in the list 
    last->next = NULL; 
    } 
    free(*self); // now delete the only existing node 
} 
+0

おかげさまで、ポインタ部分とちょっと混乱しましたが、図を描きました。ありがとうございます:) 2番目の部分についても、私はすべてのローカル変数が関数呼び出しの後に削除されると思いましたか? (cは呼び出し言語による呼び出しですか?おそらく間違っています) – BriannaXD

+0

また、構造体へのポインタを持つ点は何ですか?ばかげた疑問ですが、構造体を持つだけでなく、構造体へのポインタを持っていればいいのでしょうか?もう一度ありがとう:) – BriannaXD

+0

@BriannaXD変数がスタックに割り当てられている場合にのみ、スコープの終わりに達すると自動的に削除されます。ヒープ上に手動でメモリを割り当てる場合、解放する必要があります。そうしないと、ローカルポインタが削除されますが、ヒープ上にメモリがまだ割り当てられていません。今ポインタのものに。ポインタを使用する必要はありませんが、スタックより多くのメモリが必要な場合に便利です。スタックよりも大きなヒープ上のメモリチャンクへのポインタを使用することができます。いい? – muXXmit2X

関連する問題