您好。我有一个结构列表,其中包含元素"name,available和*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);
如果要复制节点,必须将其使用的内存复制到新分配的内存中。
类似于:
if (list == NULL)
{
list = malloc(sizeof *list);
if (list != NULL)
{
*list = *resource;
list->next = NULL;
p->resourceListPtr = list;
}
}