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

Я новичок в связанном списке. У меня есть ситуация, что взять размер ссылки берется в терминале, а затем прочитать все данные, которые будут храниться в freq (в моем коде это "freq", но обычно называется data/info), и создать связанный список, используя их,

То, что я сделал до сих пор, показано ниже в коде, который просто читает размер LL, который будет создан, и создает узел для каждой вводимой информации. Теперь, как мне нужно связать эти узлы так, чтобы элемент сначала указывал на другой, где последний будет иметь значение NULL. Прямо сейчас у меня есть NULL в следующем из каждого созданного узла.

Вот мой код:

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

struct node
{
 int freq;
 struct node *next;
};
typedef struct node node;
node *tree=NULL;

main()
{
int size,data;

printf("enter the size of node\n");
scanf("%d", &size);
printf("start entering the number of elements until your size\n");
node *prev;
 node *temp;
prev = NULL;
do
{
 scanf("%d\n", &data);

 temp = (node*)malloc(sizeof(node));
 temp->freq=data;
 temp->next=NULL;
 if (prev)
    prev->next = temp;
 else
    tree = temp;
 prev = temp;
 size--;
}
while(size>0);

node *temp1;
temp1=temp;
while(temp1->next!=NULL)
{
  printf("%d-> ",temp->freq);
  temp1=temp1->next;
}
}

Que (1): я пытался связать эти узлы, взятые на терминале, но он все еще не печатает пройденный связанный список.в чем проблема?

The output is:
hp@ubuntu:~/Desktop/Internship_Xav/Huf_pointer$ ./ll 
enter the size of node
4
start entering the number of elements until your size
22
11
4
5
6//It don't print the linked list here
hp@ubuntu:~/Desktop/Internship_Xav/Huf_pointer$ 

2 ответа

Вам нужно будет отслеживать узел, добавленный в предыдущей итерации, чтобы вы могли сделать предыдущий узел next поле указывает на новый узел. Что-то вроде этого:

printf("start entering the number of elements until your size\n");
node *prev;
prev = NULL;
do
{
 scanf("%d\n", &data);
 node *temp;
 temp = (node*)malloc(sizeof(node));
 temp->freq=data;
 temp->next=NULL;
 if (prev)
    prev->next = temp;
 else
    tree = temp;
 prev = temp;
 size--;
}
while(size>0);

Обратите внимание, что на первой итерации это установит tree на вновь выделенный узел. Это необходимо, если вы хотите просмотреть список после его создания. К концу цикла head указывает на первый элемент, а последний элемент next указывает на NULL,

И да, ваш подход к обходу списка верен.

ОБНОВИТЬ

Подход, описанный вами для обхода списка, верен, но вы не реализовали его правильно.

Вы хотите начать с заголовка списка, а не с temp, так как temp последний выделенный вами узел. И состояние не while (temp1->next != NULL)цикл никогда не будет выполнен, потому что temp1 последний узел, и последний узел next поле всегда указывает на NULL,

Вместо этого это то, что вы хотите:

node *temp1;
temp1 = tree;
while(temp1 != NULL)
{
  printf("%d-> ", temp1->freq);
  temp1 = temp1->next;
}

Обратите внимание, что аргумент printf() также изменился, вы проходили temp->freqправильная переменная будет temp1->freq,

Просто следите за предыдущим узлом и связывайте его со следующим.

node *temp,*temp2=NULL,*head;
do
{
 scanf("%d", &data);

 temp = (node*)malloc(sizeof(node));
 if (temp2==NULL)
   head=temp;
 else
   temp2->next=temp;

 temp->freq=data;
 temp->next=NULL;
 temp2=temp;

 size--;
}while(size>0);

head даст начальный узел связанного списка.

Кроме того, вы, вероятно, хотели scanf("%d", &data); вместо scanf("%d\n", &data);, Смотрите этот ответ.

Другие вопросы по тегам