Включить в список новый элемент, не нарушая его упорядоченность - 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, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д