c - 仅将结构的一个节点分配给相同类型的结构
问题描述
再会。我有一个结构列表,其中包含“名称、可用和 *next”元素。在下面的代码中,我试图仅将一个节点(资源)放入同一结构的列表中。如果我使用提供的代码执行此操作,则该节点之后的所有元素(因为 *next)也会放入新列表中。有没有办法只取一个节点并将其放入新列表中?
struct resourceList *list = p->resourceListPtr;
if (list == NULL) {
list = resource;
list->next = NULL;
p->resourceListPtr = list;
}
list->next = NULL 也将 resource->next 更改为 NULL。但是我怎样才能只为第二个列表更改它呢?
解决方案
简短的回答是:你不能。
如果您希望“节点”成为两个不同列表的成员,则必须从一开始就考虑到这一点来设计列表和节点结构(例如,通过为数据和实际列表节点设置单独的结构)。
您可以做的是将节点从现有列表复制到新列表。这意味着您必须创建一个全新的struct resourceList
节点,从中复制它resource
,然后将新节点添加到列表中。
也许像
if (list == NULL)
{
// Create a new node
list = malloc(sizeof *list);
// Copy the data from another node
*list = *resource;
// No nodes after this one
list->next = NULL;
// Make the new node the head of the list
p->resourceListPtr = list;
}
[省略错误检查]
如果您希望多个列表中的节点共享数据,那么您需要在设计列表时考虑到这一点,如前所述。一种好方法是为列表、节点和数据创建单独的结构。
例如,您可以有类似的东西
struct resource
{
// The actual resource data
};
// Node in list
struct resourceNode
{
struct resource *data; // Pointer to the data
struct resourceNode *next; // Next node in list
};
struct resourceList
{
struct resourceNode *head;
struct resourceNode *tail;
};
使用上述结构,很容易拥有多个具有唯一节点的列表,但节点中的数据可以在列表之间共享。
简单的例子:
// Create two lists
struct resourceList list1;
struct resourceList list2;
// TODO: Initialization of the lists
struct resource my_resource;
// TODO: Initialization of my_resource ...
// Add the same resource to both lists
resource_list_add(&list1, &my_resource);
resource_list_add(&list2, &my_resource);
如果更改资源数据,则两个列表都会更改。
将一个列表中的数据添加到另一个列表中也很容易:
struct resourceNode *node1 = list1.head;
resource_list_add(&list2, node1->data);
推荐阅读
- reactjs - 确保我们没有过度连接的组件
- php - 在其他 php 文件中执行函数
- string - 是否有更有效的方法来搜索数据框的列?
- reactjs - 将日期和时间从一个组件解析到另一个组件
- sql-server - 使用通配符仅选择字符串的一部分(SQL Server)
- excel - 使用选项卡名称更改某些选项卡上的数据以在另一个选项卡中更改
- svg - 如何在保留 midXmidY 位置的同时缩放 SVG 线
- python - 如何为网站上的下拉选项列表选择或传递值到隐藏类型?
- symfony - 如何在 Symfony4 中显示 404 错误页面而不是错误
- c++ - 如何检查链接列表是否已满/计算机在附加功能内是否内存不足