[英]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在所有類型中都是相同類型,並且首先
一種方法是:
或如Archie的評論所述:
我認為第一個是有用的,如果在以后的階段,該產品可以是多種類型的。 例如-書+ CD
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.