Что означает "listPointer->leftPointer->rightPointer = newNodePtr;" делать?

Я впервые сталкиваюсь с таким указателем. То указывает, то снова указывает, что это означает? Я столкнулся с этим в программе с двойным связным списком.

listPointer->leftPointer->rightPointer = newNodePtr;

Невозможно В самом деле понять это, не зная типа listPointer и не найдя его документации или определения его класса (например, с ключевыми словами class или struct).

hegel5000 30.05.2019 14:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

It points then points again, what does this imply?

Код подразумевает, что существует своего рода

struct Node {
    Node* leftPointer;
    Node* rightPointer;
};

который используется рекурсивно для построения дерева.

listPointer объявлен как

Node* listPointer;

newNodePtr объявлен как

 Node* newNodePtr;

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

listPointer->leftPointer->rightPointer = newNodePtr;

выполняется во время выполнения.


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

Я бы предпочел другое название struct и его участников.

struct DoubleLinkedListItem {
    DoubleLinkedListItem* previous;
    DoubleLinkedListItem* next;
};

для ясности.

Возможно, используется для удаления listPointer из списка ссылок, как указано ниже:

listPointer->leftPointer->rightPointer = newNodePtr;
newNodePtr->rightPointer = listPointer
Ответ принят как подходящий

Вероятно, это часть вставки нового элемента. Если вы сделаете это правильно, вам нужно знать только элемент после, куда вы хотите его вставить, и элемент, который вы вставляете. Остальные элементы можно получить по ссылкам.

Начиная с

             listPtr
                |
                v
----------  ----------
|        |->|        |
| Node L |  |  Node  |
|        |<-|        |
----------  ----------

newNodePtr
   |
   v
----------
|        |
| Node N |
|        |
----------

Сначала сделайте

listPointer->leftPointer->rightPointer = newNodePtr;

Так что предыдущий элемент указывает на новый элемент

               newNodePtr    listPtr
                  |             |
                  v             v
----------    ----------    ----------
|        |--->|        |    |        |
| Node L |    | Node N |    |  Node  |
|        |<-| |        |  |-|        |
----------  | ----------  | ----------
            |             |
            |-------------|

Тогда сделайте

newNodePtr->leftPointer = listPointer->leftPointer;

Чтобы новый элемент указывал на предыдущий элемент

               newNodePtr    listPtr
                  |             |
                  v             v
----------    ----------    ----------
|        |--->|        |    |        |
| Node L |<---| Node N |    |  Node  |
|        |<-| |        |  |-|        |
----------  | ----------  | ----------
            |             |
            |-------------|

Тогда сделайте

listPointer->leftPointer = newNodePtr;

Чтобы следующий элемент указывал на новый элемент

             newNodePtr  listPtr
                |           |
                v           v
----------  ----------  ----------
|        |->|        |  |        |
| Node L |  | Node N |  |  Node  |
|        |<-|        |<-|        |
----------  ----------  ----------

Затем, наконец,

newNodePtr->rightPointer = listPointer;

Чтобы новый элемент указывал на следующий элемент

             newNodePtr  listPtr
                |           |
                v           v
----------  ----------  ----------
|        |->|        |->|        |
| Node L |  | Node N |  |  Node  |
|        |<-|        |<-|        |
----------  ----------  ----------

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