Назначить только один узел структуры для того же типа структуры - PullRequest
0 голосов
/ 21 февраля 2020

Добрый день. У меня есть список структуры, с элементами «имя, доступно и * следующий». В приведенном ниже коде я пытаюсь получить только один узел (ресурс) в списке той же структуры. Если я делаю это с предоставленным кодом, все элементы после этого узла (из-за * next) также помещаются в новый список. Есть ли способ взять только один узел и поместить его в новый список?

struct resourceList *list = p->resourceListPtr;
    if (list == NULL) {
      list = resource;
      list->next = NULL;
      p->resourceListPtr = list;
}

Список-> следующий = NULL, также изменяет ресурс-> рядом с NULL. Но как я могу изменить его только для второго списка?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Краткий ответ: Вы не можете.

Если вы хотите, чтобы «узел» был членом двух разных списков, вы должны с самого начала проектировать список и структуры узлов с учетом этого. (например, имея отдельные структуры для данных и фактических узлов списка).

Что вы можете сделать, это скопировать узел из существующего списка в новый список. Это означает, что вам нужно создать новый узел 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);
0 голосов
/ 21 февраля 2020

Если вы хотите скопировать узел, вы должны скопировать используемую им память во вновь выделенную память.

Что-то вроде:

if (list == NULL)
{
  list = malloc(sizeof *list);
  if (list != NULL)
  {
    *list = *resource;
    list->next = NULL;
    p->resourceListPtr = list;
  }
}
...