2009-08-06 7 views
11

これは、Cプログラミング言語のリンクリストのコードです。Cで構造体を使用するには?

#include <stdio.h> /* For printf */ 
#include <stdlib.h> /* For malloc */ 

typedef struct node { 
    int data; 
    struct node *next; /* Pointer to next element in list */ 
} LLIST; 

LLIST *list_add(LLIST **p, int i); 
void list_remove(LLIST **p); 
LLIST **list_search(LLIST **n, int i); 
void list_print(LLIST *n); 

コードは完成していませんが、私の質問には十分だと思います。ここでは、structノードの最後に "LLIST"が使用され、関数list_addのプロトタイプでは戻り型としても使用されます。何が起こっている?

答えて

6

typedefは、プログラム内に新しい "型"を作成するので、戻り値とそれらの関数のパラメータの型は構造体に過ぎません。このタイプのためにstruct nodeを使用するのはちょうど省略形です。

新しいノードを作成した場合、あなたはこの(タイプを使用して)のようにそれを行うことができます。また

LLIST *node = malloc(sizeof(LLIST)); 
node->data = 4; 
node->next = someOtherItem; 
list_add(node, 1) 

、あなたの質問内の関数のプロトタイプで、あなたが本当に二重の必要はありませんポインタ;あなたの構造体のデータがちょうどintているので、あなたが

LLIST *list_add(int data, int position); 

ような何かを行うことができ、その後list_add機能は、割り当てを扱う構造体にintをコピーして、リンクリストに追加します。

それを特定の位置に置くことは、そのノードの前のノード内のポインタを新たに割り当てられたノードのアドレスに変更するのと同じくらい簡単であり、新しいノードのnextポインタは、そのノードが最初に指し示される前のノード)。

残りの関数プロトタイプがあれば、それらをすべて削除するために作成したすべてのノードへのポインタを追跡する必要があります。

検索機能がどのように機能するのか分かりません。この全部をもっと良く実装することができます。 は、ノードを作成するときにノードの場所を指定するためにを持たないでください(ノードよりも高い数値を指定するとどうなりますか?)

10

LLISTは、作成された構造体の別の型名です。

typedef struct x { ... } NAME; 
23

typedefです:一般的には、次の形式は、「構造体X」であるタイプ「NAME」を作成します。それは実際には一度に2つのことをしています。まず、それは構造を定義します。その後、

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

とはtypedefを行います。

typedef struct node LLIST; 

LLISTstruct nodeの省略形ですちょうどintまたはFILEまたはcharのようなタイプ、であることを意味し、あなたのリンクリストノード構造。これは必須ではありません。LLISTstruct nodeと置き換えることができますが、読みやすく、迷惑なエンドユーザーから実装を隠すのに役立ちます。

10

Cでは、 "struct"という接頭辞を持つ構造体を参照する必要があります。したがって、あまり冗長な表現ではないtypedefを導入するのが一般的です。ある

は、あなたの構造体の宣言は、2つの部分があり、そのように書き換えることができます。

struct node { 
    int data; 
    struct node *next; /* pointer to next element in list */ 
}; 

typedef struct node LLIST; 

ので、LLISTstruct node(感謝クリスルッツ)の別名です。

3

LLIST*は、LLIST構造体で定義された構造体へのポインタです。

あなたはこのリストに割り当てられたいくつかのメモリを持っている

LLIST* myList = malloc(sizeof(LLIST)*number_of_elements); 

を行う必要があります。アイテムを追加したり削除したりするには、reallocを使用してメモリを再割り当てする必要があります。私は既にリスト(配列で作られたもの)用のコードを書いています。

私が家にいるとすぐにコードを掲載するかもしれませんが、現在はそうではありません。

+0

技術的には、各項目に対して「malloc」を実行する必要がありますそれは厳密にはリストではなく、リスト内の次の項目へのポインタ( '* next')を持つ構造体であるため、リスト内にあります。したがって、各リスト項目の作成時に別々のmallocを実行します。 – wizzwizz4

関連する問題