Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //7.
- //А) продублировать в списке L вещественных элементов перед каждым элементом
- //значение модуля значения этого элемента.
- //Б) удалить из полученного списка элемент, имеющий минимальное положительное
- //значение
- #include <iostream>
- #include <locale>
- #include <malloc.h>
- using namespace std;
- struct point{
- float data;
- point* next;
- };
- void print_list(point* beg)
- //печать списка
- {
- point* p = beg;//начало списка
- while (p != 0)
- {
- cout << p->data << "\t";
- p = p->next;//переход к следующему элементу
- }
- cout << endl;
- }
- point* make_list()
- {
- point*beg;//указатель на первый элемент
- point*p, *r;//вспомогательные указатели
- beg = (point*)malloc(sizeof point);//выделяем память под первый элемент
- int otv;
- bool cont = true;
- cout << "Data : " << endl;
- cin >> beg->data;//вводим значение информационного поля
- beg->next = 0;//обнуляем адресное поле
- //ставим на этот элемент указатель p (последний элемент)
- p = beg;
- cout << "End? 1-Yes 2-No" << endl;
- cin >> otv;
- if (otv == 1) cont = false;
- while(cont)
- {
- r = (point*)malloc(sizeof point);//создаем новый элемент
- cout << "Data : " << endl;
- cin >> r->data;
- r->next = 0;
- p->next = r;//связываем p и r
- //ставим на r указатель p (последний элемент)
- p = r;
- cout << "End? 1-Yes 2-No" << endl;
- cin >> otv;
- if (otv == 1) cont = false;
- }
- return beg;//возвращаем beg как результат функции
- }
- point* change_list(point* beg){
- point* n = (point*)malloc(sizeof point); //Выделили память под новый эл-т
- n->data = abs(beg->data); //Присвоили значение модуля головы
- n->next = beg; //Указатель на голову
- beg = n; //Сдвиг головы на новый эл-т
- n = n->next; //n - вспомогательный указатель для работы со списком
- while (n->next != NULL){
- point* p = (point*)malloc(sizeof point); //Выделили память под новый эл-т
- p->data = abs(n->next->data); //Присвоили значение модуля головы
- p->next = n->next; //Указали на след. эл-т
- n->next = p; //Вставили p в список
- n = p->next; //Сдвинулись дальше по списку
- }
- return beg;
- }
- point* del_in_list(point* beg){
- point* p; //Вспомогательный
- p = beg;
- float min = beg->data; //Устанавливаем значение min на первый эл-т
- int i = 0; //Счётчик
- int imin=0; //Индекс min эл-та, который запоминаем
- while (p != NULL){ //Проходим по списку и ищем min не отрицательный эл-т
- if (p->data < min && p->data >= 0){
- min = p->data;
- imin = i;
- }
- i++;
- p = p->next;
- }
- p = beg; //Возвращаемся в голову и сбрасываем счётчик
- i = 0;
- if (imin == 0){ //Если минимум оказался в голове
- p = beg; //Доп. указатель на голову
- beg = beg->next; //Сдвинули голову дальше по списку
- free(p); //Освободили память доп. указателя
- }
- else if (imin != 1){ //Если минимум оказался не в голове и не на втором месте(после головы)
- while (i < imin - 1){ //Идём по списку до imin-1 индекса
- p = p->next;
- i++;
- }
- point* n; //Новая переменная для удаления эл-та
- n = p->next; //Переменной n присвоили значение эл-та с imin индексом(удаляемый)
- p->next = n->next; //Сместили указатель imin-1 эл-та на imin+1(или NULL)
- free(n); //Удалили из памяти нужный эл-т
- }
- else{ //Если минимум оказался на втором месте
- p = beg->next; //Доп. указатель на удаляемый эл-т
- beg->next = beg->next->next; //Сместили указатель головы на 3-ий эл-т
- free(p); //Удалили из памяти 2-ой эл-т
- }
- return beg;
- }
- void clear(point* &beg){ //Фун-ия для удаления всего списка из памяти
- point* p;
- while (beg != NULL){
- p = beg;
- beg = beg->next;
- free(p);
- }
- }
- void main(){
- setlocale(LC_ALL, "rus");
- point* beg;
- cout << "ФУНКЦИЯ СОЗДАНИЯ СПИСКА" << endl;
- beg = make_list();
- print_list(beg);
- cout << endl;
- cout << "ФУНКЦИЯ ДУБЛИРОВАНИЯ ЭЛ-ТОВ СПИСКА" << endl;
- beg = change_list(beg);
- print_list(beg);
- cout << "ФУНКЦИЯ УДАЛЕНИЯ МИНИМАЛЬНОГО ЭЛ-ТА ИЗ СПИСКА" << endl;
- beg = del_in_list(beg);
- print_list(beg);
- clear(beg);
- if (beg == NULL) cout << "Список удален из памяти" << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment