Что значит "listPointer-> leftPointer-> rightPointer = newNodePtr;"делать? - PullRequest
0 голосов
/ 30 мая 2019

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

listPointer->leftPointer->rightPointer = newNodePtr;

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Это указывает, затем указывает снова, что это означает?

Код подразумевает, что есть вид

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

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

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

Node* listPointer;

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

 Node* newNodePtr;

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

listPointer->leftPointer->rightPointer = newNodePtr;

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


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

Я бы предпочел другое имя struct и его членов

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

для ясности.

0 голосов
/ 30 мая 2019

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

Начиная с

             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  |
|        |<-|        |<-|        |
----------  ----------  ----------
0 голосов
/ 30 мая 2019

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

listPointer->leftPointer->rightPointer = newNodePtr;
newNodePtr->rightPointer = listPointer
...