Связанный список с несколькими стрелками в C - PullRequest
0 голосов
/ 20 июня 2020

Вопрос о связанном списке в структуре данных (на языке C) скажем, у меня есть 4 элемента в списке, и это похоже на (адрес) [данные | указатель на следующий блок]

вот так (252) [5 | 272] -> (272) [8 | 286] -> (286) [11 | 296] -> (296) [15 | NULL]

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

struct node* head; //global variable 

Вот вопрос о Arrow Control , если я хочу перейти к 4-му элементу из головы, могу ли я так сказать?

(252) [5 | 272] -> (272) [8 | 286] -> (286) [11 | 296] -> (296) [15 | NULL] --- X

// let's suppose I stored 1st element in a variable and already linked them together 

struct node* temp1 = (struct node*) malloc(sizeof(struct node*));
temp1->data = 5;
temp1->next = 272;
.
.
.

Могу ли я сказать, что

temp1->next; // value is 272
temp1->next->data; // data is 8

temp1->next->next; // value is 286
temp1->next->next->data; //data is 11

temp1->next->next->next; // value is 296
temp1->next->next->next->data; // value is 15

temp1->next->next->next->next; // value is NULL

Могу ли я использовать несколько стрелок для прямого перехода по связанному списку вместо использования l oop?

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Можно, но только если вы уверены, что все элементы перед тем, который вы хотите, имеют действительный next указатель, или, другими словами, только если вы уверены, что список содержит достаточно elements.

Причина, по которой это обычно делается в al oop, заключается в том, что вы обычно заранее не знаете, какой длины список, и вам нужно проверить каждый элемент, чтобы убедиться. Если вы не знаете, сколько элементов находится в списке, то выполнение ->next->next->... напрямую может привести к тому, что программа разыменует указатель NULL, что является неопределенным поведением.

0 голосов
/ 20 июня 2020

Думаю, вы колеблетесь из-за цепочки, которую получаете. Чтобы предотвратить эту длинную цепочку, мы используем while -l oop, например:

int main()
{
    struct node* head = (struct node*) malloc(sizeof(struct node))
    // you want to be saving space for a new struct on the heap
    // not space for a struct pointer on the heap

    // addNodeAtEnd(&head, 0);
    // addNodeAtEnd(&head, 1);
    // addNodeAtEnd(&head, 2);
    // ...

    if (head != NULL) {
        struct node* p = head;
        while (p->next != NULL) {
            p = p->next;
            ; // do something like printf(p->data)
        }
    }
}
 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...