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