Как изменить переменные указателя в структуре?

Поэтому я пытаюсь реализовать связанный список, и у меня есть эта структура для каждого из узлов:

    typedef struct listNode {
        struct listNode *next;
        void *data;
    } NODE;

Ранее я сделал игру, в которой структура космического корабля выглядела так:

   typedef struct {
       int height;
       int width;
   } SPACECRAFT;

и я мог бы сделать новый космический корабль, выполнив

  SPACECRAFT plyrShip = {
      .width = //someInt;
      .height = //someInt;
  };

Хотя с узлами переменные являются указателями, и это не позволяет мне создать новый узел, выполнив

  NODE newNode = {
      .*next = null;
      .*data = *data //function has *data as parameter so I can pass it 
                     //into the node
  }

Что я делаю неправильно?

2 ответа

Решение

Вы связали синтаксис объявления указателя и назначенный синтаксис инициализатора. Поле члена может быть объявлено как тип указателя. При использовании назначенных инициализаторов просто назовите поле. Также обратите внимание, что они разделены запятыми.

  NODE newNode = {
      .next = null,
      .data = data
  };

Официально это называется Designated Initializer, который был представлен с C99.

Во-первых, вы должны реализовать типы указателей. struct listNode next; это объявить переменную, nextчей тип struct listNode, struct listNode *next это объявить переменную, nextтип которого является типом, который указывает на значение, тип которого struct listNode, Таким образом, вы должны сделать это так.

  NODE newNode = {
  .next = null,
  .data = data
  }

Более того, так выглядит структура памяти. Вы могли бы помнить это, чтобы устранить путаницу. И это ясно указывает на то, почему вы не могли этого сделать. (следующий элемент в структуре не может быть разыменован индивидуально из-за структуры структуры здесь).

|--------------|
| newNode.next | &newNode
|--------------|
| newNode.data |
|--------------|

Обновленный ответ: проверьте редактирование резюме.

Другие вопросы по тегам