[英]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.