Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <malloc.h>
- struct list //Список
- {
- struct list *prev; //Указатель на предыдущий элемент списка (= NULL, если первый элемент)
- float data; //Элемент списка
- struct list *next; //Указатель на следующий элемент списка (= NULL, если последний элемент)
- }*ptr, *ptr1, *desc; //Указатель на начало списка
- void ListAdd(/*TODO*/); //Подпрограмма для добавления элемента
- void ListOutput(/*TODO: введения данных для подпрограммы вывода списка*/); //Подпрограмма для вывода списка
- void ListDelete(/*TODO: введения данных для подпрограммы удаления списка*/); //Подпрограмма для удаления списка
- void ListSearchMax(/*TODO: введения данных для подпрограммы поиска индексов наибольших элементов списка*/); //Подпрограмма для поиска индексов наибольших элементов списка
- void ListDeleteEnd(/*TODO: введения данных для подпрограммы удаления последнего элемента списка*/); //Подпрограмма для удаления последнего элемента списка
- void main()
- {
- int key, key2, list_exist = 0, N, N1, i;
- float temp; //TODO: найти способ записывать данные в структуру без вторичной переменной - необязательно
- while (1)
- {
- printf("Choose function.\n1 - create list.\n2 - output list.\n3 - delete list.\n4 - find max.\n5 - add new data in any place.\n6 - delete last data.\n0 - exit.\n"); //Выбор действия
- scanf("%d", &key); //Ввод клавиши действия
- switch (key)
- {
- case 1: // Создание списка
- {
- if (list_exist == 1) //Если список уже существует
- {
- printf("List is already created. Please create it before.\n");
- }
- else //Создание списка в случае его отсутствия
- {
- printf("Enter list size.\n");
- scanf("%d", &N); //Ввод размера списка
- if (N > 0)
- {
- struct list *ptr;
- ptr = malloc(sizeof(struct list)); //Выделение памяти под первый элемент списка
- desc = ptr;
- ptr->prev = NULL; //Присвоение указателю на предыдущий элемент значения NULL
- ptr->next = NULL; //Присвоение указателю на следующий элемент значения NULL
- printf("Input new data.\n");
- scanf("%f", &temp); //Ввод элемента списка в промежуточное хранилище
- ptr->data = temp; //Запись значения в список
- for (i = 1; i < N; i++)
- {
- ptr1 = malloc(sizeof(struct list)); //Выделение памяти под элемент списка
- printf("Input new data.\n");
- scanf("%f", &temp); //Ввод элемента списка в промежуточное хранилище
- ptr1->data = temp; //Запись значения в список
- ptr1->prev = ptr; //Запись указателя на предыдущий (i-1) элемент
- ptr1->next = NULL; //Присвоение указателю на следующий элемент значения NULL
- ptr->next = ptr1; //Запись указателя на следующий элемент (производится в i-1 элементе)
- ptr = ptr1;
- }
- printf("List is successfully created.\n");
- list_exist = 1; //Перевод флага в значение "Список создан"
- }
- }
- break;
- }
- case 2: //Вывод списка
- {
- if (list_exist == 0) // Если список не существует
- {
- printf("List doesn't exist, it's impossible to show it.\n");
- }
- else // Если список существует
- {
- printf("Choose output type.\n1 - screen.\n2 - file.\n");
- scanf("%d", &key2); //Выбор вида вывода
- if (key2 == 1) //Вывод списка на экран
- {
- ptr = desc;
- for (i = 0; i < N; i++)
- {
- printf("data[%d] = %f\n", i + 1, ptr->data); //Вывод данных на экран
- ptr = ptr->next; //Переход к следующему элементу
- }
- }
- else if (key2 == 2) //Запись списка в файл
- {
- FILE *out;
- out = fopen("C:\\test\\SIAODlab2.txt", "wt"); //Открытие файла в режиме записи для записи списка
- if (out == NULL) //Если файл открыть не удалось
- {
- printf("File didn't open.\n");
- }
- else //Если файл открыть удалось
- {
- ptr = desc;
- for (i = 0; i < N; i++)
- {
- fprintf(out, "%f [%d]\n", ptr->data, i + 1); //Запись элемента списка и его индекса в файл
- ptr = ptr->next; //Переход к следующему элементу
- }
- fclose(out);
- }
- }
- printf("Successful output.\n");
- }
- break;
- }
- case 3: //Очистка (удаление) списка
- {
- if (list_exist == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существует
- {
- if (N == 1) //Если один элемент
- {
- free(desc); //Освобождение памяти (дескриптор)
- }
- else if (N == 2) //Если два элемента
- {
- ptr1 = desc->next; //Указатель ptr1 на 2-ой элемент списка
- free(ptr1); //Освобождение памяти (ptr1)
- free(desc); //Освобождение памяти (дескриптор)
- }
- else //Если больше двух элементов
- {
- ptr = desc->next; //Указатель ptr на 2-ой элемент списка
- ptr1 = ptr->next; //Указатель ptr1 на 3-ой элемент списка
- for (i = 2; i < N - 1; i++)
- {
- free(ptr); //Освобождение памяти (ptr)
- ptr = ptr1; //Указатель ptr на i-ый элемент списка
- ptr1 = ptr->next; //Указатель ptr1 на i+1-ый элемент списка
- }
- free(ptr); //Освобождение памяти (ptr1)
- free(ptr1); //Освобождение памяти (ptr)
- free(desc); //Освобождение памяти (дескриптор)
- }
- printf("List is successfully deleted.\n");
- list_exist = 0; //Перевод флага в значение "Список отсутствует"
- }
- break;
- }
- case 4: //Нахождение индексов максимальных элементов списка
- {
- if (list_exist == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существует
- {
- ptr = desc;
- temp = desc->data; //Данные первого элемента предполагаем как наибольшие
- for (i = 1; i < N; i++) //Цикл поиска наибольшего элемента
- {
- ptr = ptr->next;
- if (ptr->data > temp)
- {
- temp = ptr->data; //Если в i-ом данные >, чем записанные максимальные, то они становятся новыми максимальными
- }
- }
- ptr = desc;
- printf("Max data indexes:\n");
- for (i = 0; i < N; i++)
- {
- if (ptr->data == temp)
- {
- printf("[%d]\n", i + 1); //Если 1-ый элемент - наибольший, выводим его индекс
- }
- ptr = ptr->next;
- }
- printf("Searching max element is successfully completed.\n");
- }
- break;
- }
- case 5: //Добавление элемента в любое место списка
- {
- if (list_exist == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существeет
- {
- printf("Choose place, where you want to add new data. Avaliable space: from 1 to %d.\n", N + 1);
- scanf("%d", &N1); //Ввод индекса нового элемента
- if ((N1 > N + 1) || (N1 < 1)) //Если элемент невозможно добавить
- {
- printf("It's impossible to add new data at that place.");
- }
- else
- {
- ptr1 = malloc(sizeof(struct list)); //Выделение памяти под элемент списка
- ptr = desc;
- for (i = 0; i < N1 - 2; i++)
- {
- ptr = ptr->next; //Переходим к элементу, предшествующему новому
- }
- if (N1 == 1) //Если добавляем элемент в начало
- {
- ptr1->prev = NULL; //Присвоение указателю на предыдущий элемент значения NULL
- ptr1->next = desc; //Для нового элемента запись указателя на следующий элемент (который был первым)
- desc->prev = ptr1; //Для старого элемента запись указателя на предыдущий элемент (на новый элемент)
- desc = ptr1; //Дескриптор теперь указывает на новый первый элемент
- }
- else if (N1 == N + 1) //Если добавляем элемент в конец
- {
- ptr1->next = NULL; //Для нового элемента указатель на следующий элемент равен NULL
- ptr1->prev = ptr; //Для нового элемента запись указателя на предыдущий элемент
- ptr->next = ptr1; //Для старого элемента запись указателя на следующий элемент (на новый элемент)
- }
- else //Если добавляем элемент не в начало и не в конец
- {
- ptr1->prev = ptr; //Для нового элемента запись указателя на предыдущий элемент
- ptr = ptr->next; //Переход к элементу, следующему за новым
- ptr->prev = ptr1; //Для старого элемента запись указателя на предыдущий элемент (на новый элемент)
- ptr1->next = ptr; //Для нового элемента запись указателя на следующий элемент
- ptr = ptr1->prev; //Возвращение к элементу, предшествующему новому
- ptr->next = ptr1; //Для старого элемента запись указателя на следующий элемент (на новый элемент)
- }
- printf("Enter new data.\n"); //Ввод данных в новый элемент
- scanf("%f", &temp); //Ввод данных в новый элемент
- ptr1->data = temp; //Запись данных в новый элемент списка
- printf("Data is successfully added.\n");
- N += 1;
- }
- }
- break;
- }
- case 6: //Удаление элемента из конца списка
- {
- if (list_exist == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существует
- {
- if (N == 1) //Если один элемент
- {
- free(desc); //Освобождение памяти (дескриптор)
- printf("There was only one list element, so the whole list was deleted. Before other operations, please create it.\n");
- list_exist = 0;
- }
- else //Если больше одного элемента
- {
- ptr = desc;
- if (N > 2) // Если элементов больше 2
- {
- for (i = 0; i < N - 2; i++)
- {
- ptr = ptr->next; //Передвигаемся до предпоследнего элемента списка
- }
- }
- ptr1 = ptr->next; //Указатель ptr1 на предпоследний элемент списка
- free(ptr1); //Освобождение памяти (ptr1)
- ptr->next = NULL; //Обнуление указателя на следующий в первом элементе
- }
- printf("Data is successfully deleted.\n");
- N -= 1;
- }
- break;
- }
- case 0:
- {
- printf("Exiting program.\n"); //Выход из программы
- break;
- }
- default: //Если выбранной команды не существует
- {
- printf("This feature doesn't exist. Please try again.\n");
- break;
- }
- }
- if (key == 0)
- break;
- }
- }
- void ListAdd(/*TODO: введения данных для подпрограммы добавления элемента списка*/) //Подпрограмма для добавления элемента
- {
- //TODO: Написать подпрограмму для добавления элемента списка
- }
- void ListOutput(/*TODO: введения данных для подпрограммы вывода списка*/) //Подпрограмма для вывода списка
- {
- //TODO: Написать подпрограмму для вывода списка
- }
- void ListDelete(/*TODO: введения данных для подпрограммы удаления списка*/) //Подпрограмма для удаления списка
- {
- //TODO: Написать подпрограмму для удаления списка
- }
- void ListSearchMax(/*TODO: введения данных для подпрограммы индексов наибольших элементов списка*/) //Подпрограмма для поиска индексов наибольших элементов списка
- {
- //TODO: Написать подпрограмму для поиска индексов наибольших элементов списка
- }
- void ListDeleteEnd(/*TODO: введения данных для подпрограммы удаления последнего элемента списка*/) //Подпрограмма для удаления последнего элемента списка
- {
- //TODO: Написать подпрограмму для удаления последнего элемента списка
- }
Add Comment
Please, Sign In to add comment