如何在c中创建结构的链接列表

时间:2014-12-28 19:42:41

标签: c struct

我有3种类型的结构:书籍,CD(在CD中我有结构“歌曲” - 和CD包含歌曲列表)和DVD。

我需要创建商店产品的链接列表 我的问题是如何在不知道哪个类型是指针的情况下创建产品列表。它可以是书,CD或DVD。

(我不能使用工会。)

4 个答案:

答案 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)

一种方法可能是:

  • 创建通用结构'产品'
  • 保留一个变量以跟踪当前的产品类型。
  • 保留Book,CD& amp;每张DVD。

或者像Archie的评论一样:

  • 创建通用结构'产品'
  • 保留一个变量以跟踪当前的产品类型。
  • 保持空白*指针&在需要时施展。

我认为第一个是有用的,如果在稍后阶段,产品可以是多种类型。例如 - 书+ CD