br/>
Функція oneLeft - повертає 1, якщо в списку залишився один елемент, інакше повертає нуль
В
Функція delete4 - видаляє елемент з списку
Повний вихідний текст програми
// підключення стандартних заголовків файлів
# include
# include
// визначення структури - осередки зв'язкового циклічного списку
struct listNode {
int data;
struct listNode * nextPtr;
};
// визначення типу структури і покажчика на неї
typedef struct listNode LISTNODE;
typedef LISTNODE * LISTNODEPTR;
// прототипи функцій
// функція виводу списку
int prinList (LISTNODEPTR *);
// функція вставки в список
void insert (LISTNODEPTR *, int);
// функція видалення елемента списку
int delete4 (LISTNODEPTR *, int);
// пророкує функція
int oneLeft (LISTNODEPTR);
// функція main
main () {
// визначення покажчика на початок списку
LISTNODEPTR startPtr = NULL;
int g;
printf ("Please fill the list with INTEGER value. nAdding is stoped by 0 value. n ");
// введення значення для заповнення списку
scanf ("% i", & g);
while (g! = 0) {
// виклик функції вставки в список і передача їй адреси першого елемента списку та значення нового елемента
insert (& startPtr, g);
scanf ("% i", & g);
}
printf (" n __________________________________________ N ");
printf (" n List IS: n");
// виводить на екран список і перевіряє повертається функцією виведення списку значення
if (PrinList (& startPtr)) {//якщо виведено успішно
// введення значення задовольняє умові типу int і умовою задачі
while ((g <1) | | (g> 32000)) {
printf (" nEnter number to delete:");
scanf ("% i", & g);
}
printf (" n");
// поки не залишився один елемент - видаляти елементи відповідно до введеним номером
while ((! oneLeft (startPtr))) {
delete4 (& startPtr, g);
};
printf ("The last element is:");
// виводить на екрн список
prinList (& startPtr);
printf (" nPress ENTER to exit ...");
getch ();
}
else {// Якщо виведення списку неуспешен (список порожній або пошкоджений)
printf ("Nothing to delete nPress ENTER to exit ...");
getch ();
}
return 0;
}
// функція вставки в список. Вставляє прийняте значення в кінець списку
void insert (LISTNODEPTR * sPtr, int value) {
// ініціалізація змінних
LISTNODEPTR newPtr, previousPtr, currentPtr;
// виділяємо пмять для структури listnode, і записуємо адресу в newPtr
newPtr = malloc (sizeof (LISTNODE));
// якщо пам'ять виділена:
if (newPtr ! = NULL)
{
// формуємо нову комірку списку
newPtr-> data = value;
newPtr-> nextPtr = NULL;
// ставимо покажчик currentPtr на початок списку
currentPtr = * SPtr;
// якщо список порожній:
if (* sPtr == NULL) {
// формуємо перший елемент списку
newPtr-> nextPtr = * sPtr;
* sPtr = newPtr;
}
else
{//якщо список не порожній
// якщо список складається з одного елемента
if ((CurrentPtr-> nextPtr) == NULL) {
// вставляємо новий елемент списку і зациклюється список
newPtr-> nextPtr = * sPtr;
((* sPtr) -> nextPtr) = newPtr;
}
else {//якщо список складається з двох і більш
// встановлюємо покажчик на currentPtr на останній елемент циклічного списку
// поки наступний за currentPtr елемент не початок списку
while (CurrentPtr-> nextPtr! = * SPtr) {
// пересуваємо currentPtr за списком вперед
currentPtr = currentPtr-> nextPtr;
}
// вставляємо новий елемент списку і замикаємо список
currentPtr-> nextPtr = newPtr;
newPtr-> nextPtr = * sPtr;
}
}
}
// вивід повідомлення про помилку в разі невиділення пам'яті
else
printf ("Insuficient Memory!!! ENOUGH!");
}
// функція друку списку. Приймає покажчик списку та друкує список. Якщо список порожній - повертає 0
int prinList (LISTNODEPTR * sPtr)
{
// визначення змінної покажчика
LISTNODEPTR currentPtr;
// установка покажчика на початок списку
currentPtr = * sPtr;
if (currentPtr == NULL) {//якщо список порожній
printf ("List is empty. n n"),
return 0;
}
else {/...