Создание односвязного динамического списка с неограниченным количеством элементов - C (СИ)
Формулировка задачи:
Доброго времени суток. Данная работа подразумевает создание односвязного динамического списка с неограниченным количеством элементов. После ввода очередного элемента списка на экран должен выдаваться запрос об окончании ввода.
Вот что я нацарапал:
Но консольное приложение работает не правильно (провисает после ввода первого же поля), хотя компилятор ошибок при построении не видит.
Где я напортачил?
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
struct sea
{ char data[20];
char anim[20];
int temr;
struct sea *next; };
struct sea * create(void); //функция создания списка (возвращает адрес его головы)
void list(sea *head); // функция просмотра списка
struct sea *head; // глобальная переменная, адрес головы списка
void main()
{
head=create();
list(head);
free(head);}
struct sea * create(void)
{ sea *p, *pred; // pred – указатель на предыдущую структуру
char c;
head=pred=p=(sea *)malloc(sizeof(sea)); //выделяем память для первой записи
printf(" Sea name: "); scanf("%s", p->data);
fflush(stdin);
printf(" Sea animal: "); scanf("%s", p->anim);
fflush(stdin);
printf(" Sea glubina: "); scanf_s("%d", p->temr);
do { p=(sea *)malloc(sizeof(sea));
printf("\n Sea name: "); scanf("%s", p->data);
fflush(stdin);
printf(" Sea animal: "); scanf("%s", p->anim);
fflush(stdin);
printf(" Sea glubina: "); scanf_s("%d", p->temr);
pred->next=p; //ссылка из предыдущей записи на текущую
pred=p; // сохранение адреса текущей записи в поле предыдущей
printf(" \nThe End?\n * - exit ");
c=_getch();
}
while (c!='*');
p->next=NULL;
return head;}
void list(sea *head)
{ sea *p;
p=head;
while (p!=NULL) // пока не конец списка
{ printf("\n Sea name: %s",p->data);
printf("\n Sea animal: %s",p->anim);
printf("\n Sea glubina: %d",p->temr);
p=p->next; // продвижение по списку
}
_getch();
}
Немного дописал код, всё компилится, но консолька провисает после ввода глубины (третьего параметра). Помогите пожалуйста, где я накосячил?
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
struct sea
{ char data[20];
char anim[20];
int temr;
struct temper { //структура вложенная в структуру
int day;
int night;
}tmp;
struct sea *next; };
struct sea * create(void); //функция создания списка (возвращает адрес его головы)
void list(sea *head); // функция просмотра списка
struct sea *head; // глобальная переменная, адрес головы списка
void main()
{
head=create();
list(head);
free(head);}
struct sea * create(void)
{ sea *p, *pred; // pred – указатель на предыдущую структуру
char c;
head=pred=p=(sea *)malloc(sizeof(sea)); //выделяем память для первой записи
printf(" Sea name: "); scanf("%s", p->data);
fflush(stdin);
printf(" Sea animal: "); scanf("%s", p->anim);
fflush(stdin);
printf(" Sea glubina: "); scanf_s("%d", p->temr);
printf(" Sea temp day: "); scanf_s("%d", p->tmp.day);
printf(" Sea temp night: "); scanf_s("%d", p->tmp.night);
do { p=(sea *)malloc(sizeof(sea));
printf("\n Sea name: "); scanf("%s", p->data);
fflush(stdin);
printf(" Sea animal: "); scanf("%s", p->anim);
fflush(stdin);
printf(" Sea glubina: "); scanf_s("%d", p->temr);
printf(" Sea temp day: "); scanf_s("%d", p->tmp.day);
printf(" Sea temp night: "); scanf_s("%d", p->tmp.night);
pred->next=p; //ссылка из предыдущей записи на текущую
pred=p; // сохранение адреса текущей записи в поле предыдущей
printf(" \nThe End?\n * - exit ");
c=_getch();
}
while (c!='*');
p->next=NULL;
return head;}
void list(sea *head)
{ sea *p;
p=head;
while (p!=NULL) // пока не конец списка
{ printf("\n Sea name: %s",p->data);
printf("\n Sea animal: %s",p->anim);
printf("\n Sea glubina: %d",p->temr);
printf("\n Sea temp day: %d",p->tmp.day);
printf("\n Sea temp night: %d",p->tmp.night);
p=p->next; // продвижение по списку
}
_getch();
}Решение задачи: «Создание односвязного динамического списка с неограниченным количеством элементов»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
struct sea
{
char data[20];
char anim[20];
int temr;
struct temper //структура вложенная в структуру
{
int day;
int night;
} tmp;
struct sea* next;
};
struct sea* create(void); // функция создания списка (возвращает адрес его головы)
void destroy(struct sea*); // удаление сиписка
void list(struct sea*); // функция просмотра списка
int main()
{
struct sea* head = create();// глобальная переменная, адрес головы списка
list(head);
destroy(head);
_getch();
return 0;
}
struct sea* create(void)
{
struct sea* p, * pred = NULL, * head = NULL; // pred – указатель на предыдущую структуру
char c = 0;
while (c != '*')
{
p = (struct sea*) malloc(sizeof(struct sea));
printf("\n Sea name: "); scanf("%s", p->data);
fflush(stdin);
printf(" Sea animal: "); scanf("%s", p->anim);
fflush(stdin);
printf(" Sea glubina: "); scanf("%d", &p->temr);
printf(" Sea temp day: "); scanf("%d", &p->tmp.day);
printf(" Sea temp night: "); scanf("%d", &p->tmp.night);
if (pred == NULL)
{
head = p;
}
else
{
pred->next = p; //ссылка из предыдущей записи на текущую
}
pred = p; // сохранение адреса текущей записи в поле предыдущей
printf(" \nThe End?\n * - exit ");
c = _getch();
}
p->next = NULL;
return head;
}
void destroy(struct sea* head)
{
struct sea* node;
while (head != NULL)
{
node = head;
head = head->next;
free(node);
}
}
void list(struct sea* head)
{
while (head != NULL) // пока не конец списка
{
printf("\n Sea name: %s", head->data);
printf("\n Sea animal: %s", head->anim);
printf("\n Sea glubina: %d", head->temr);
printf("\n Sea temp day: %d", head->tmp.day);
printf("\n Sea temp night: %d\n", head->tmp.night);
head = head->next; // продвижение по списку
}
}
Объяснение кода листинга программы
- Ввод данных о морях в список.
- Создание функции для создания списка.
- Создание функции для удаления списка.
- Создание функции для просмотра списка.
- Объявление глобальной переменной для хранения головы списка.
- Инициализация головы списка с помощью функции create.
- Вызов функции list для просмотра списка.
- Вызов функции destroy для удаления списка.
- Использование _getch для ожидания нажатия клавиши перед выходом из программы.
- Возвращение значения 0 для успешного завершения программы.
- Создание цикла while для получения данных о морях и добавления их в список.
- Использование scanf для считывания данных о названии моря, животном, температуре и временных значениях температуры дня и ночи.
- Использование fflush для очистки буфера ввода.
- Использование malloc для выделения памяти под новую структуру sea.
- Использование printf для вывода данных о текущем море.
- Установка значения поля next для каждой новой структуры sea, кроме первой.
- Установка значения поля next для последней структуры sea в NULL.
- Возвращение головы списка из функции create.
- Рекурсивный вызов функции destroy для последовательного освобождения памяти, выделенной под каждую структуру sea.
- Использование printf для вывода данных о текущем море во время обхода списка функцией list.