Включить в список новый элемент, не нарушая его упорядоченность - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Сформировать однонаправленный упорядоченный список целых чисел. Включить в список новый элемент, не нарушая его упорядоченность.
#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;
}
Задача работает правильно, но я имею несколько вопросов по ней: 1. Правильно ли я выделяю динамическую память под новые элементы списка? 2. Можно в моей задаче обойтись без метки? Я знаю, как можно ее не использовать, если добавить новую переменную, иначе не знаю. 3. Как правильно освобождать динамическую память?
Кто знает ответьте пожалуйста

Решение задачи: «Включить в список новый элемент, не нарушая его упорядоченность»

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;
}

Объяснение кода листинга программы

  1. Создание структуры данных для представления списка, использующего указатели на следующий элемент
  2. Выделение памяти под список, используя функцию malloc
  3. Инициализация первого элемента списка (головы)
  4. Проверка на достаточность выделенной памяти и обработка ошибки, если память не может быть выделена
  5. Ввод количества элементов для добавления в список
  6. Добавление элементов в список, используя функцию malloc и сохраняя указатель на следующий элемент
  7. Ввод элемента, который нужно добавить в список
  8. Поиск места для добавления нового элемента в отсортированном списке
  9. Вставка нового элемента в список на найденном месте
  10. Вывод списка на экран, используя цикл и обход всех элементов
  11. Освобождение памяти, выделенной под каждый элемент списка, в обратном порядке, чтобы избежать утечки памяти
  12. Возврат значения 0, чтобы указать, что программа успешно завершилась

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы