我有3种类型的结构:书籍,CD(在CD中我有结构“歌曲” - 和CD包含歌曲列表)和DVD。
我需要创建商店产品的链接列表 我的问题是如何在不知道哪个类型是指针的情况下创建产品列表。它可以是书,CD或DVD。
(我不能使用工会。)
答案 0 :(得分:2)
您需要为数据集使用void指针。以下是我根据您的需要修改的链接列表结构中的代码片段:
#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)
答案 1 :(得分:2)
保留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)
作者/标题/发布者/ 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;
}
您可能还希望使用除链接列表之外的其他内容来存储这些内容,尤其是在创建它们之后将多次读取/遍历它们。 (矢量不是一个坏主意)。如果你知道你将拥有多少项,这可以帮助减少你必须执行的分配数量,连续的内存访问将提高速度。
如果您需要搜索条目,我怀疑您无论如何都需要外部可搜索的数据结构。
答案 2 :(得分:1)
如果每个结构都有ITEMTYPE是第一个成员,则可以在所有
上使用LinkedList.itemtype这是因为对itemtype的偏移不依赖于内部结构顺序,因为通过规则i,所述itemtype在所有类型中都是相同类型,并且首先在所有
中答案 3 :(得分:0)
一种方法可能是:
或者像Archie的评论一样:
我认为第一个是有用的,如果在稍后阶段,产品可以是多种类型。例如 - 书+ CD