Краткий ответ: Вы не можете.
Если вы хотите, чтобы «узел» был членом двух разных списков, вы должны с самого начала проектировать список и структуры узлов с учетом этого. (например, имея отдельные структуры для данных и фактических узлов списка).
Что вы можете сделать, это скопировать узел из существующего списка в новый список. Это означает, что вам нужно создать новый узел 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);