首页 > 解决方案 > C中的链接列表结构。仅在一个列表中更改共享元素

问题描述

我在 C 中有这些结构:

typedef struct team{
    char *name;
    int wins;
} *pTeam;

typedef struct node_team{
    pTeam team;
    struct node_team *next;
} *link_team;

所以我有各种这样的团队,我把它们放在一个链表上,链表的每个元素都是一个 link_team,所以有 2 个 link_team AB如果我想放在B后面A,我做A->next=B。但是,我有 2 个列表,并且两个列表共享一些相同的元素,所以如果我A在这两个列表中都有并且想要BA一个列表中之后,我不希望它在另一个列表中。但是,由于我们正在讨论指针,并且两个列表都有指向 struct 的指针A,因此通过A->next=B在一个列表中执行操作,也会自动B链接到A另一个列表中。我怎样才能防止这种情况?

标签: cpointersstructlinked-list

解决方案


指针使next链表成为链表。因此,您不能按照自己的方式混合列表。但是,除了指向下一个对象的指针之外,节点包含的唯一数据是pTeam对象。这可以很容易地在不同的列表中共享(尽管您需要小心)。

... // Suppose you already have five pTeam pointers: p1, ..., p5

link_team *head1, *head2, *node1, *node2, *node3, *node4;

head1=malloc(sizeof(*link_team));
head2=malloc(sizeof(*link_team)); // I should be checking these return values but oh well.

head1->team=p1;
head2->team=p2;

node1=malloc(sizeof(*link_team));
node1->team=p3;
head1->next=node1;

node2=malloc(sizeof(*link_team));
node2->team=p3;
head2->next=node2;

node3=malloc(sizeof(*link_team));
node3->team=p4;
node3->next=NULL;
node1->next=node3;

node4=malloc(sizeof(*link_team));
node4->team=p5;
node4->next=NULL;
node2->next=node4;

推荐阅读