Включить в список новый элемент, не нарушая его упорядоченность - C (СИ)
Формулировка задачи:
Сформировать однонаправленный упорядоченный список целых чисел.
Включить в список новый элемент, не нарушая его упорядоченность.
Задача работает правильно, но я имею несколько вопросов по ней:
1. Правильно ли я выделяю динамическую память под новые элементы списка?
2. Можно в моей задаче обойтись без метки? Я знаю, как можно ее не использовать, если добавить новую переменную, иначе не знаю.
3. Как правильно освобождать динамическую память?
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
Node *next;
} N;
N* head; // переменная, котороя будет хранить весь список
N* Addelem() //функция добавления нового элемента
{
N* pel;
pel=(N*)malloc(sizeof(N));
scanf("%d",&pel->data);
pel->next=NULL;
return pel;
}
int main()
{
N* el=NULL,*t=NULL,*p=NULL;
int i,n;
printf("Vvedit kilkist elementiv\n");
scanf("%d",&n);
el=(N*)malloc(sizeof(N)); //переменная елементов списка
head=el;
for (i=0;i<n;i++)
{ el->next=(N*)malloc(sizeof(N));
printf("%d element - ",i+1);
scanf("%d",&el->data);
if (i<n-1)
el=el->next;
el->next=NULL;
}
printf("Vvedit element,jakuy dodaem do spuska\n");
p=Addelem();
if (p->data > el->data) //если новый элемент больше предыдущих, то в конец списка
{
el->next=p;
goto A;
}
el=head;
while (el!=NULL)
{
if (p->data >= el->data && p->data <= el->next->data) // ищем позицию для вставки нового элемента, если елемент не менше или не больше предыдущих
{
t=el->next;
el->next=p;
p->next=t;
break;
}
if (p->data <= el->data) //если новый элемент менше предыдущих, то в начало списка
{
t=el;
el=p;
el->next=t;
head=el;
break;
}
el=el->next;
}
A: el=head;
while (head!=NULL) //выводим список
{
printf("%d",head->data);
head=head->next;
}
/*while (el!=NULL)
{
free(el);
el=head->next;
}*/
system("Pause");
return 0;
}
Кто знает ответьте пожалуйста
Решение задачи: «Включить в список новый элемент, не нарушая его упорядоченность»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
Node *next;
} N;
N* head; // переменная, котороя будет хранить весь список
N* Addelem() //функция добавления нового элемента
{
N* pel;
pel=(N*)malloc(sizeof(N));
scanf("%d",&pel->data);
pel->next=NULL;
return pel;
}
int main()
{
N* el=NULL,*t=NULL,*p=NULL;
int i,n;
printf("Vvedit kilkist elementiv\n");
scanf("%d",&n);
el=(N*)malloc(sizeof(N)); //переменная елементов списка
head=el;
if (el==NULL)
{
printf("Nema vilnoyu pamjati");
return 0;
}
head=el;
for (i=0;i<n;i++)
{ el->next=(N*)malloc(sizeof(N));
if (el->next==NULL)
{
printf("Nema vilnoyu pamjati");
return 0;
}
printf("%d element - ",i+1);
scanf("%d",&el->data);
if (i<n-1)
el=el->next;
el->next=NULL;
}
printf("Vvedit element,jakuy dodaem do spuska\n");
p=Addelem();
if (p->data <= el->data)
{
el=head;
i=0;
}
while (el!=NULL)
{
if (p->data > el->data && i!=0) //и новый элемент больше предыдущих, то в конец списка
{
el->next=p;
break;
}
if (p->data >= el->data && p->data <= el->next->data) // ищем позицию для вставки нового элемента, если елемент не менше или не больше предыдущих
{
t=el->next;
el->next=p;
p->next=t;
break;
}
if (p->data <= el->data) //если новый элемент менше предыдущих, то в начало списка
{
t=el;
el=p;
el->next=t;
head=el;
break;
}
el=el->next;
}
while (head!=NULL) //выводим список
{
printf("%d",head->data);
head=head->next;
}
while (el!=NULL)
{
head=el->next;
free(el);
el=head;
}
system("Pause");
return 0;
}
Объяснение кода листинга программы
- Создание структуры данных для представления списка, использующего указатели на следующий элемент
- Выделение памяти под список, используя функцию malloc
- Инициализация первого элемента списка (головы)
- Проверка на достаточность выделенной памяти и обработка ошибки, если память не может быть выделена
- Ввод количества элементов для добавления в список
- Добавление элементов в список, используя функцию malloc и сохраняя указатель на следующий элемент
- Ввод элемента, который нужно добавить в список
- Поиск места для добавления нового элемента в отсортированном списке
- Вставка нового элемента в список на найденном месте
- Вывод списка на экран, используя цикл и обход всех элементов
- Освобождение памяти, выделенной под каждый элемент списка, в обратном порядке, чтобы избежать утечки памяти
- Возврат значения 0, чтобы указать, что программа успешно завершилась