Ввод элементов в связный список, пока не будет введено "q" - C (СИ)
Формулировка задачи:
Здраствуйте! При создании масива нужно, чтобы он создавал новый элемент пока юзер не введёт q. Но при выполнении почему выводит все, кроме первого элемента и вместо последнего - 0.
struct list
{
int value;
struct list *next;
};
int main(int argc, char const *argv[]){
int i;
struct list *head = NULL;
struct list *previous, *current;
while(getchar() != 'q'){
current = (struct list *)malloc(sizeof(struct list));
if (head == NULL)
head = current;
else
previous->next = current;
current->next = NULL;
scanf("%d", ¤t->value);
previous = current;
}
current = head;
while(current != NULL){
printf("%d\n",current->value);
current = current->next;
}Решение задачи: «Ввод элементов в связный список, пока не будет введено "q"»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
struct list {
int value;
struct list *next;
};
int main() {
int value;
struct list *head = NULL;
struct list *previous, *current;
while (scanf("%d", &value) == 1) {
current = malloc(sizeof(struct list));
current->next = NULL;
current->value = value;
if (head == NULL) {
head = current;
}
else {
previous->next = current;
}
previous = current;
}
current = head;
while (current != NULL) {
printf("%d\n", current->value);
current = current->next;
}
return 0;
}
Объяснение кода листинга программы
В этом коде создаётся связный список, который наполняется значениями, вводимыми пользователем.
- Структура связного списка — структура данных, которая представляет собой набор узлов, каждый из которых содержит значение и ссылку (или
указатель) на следующий узел в списке. - Описание структуры — в начале кода объявляется структура
list, которая содержит целочисленное значение и указатель на следующий элемент списка. - Ввод значений — в цикле while программа запрашивает у пользователя ввод целочисленного значения и сохраняет его в переменной
value. - Выделение памяти под новый элемент списка — после ввода каждого значения программа выделяет под него память с помощью функции malloc и сохраняет указатель на новый элемент в переменной
current. - Создание связи между новым элементом и остальными — если список пуст, новый элемент становится его головой. Если же список уже содержит элементы, новый элемент добавляется в конец списка, и указатель на него сохраняется в
nextпредыдущего элемента. - Обход списка и вывод значений — после завершения ввода все элементы списка обходятся в цикле while, и для каждого элемента выводится его значение.
- Освобождение памяти — когда все элементы списка были обработаны, необходимо освободить память, выделенную под каждый из них. Но в данном коде эта операция не выполняется, и указатели на список и его голову остаются в памяти.