簡體   English   中英

如何在C中創建結構的鏈表

[英]how to create a linked list of structs in c

我有3種類型的結構:書本,CD(在CD中,我有結構“ song”-,CD包含歌曲列表)和DVD。

我需要創建商店產品的鏈接列表。我的問題是如何在不知道指針是哪種類型的情況下創建產品列表。 它可以是書籍,CD或DVD。

(我不能使用工會。)

您需要為數據集使用空指針。 這是我的鏈表結構中的一小段代碼,我根據需要使用了修改的代碼:

#define CD 1
#define DVD 2
#define BOOK 3

/* Structure for linked list elements */
typedef struct ListElmt_ {
        void *data;
        unsigned datatype;    /* variable to know which data type to cast as */
        struct ListElmt_ *next;
} ListElmt;

#define list_data(element) ((element)->data)

使用void指針將數據打包到列表中,現在您可以測試數據類型變量並根據需要取消廣播。 我使用宏返回列表數據(上面定義)。 因此,您可以使用類似:

CD_struct *cd_data
if (element->datatype == CD)
      cd_data = (CD_struct *) list_data(ListElmt)

不用考慮CD / DVD數據結構的實現以及鏈表的實現,您可能想要做這樣的事情:

enum ptype {
    PTYPE_BOOK,
    PTYPE_CD,
    PTYPE_DVD,
};

struct book {
    char *author;
    char *title;
    char *publisher;
    char *isbn;
};

struct product {
    enum ptype type;
    void *data;
};

struct product_list {
    struct product *product;
    struct product_list *next;
};

枚舉負責區分所指向的產品類型。 例如,要創建一本書:

struct product *
create_book(char *author, char *title, char *publisher, char *isbn)
{
    struct product *p;
    struct book *b;

    p = calloc(1, sizeof (*p));
    if (p == NULL) {
        return NULL;
    }
    p->type = PTYPE_BOOK;
    p->data = calloc(1, sizeof(*b));
    if (p->data == NULL) {
        free(p);
        return NULL;
    }
    b = p->data;

    b->author = author;
    b->title = title;
    b->publisher = publisher;
    b->isbn = isbn;

    return p;
}

當無論出於何種原因都不能使用工會時,這是一個典型的接口。 不幸的是,它需要更多的內存分配(實際上,您可能必須strdup(3) author / title / publisher / isbn)。

要從產品中檢索一本書,您可能需要具有以下內容:

static inline struct book *
get_book(struct product *p)
{

    assert(p->type == PTYPE_BOOK);
    return p->data;
}

您不需要(也不應該)在C中強制轉換為void指針。如果您使用或支持C ++編譯器,則可能需要使用return (struct book *)p->data; 您將為CD和DVD類型實現類似的功能。 然后,當您需要提取產品時:

switch (p->type) {
case PTYPE_BOOK:
    b = get_book(p);
    break;
case PTYPE_CD:
    c = get_cd(p);
    break;
case PTYPE_DVD:
    d = get_dvd(p);
    break;
}

您可能還想使用鏈接列表以外的其他方式來存儲這些內容,尤其是當它們在創建之后將被讀取/遍歷很多次時。 (向量不是一個壞主意)。 如果您知道將要擁有多少個項目,這將有助於減少必須執行的分配數量,並且連續的內存訪問將提高速度。

如果您需要搜索條目,我懷疑您仍然需要外部可搜索的數據結構。

如果每個具有ITEMTYPE的結構都是第一個成員,則可以在所有結構上使用LinkedList.itemtype

這是因為對itemtype的偏移量不依賴於內部結構順序,因為根據規則,我說itemtype在所有類型中都是相同類型,並且首先

一種方法是:

  • 創建一個通用結構“產品”
  • 保留變量以跟蹤當前產品類型。
  • 分別保持Book,CD和DVD的三個指針。

或如Archie的評論所述:

  • 創建一個通用結構“產品”
  • 保留變量以跟蹤當前產品類型。
  • 保留一個空*指針並在需要時進行強制轉換。

我認為第一個是有用的,如果在以后的階段,該產品可以是多種類型的。 例如-書+ CD

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM