#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
, вы не сможете просмотреть свой список.