Упорядоченный список - C (СИ)

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

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

Помогите пожалуйста! Ввести с клавиатуры упорядоченный список целых чисел. Вставить в него элемент, заданный пользователем, не нарушая упорядоченность. Пример: Введите целые числа: 1 2 8 9 12 Введите любое число: 5 Ваш список: 1 2 5 8 9 12 Заранее благодарю

Решение задачи: «Упорядоченный список»

textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
 
typedef struct TList TList;
 
struct TList
{
    int Data;
    TList *next;
};
 
void Add(TList **pBegin, int a)
{
    TList *p=NULL;
    TList *pEnd=NULL;
    if(*pBegin==NULL) /* начинаем новый список */
    {
        *pBegin=malloc(sizeof(**pBegin));
        (*pBegin)->Data=a;
        (*pBegin)->next=NULL;
    }
    else /* добавляем в конец */
    {
        pEnd=*pBegin;
        while(pEnd->next!=NULL) pEnd=pEnd->next;
        p=malloc(sizeof(*p));
        p->Data=a;
        p->next=NULL;
        pEnd->next=p;
    }
}
 
void Print(const TList *pBegin)
{
    TList *p=pBegin;
    printf("%s\n","===== List values =====");
    while(p!=NULL)
    {
        printf("%i%c",p->Data,' ');
        p=p->next;
    }
    if(pBegin!=NULL) printf("%c",'\n');
    else printf("%s\n","  List is empty");
}
 
void Clear(TList **pBegin)
{
    TList *p=NULL;
    while(*pBegin!=NULL)
    {
        p=(*pBegin)->next;
        free(*pBegin);
        *pBegin=p;
    }
}
 
void Insert(TList **pBegin, int a)
{
    TList *p=NULL;
    TList *i=NULL;
    unsigned char flag=0;
    if(a<=(*pBegin)->Data) /* вставить перед первым */
    {
        p=malloc(sizeof(*p));
        p->Data=a;
        p->next=(*pBegin);
        *pBegin=p;
    }
    else
    {
        i=(*pBegin);
        /* ищем позицию для вставки */
        while((flag==0)&&(i->next!=NULL))
        {
            if((i->Data<a)&&(i->next->Data>=a)) flag=1;
            i=i->next;
        }
        if(flag==0) /* позиция не найдена - вставить в конец */
        {
            p=malloc(sizeof(*p));
            p->Data=a;
            p->next=NULL;
            i->next=p;
        }
        else /* позиция в середине найдена */
        {
            p=malloc(sizeof(*p));
            p->Data=a;
            p->next=i->next;
            i->next=p;
        }       
    }
}
 
int main(void)
{
    TList *begin=NULL;
    int i;
    for(i=0;i<5;i++) Add(&begin,i);
    Print(begin);
    printf("%s","Enter element:");
    scanf("%i",&i);
    Insert(&begin,i);
    Print(begin);
    Clear(&begin);
    getchar();
    return 0;
}

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

  1. Создание списка:
    • При инициализации списка, если он пуст, то создается новый элемент со значением a, который становится первым элементом списка.
    • Если список уже содержит элементы, то новый элемент со значением a добавляется в конец списка.
  2. Печать списка:
    • Выводится сообщение ===== List values =====.
    • Затем происходит итерация по всем элементам списка, и для каждого элемента выводится его значение.
    • Если список пуст, выводится сообщение  List is empty.
  3. Очистка списка:
    • Происходит итерация по всем элементам списка.
    • Для каждого элемента вызывается функция free, освобождающая память, занятую этим элементом.
    • После завершения итерации, указатель на первый элемент списка устанавливается в NULL, что означает, что список пуст.
  4. Вставка элемента в список:
    • Если значение a меньше или равно значению первого элемента списка, элемент вставляется перед первым элементом.
    • В противном случае, элемент вставляется в середину списка, или в конец списка, если позиция для вставки не найдена.
    • Для поиска позиции для вставки используется цикл while, который продолжается, пока не будет найдена подходящая позиция.
    • Во время цикла проверяется условие (i->Data < a) && (i->next->Data >= a), которое помогает определить, где именно должен быть вставлен элемент.
    • Если подходящая позиция найдена, элемент вставляется в список.
    • Если подходящая позиция не найдена, элемент вставляется в конец списка.
  5. Тестирование функций:
    • Создается список из 5 элементов.
    • Выводится содержимое списка.
    • Пользователю предлагается ввести значение для нового элемента.
    • Введенное значение добавляется в список.
    • Выводится обновленное содержимое списка.
    • Затем вызывается функция Clear, которая очищает список.
    • После этого вызывается функция getchar, чтобы пользователь мог увидеть результат своей работы.
    • Программа завершается с возвратом значения 0.

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


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

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

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