0

私は学校のプロジェクトに取り組んでおり、二重にリンクされたリストと構造体をもう少しよく理解しようとしています。現在、新しいリンクリストを作成する関数を実装しようとしています。そこから仕事ができると思うからです。

typedef struct ListItem {
    struct ListItem *previousItem; //pointer to previous item, NULL if first list item
    struct ListItem *nextItem;     //pointer to next item, NULL if first list item
    void *data;                    //pointer to data

これは、作成しようとしている双方向リンク リストの構造体です。「void *」は何かへのポインターを保持できること、またリスト項目に格納されているデータを割り当てる必要があることも知っています。

/**
 * This function starts a new linked list. Given an allocated pointer to data it will    return a
 * pointer for a malloc()ed ListItem struct. If malloc() fails for any reason, then this function
 * returns NULL otherwise it should return a pointer to this new list item. data can be NULL.
 *
 * @param data The data to be stored in the first ListItem in this new list. Can be any valid 
 *             pointer value.
  * @return A pointer to the malloc()'d ListItem. May be NULL if an error occured.
 */

ListItem *NewList(void *data);

私は malloc() が使用するために十分なメモリをスタックに割り当てることを知っているので、私の関数では malloc() *previousItem、*nextItem、および *data (6 バイトになるでしょうか?) を実行する必要があると思います。関数を実装するには、ListItem 構造体をコピーするだけですか? リスト内の唯一の項目であるため、前の AND 次の項目は NULL ポインターになり、*data が入力になると思います。誰かが私のコードがどのように見えるかを教えてくれますか?

4

1 に答える 1

2

あなたは正しい軌道に乗っています。6の引数としてを使用する代わりに、割り当てる必要があるメモリの量を取得するためにmalloc使用できます。たとえば、次のようになります。sizeof

ListItem *node = malloc(sizeof(ListItem));

その後の実装はかなり簡単です。

/* Make sure that allocation succeeded */
...
/* Assign the right values to previousItem and nextItem */
...
/* Assign the right value to data */
...
/* Return the pointer to the new list */
...

他の誰かがおそらく完全な機能を提出するでしょうが、何が起こる必要があるかについてのあなたの英語の説明は適切です(ヒープ全体とスタックの問題以外)。

于 2013-05-15T20:59:52.350 に答える