繁体   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