путаница при создании связанного списка

#c #linked-list

#c #связанный список

Вопрос:

я пытаюсь понять код создания и отображения связанного списка

 #include <stdio.h>
#include <stdlib.h>

int create(int n);
void print();

struct node
{
    int data;
    struct node *next;
}
*head=NULL;

int main(){
    int n,data;
    printf("Enter the Number of Nodesn");
    scanf("%d",amp;n);
    create(n);
    print();
}

int create(int n){
    int i=1,data;
    struct node *temp=(struct node*)malloc(sizeof(struct node));
    printf("Enter element %d:n",i  );
    scanf("%d",amp;data);
    temp->data=data;
    temp->next=NULL;
    head=temp;
    while(n-->1){
        struct node *t=(struct node *)malloc(sizeof(struct node));
        printf("Enter element %d:n",i  );
        scanf("%d",amp;data);
        t->data=data;
        t->next=NULL;
        temp->next=t;
        temp=t;
    }
    printf("Done :)n");
}

void print(){
    struct node *temp=head;
    printf("Elements in list are:n");
    if(temp==NULL)
        printf("List is Emptyn");
    else
    while(temp!=NULL){
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("n");
}
 

Теперь я понимаю большую часть работы, но есть некоторая путаница, которую я хотел прояснить.

Первый узел создается как head.второй узел как t, который затем подключается к head, указывая следующий из head на себя. тогда как третий узел узнает, что мы подключаем его ко второму узлу (потому что все узлы называются t). это из temp = t -за того, что в конце цикла while, поэтому при следующем запуске новый t-узел подключается к temp, который является предыдущим t-узлом.

Если это так, то я предполагаю, что только адреса соединяются друг с другом.

Точнее, с помощью malloc мы назначаем память data и next для temp(которая является указателем на узел), затем помещаем первый элемент data и НУЛЬ, next и это наш первый узел. после этого у нас есть указатель head, который указывает на этот первый узел.

Моя настоящая путаница заключается в том, что происходит то, что мы создаем новые группы адресов при каждом запуске цикла, и print() использует эти адреса для итерации от начала до последнего узла. и, кроме head того, нет ничего, что могло бы получить доступ к нашему связанному списку после выхода из функции.

ПРАВИЛЬНО?

терминология может быть не к месту.

Ответ №1:

третий узел подключается ко второму с помощью оператора temp-> next=t (temp имеет адрес second, а ‘t’ — новый узел), и, наконец, вы создаете temp = t, поэтому на следующей итерации temp будет иметь адрес третьего узла и так далее.

Ответ №2:

это из-за temp = t в конце цикла while, поэтому при следующем запуске новый t-узел подключается к temp, который является предыдущим t-узлом.

ДА. temp отслеживает последний узел.

struct node *next содержит ячейку памяти следующего узла.

и, кроме head, нет ничего, что могло бы получить доступ к нашему связанному списку после выхода из функции.

ДА. Не зная head , вы не сможете просмотреть свой список.