Как узел связанного списка может быть определен "рекурсивно"? - PullRequest
0 голосов
/ 06 февраля 2019

Мы только что были представлены в связанном списке сегодня, я понял концепцию, но объявление беспокоит меня, вот код:

struct Node 
{ 
    int data; 
    struct Node *next; 
}; 

Почему это не бесконечный цикл объявлений?

Как компилятор распознает struct Node внутри struct Node?

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

  1. Создайте структуру, внутри которой есть целое число и указатель на структуру того же типа.
  2. Создайте структуру, на которую указывает указатель в первой структуре, она содержит целое число и указатель наструктура того же типа.
  3. Создает структуру, на которую указывает указатель во второй структуре, которая является структурой, на которую указывает указатель в первой структуре.
  4. ...

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Почему это не бесконечный цикл объявлений?

Хорошо, первым делом первым указатель это указатель , это не имеет значенияуказывает ли он на int, char, double или struct, это, по сути, адрес памяти, где что-то начинается, и его размер определяется архитектурой.Вот почему вы можете объявить указатель внутри struct, который вы только что создали.Если вы запустите этот код:

struct node {
    int val;
    struct node next; // NOTE: I omitted * so it is not pointer it is struct
};

, это приведет к ошибке, поскольку struct node равно неизвестно , его размер также неизвестен.Таким образом, по сравнению с:

struct node {
    int val;
    struct node *next;
};

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

Чтобы добраться до точки указателей .В Си это:

int a = 5;
int *p = &a;
char *c = p;

совершенно законно, и программист должен следить за этим.Таким образом, нижняя строка struct node *next является указателем на (адрес) предположительно следующего узла.По этой причине у вас не возникает recursion.

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

Это не так !!!Вот почему мой первый пример не работает !!!!Он распознает тип указателя.По сути, вы можете написать это так:

struct node {
    int val;
    void *next;
};

и для вашей машины это будет так же, как:

struct node {
    int val;
    struct node *next;
};

Надеюсь, это вам поможет.

0 голосов
/ 06 февраля 2019
Создайте структуру, на которую указывает указатель в первой структуре, она содержит целое число и указатель на структуру того же типа.

Здесь ваши рассуждения отключены,Создание указателя на что-либо не создает автоматически то, на что он должен указывать.Таким образом, тот факт, что первый объект создан с указателем в нем, не означает, что указатель будет указывать на что-то допустимое.Также как если бы я написал:

int *p;

Это ни на что не указывает.Значение указателя является неопределенным.Я могу инициализировать указатель:

int *p = NULL;

И он все равно ни на что не указывает.Но я могу дать ему адрес чего-то:

int i = 1;
int *p = &i;

И сейчас - это указывает на что-то.То же самое с указателем в узле.Узел может быть сделан только для хранения адреса некоторого узла, но это не обязательно.Вот почему связанный список - это не только объявление узла, но и набора функций (операций).Это те функции, которые предназначены для проверки того, что список находится в допустимом состоянии.Что каждый узел указывает на другой или на четко определенный терминатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...