#include <iostream>
using namespace std;
struct ilist // Создание списочной структуры
{
float num; // Объявление переменной
ilist *next; // Указатель на следующей список
};
ilist* find_pos(ilist *&il, int k); // Инициализация функции поиска позиции k
// Добавление (вставка) элемента в начало списка
void insert_begin(ilist *&il, float k)
{
ilist *r = new ilist;
r->num = k;
r->next=il;
il=r;
}
// Удаление первого элемента: второй становится началом
float del_begin(ilist *&il)
{
ilist *r=il;
float x=r->num;
il=r->next;
return x;
}
// Вставка или добавление элемента в середину списка
float insert_middle(ilist *&il, int k, float nm)
{
ilist* lst = find_pos(il, k-1); // Элемент списка распологается перед местом вставки
ilist* lst1 = lst-> next; // Элемент списка распологается после места вставки
ilist* tmpList = new ilist; // Создаётся новый элемент списка
tmpList->num = nm;
tmpList->next = lst1;
lst->next = tmpList;
return(0);
}
// Удаление элемента из середины списка
float del_middle(ilist *&il, int k)
{
if(k<=1) // Если k=1, то происходит удаление первого элемента
{
del_begin(il);
return(0);
}
ilist* lst = find_pos(il, k - 1); // Последний элемент помещается перед удаляемым
ilist* lst1 = lst -> next; // Удаляемый элемент
float x = lst1->num;
lst1 = lst1->next; // Определение следующего после удаляемого
lst->next = lst1; // Он делается следующим вместо удаляемого
return(x);
}
// Вставка или добавление элемента в конец списка
float ins_end(ilist *&il, float nm)
{
ilist* lst = il;
while (lst->next) // Отыскание последнего элемента
lst = lst->next;
ilist* lst1 = new ilist; // Создание вставляемого элемента
lst1->num = nm;
lst1->next = NULL;
lst->next = lst1; // Его вставка
return(0);
}
// Удаление последнего элемента с конца списка
float del_end(ilist *&il)
{
ilist* lst = il;
ilist* lst1 = il;
while (lst->next) // Отыскание последнего и предпоследнего элементов
{
lst1 = lst;
lst = lst->next;
}
lst1->next = NULL; // Предпоследний элемент списка делается последним
float x=lst->num;
return(x);
}
// Поиск элемента с данным номером
ilist* find_pos(ilist *&il, int k)
{
ilist* lst = il;
for (int i = 1; i<k; i++)
lst = lst->next;
return(lst);
}
// Печать списка
float print_list(ilist *&lst)
{
if(!lst) return(0);
cout << lst->num << " ";
ilist* nlst;
nlst=lst->next;
while (nlst)
{
float k=nlst->num;
cout << k << " ";
nlst=nlst->next;
}
cout << endl;
return(0);
}
// Ввод вещественного(ых) числа(ел)
float ninp()
{
float n;
cout << "Введите вещественное число - ";
cin >> n;
return(n);
}
// Ввод списка
ilist* linp()
{
ilist* lst = NULL;
float n;
cout << "Введите список вещественных чисел через пробел. Для окончания введите";
cout << " введите отрицательное число.";
cin >> n;
while (n>=0.f)
{
insert_begin(lst, n);
cin >> n;
}
return(lst);
}
// Удаление всех элементов равных данному
float del_all(ilist *&il, float n)
{
ilist* lst;
if (il->next == NULL) // Если элемент последний, то
{
if (il->num == n) // в случае, когда он равен n
il = NULL; // он удаляется
return(0);
}
if (il->num == n) // Если n – первый, он выбрасывается
il = il -> next;
lst = il->next;
del_all(lst, n); // Операция повторяется рекурсивно с хвостом
il->next = lst; // списка и он присоединяется к началу
return(0.f);
}
int main()
{
int n, k;
float num;
ilist* lst = NULL;
// Меню программы
cout << "1. Создать список." << endl;
cout << "2. Добавить элемент." << endl;
cout << "3. Удалить элемент из начала." << endl;
cout << "4. Добавить элемент в позицию k." << endl;
cout << "5. Удалить элемент из позиции k." << endl;
cout << "6. Добавить элемент в конец ." << endl;
cout << "7. Удалить элемент в конце ." << endl;
cout << "8. Печать списка." << endl;
cout << "9. Удаление всех элементов равных данному." << endl;
cout << "10. Выход." << endl;
// Часть экрана (окно) для вывода результатов window(WL, WT+10, WR, WB);
// Выполнение операций над списком
while(1)
{
cout << "Введите номер действия - ";
cin >> n;
switch(n)
{
case 1:
lst=linp();
break;
case 2:
num = ninp();
insert_begin(lst, num);
break;
case 3:
del_begin(lst);
break;
case 4:
cout << "Введите номер позиции ";
cin >> k;
num = ninp();
insert_middle(lst, k, num);
break;
case 5:
cout << "Введите номер позиции ";
cin >> k;
cout << endl << " Удаляется " << find_pos(lst,
k)->num << endl;
del_middle(lst, k);
break;
case 6:
num = ninp();
ins_end(lst, num);
break;
case 7:
del_end(lst);
break;
case 8:
break;
case 9:
num = ninp();
del_all(lst, num);
break;
default:
return(0);
}
print_list(lst);
}
}