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