链表节点是否可以包含多个数据字段?

时间:2015-03-28 11:02:28

标签: c list

我宁愿问这样做是否有意义。我没有看到任何这方面的例子,但我没有看到任何违背这个想法的事情。

我是发布商订阅者模型,所以我到目前为止的想法是:我创建了一个主题列表,这些主题是从某个文件中添加的。

但是,我不想简单地使用主题的每个名称和指向下一个主题的指针,而是希望在每个主题的节点中为每个主题创建一个suscriber节点。

由于我可能很难解释自己,这就是这个想法:

struct topicNode{
char * topicName; //I believe there is no problem with pointers in a lists but again, I have not seen anyone doing it either so...

struct suscriberNode;
struct topicNode next;
};

因此,如果某个主题有任何嫌疑人,我会提出该主题的嫌疑人名单。我在Java中做过类似的事情,但我担心这对C来说不是一个好主意。

2 个答案:

答案 0 :(得分:6)

是的,单个链表可以包含任何数据

------------------------------              ------------------------------
|              |             |            \ |              |             |
|     DATA     |     NEXT    |--------------|     DATA     |     NEXT    |
|              |             |            / |              |             |
------------------------------              ------------------------------

参考:http://www.learn-c.org/en/Linked_lists

数据可以是int,struct,也可以是任何东西。 甚至2个字段或3个或4个或....

typedef struct node {
    int val;
    struct node * next;
} node_t;

是一个典型的例子 但是

typedef struct node {
    int val;
    int anotherval;
    struct node * next;
} node_t;

同样出色。 val和anotherval属于图片中的数据,正如我所说,它可以是任何东西。

答案 1 :(得分:1)

所以我理解你有可以订阅主题的主题和订阅者。静态阅读会没有问题;但是,当主题和订阅者及其订阅都可以改变时,您将希望设计"数据结构(带有处理它的代码),以有效的方式允许这种动态。

可能最好的方法是让它们交叉链接。以下数据结构允许:

typedef struct TOPIC {          // these are all the topics. Topics can be added or removed
    char *name;
    struct SUBSCR_LIST *subscribers;
    struct TOPIC *next;
} tTopic;

typedef struct SUBSCRIBER {     // these are all the subscribers. Subscribers can be added or removed
    char *name;
    struct TOPIC_LIST *topics;
    struct SUBSCRIBER *next;
} tSubscriber;

typedef struct SUBSCR_LIST {    // this list is part of a topic: who has subscribed?
    struct SUBSCRIBER *subscriber;
    struct SUBSCR_LIST *next;
} tSubscr_list;

typedef struct TOPIC_LIST {     // this list is part of a subscriber: what did he subscribe to?
    struct TOPIC *topic;
    struct TOPIC_LIST *next;
} tTopic_list;

您可以创建两个列表,一个用于主题,另一个用于订阅者。这些是您的主要数据。每个主题都有一个订阅者列表。当订阅者订阅主题时,您将指向订阅者的指针添加到主题的订阅者列表中。反过来说,每个订阅者都有一个指向他们订阅的主题的指针列表。当订阅者订阅主题时,您还要将该主题的指针添加到订阅者的主题列表中。

现在,当主题或订阅者被删除时(即主题/订阅者不再存在),您可以使用指针删除他们的订阅。

EDIT / ADDITION:

您需要为每个主题维护一个列表,其中列出了订阅者,以便您可以通过这些订阅者通知其订阅主题中的新闻。您需要为每个订阅者维护一个主题列表,以便订阅者可以转到他订阅的主题并管理他的订阅。

此外,这种交叉链接允许在删除主题和订阅者时进行有效管理。试想一下,假设您只有每个主题的订阅者列表;现在订户被删除:您必须搜索所有主题的所有列表,以查看订户是否在那里并将其删除。您是否有订阅者的主题列表,您只需要遍历该列表以查找订阅者的主题并从主题列表中删除该条目。