Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <malloc.h>
- #include <math.h>
- struct list //Элемент списка
- {
- struct list *prev; //Указатель на предыдущий элемент списка (= NULL, если первый элемент)
- double data; //Данные элемента
- struct list *next; //Указатель на следующий элемент списка (= NULL, если последний элемент)
- }*ptr, *ptr1; //Указатель на начало списка
- struct descriptor
- {
- struct list *first; //Указатель на первый элемент
- int N; //Кол-во элементов в списке
- int list_exists; //Если 1, список существует, если 0, нет
- };
- void ListCreation(struct descriptor *descriptor); //Подпрограмма для добавления элемента
- void ListOutput(struct descriptor *descriptor); //Подпрограмма для вывода списка
- void ListDelete(struct descriptor *descriptor); //Подпрограмма для удаления списка
- void ListSearchMax(struct descriptor *descriptor); //Подпрограмма для поиска индексов наибольших элементов списка
- void ListAddData(struct descriptor *descriptor); //Подпрограмма для добавления элемента
- void ListDeleteEnd(struct descriptor *descriptor); //Подпрограмма для удаления последнего элемента списка
- void main()
- {
- int key;
- double temp;
- struct descriptor descriptor;
- descriptor.list_exists = 0;
- 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.\nChosen function - "); //Выбор действия
- scanf("%d", &key); //Ввод клавиши действия
- switch (key)
- {
- case 1: // Создание списка
- {
- ListCreation(&descriptor);
- break;
- }
- case 2: //Вывод списка на экран или в файл
- {
- ListOutput(&descriptor);
- break;
- }
- case 3: //Очистка (удаление) списка
- {
- ListDelete(&descriptor);
- break;
- }
- case 4: //Нахождение индексов максимальных элементов списка
- {
- ListSearchMax(&descriptor);
- break;
- }
- case 5: //Добавление элемента в любое место списка
- {
- ListAddData(&descriptor);
- break;
- }
- case 6: //Удаление элемента из конца списка
- {
- ListDeleteEnd(&descriptor);
- 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 ListCreation(struct descriptor *descriptor) //Подпрограмма для создания списка
- {
- FILE *in;
- int i;
- double temp;
- if (descriptor->list_exists == 1) //Если список уже существует
- {
- printf("List is already created. Please delete it before.\n");
- }
- else //Создание списка в случае его отсутствия
- {
- in = fopen("C:\\test\\SiAODlab2Input.txt", "rt");
- if (in == NULL) //Если файл открыть не удалось
- {
- printf("Initial file wasn't opened.\n");
- return -1;
- }
- descriptor->N = 20; //Размер списка равен 20
- struct list *ptr;
- ptr = malloc(sizeof(struct list)); //Выделение памяти под первый элемент списка
- descriptor->first = ptr;
- ptr->prev = NULL; //Присвоение указателю на предыдущий элемент значения NULL
- ptr->next = NULL; //Присвоение указателю на следующий элемент значения NULL
- fscanf(in, "%lf", &temp); //Ввод элемента списка в промежуточное хранилище
- ptr->data = temp; //Запись значения в список
- for (i = 1; i < descriptor->N; i++)
- {
- ptr1 = malloc(sizeof(struct list)); //Выделение памяти под элемент списка
- fscanf(in, "%lf", &temp); //Ввод элемента списка в промежуточное хранилище
- ptr1->data = temp; //Запись значения в список
- ptr1->prev = ptr; //Запись указателя на предыдущий (i-1) элемент
- ptr1->next = NULL; //Присвоение указателю на следующий элемент значения NULL
- ptr->next = ptr1; //Запись указателя на следующий элемент (производится в i-1 элементе)
- ptr = ptr1;
- }
- fclose(in);
- printf("List is successfully created.\n");
- descriptor->list_exists = 1; //Перевод флага в значение "список существует"
- }
- }
- void ListOutput(struct descriptor *descriptor) //Подпрограмма для вывода списка
- {
- int key1, i;
- if (descriptor->list_exists == 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", &key1); //Выбор вида вывода
- if (key1 == 1) //Вывод списка на экран
- {
- ptr = descriptor->first;
- for (i = 0; i < descriptor->N; i++)
- {
- printf("data[%d] = %lf\n", i + 1, ptr->data); //Вывод данных на экран
- ptr = ptr->next; //Переход к следующему элементу
- }
- }
- else if (key1 == 2) //Запись списка в файл
- {
- FILE *out;
- out = fopen("C:\\test\\SiAODlab2Output.txt", "wt"); //Открытие файла в режиме записи для записи списка
- if (out == NULL) //Если файл открыть не удалось
- {
- printf("File wasn't opened.\n");
- }
- else //Если файл открыть удалось
- {
- ptr = descriptor->first;
- for (i = 0; i < descriptor->N; i++)
- {
- fprintf(out, "%lf [%d]\n", ptr->data, i + 1); //Запись элемента списка и его индекса в файл
- ptr = ptr->next; //Переход к следующему элементу
- }
- fclose(out);
- }
- }
- printf("Successful output.\n");
- }
- }
- void ListDelete(struct descriptor *descriptor) //Подпрограмма для удаления списка
- {
- int i;
- if (descriptor->list_exists == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существует
- {
- if (descriptor->N == 1) //Если один элемент
- {
- free(descriptor->first); //Освобождение памяти (дескриптор)
- }
- else if (descriptor->N == 2) //Если два элемента
- {
- ptr1 = descriptor->first->next; //Указатель ptr1 на 2-ой элемент списка
- free(ptr1); //Освобождение памяти (ptr1)
- free(descriptor->first); //Освобождение памяти (первый элемент)
- }
- else //Если больше двух элементов
- {
- ptr = descriptor->first->next; //Указатель ptr на 2-ой элемент списка
- ptr1 = ptr->next; //Указатель ptr1 на 3-ой элемент списка
- for (i = 2; i < descriptor->N - 1; i++)
- {
- free(ptr); //Освобождение памяти (ptr)
- ptr = ptr1; //Указатель ptr на i-ый элемент списка
- ptr1 = ptr->next; //Указатель ptr1 на i+1-ый элемент списка
- }
- free(ptr); //Освобождение памяти (ptr1)
- free(ptr1); //Освобождение памяти (ptr)
- free(descriptor->first); //Освобождение памяти (первый элемент)
- }
- printf("List is successfully deleted.\n");
- descriptor->list_exists = 0; //Перевод флага в значение "Список отсутствует"
- }
- }
- void ListSearchMax(struct descriptor *descriptor) //Подпрограмма для поиска индексов наибольших элементов списка
- {
- int temp, i, oper_count = 0;
- if (descriptor->list_exists == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существует
- {
- ptr = descriptor->first;
- oper_count++;
- temp = descriptor->first->data; //Данные первого элемента предполагаем как наибольшие
- for (i = 1; i < descriptor->N; i++) //Цикл поиска наибольшего элемента
- {
- ptr = ptr->next;
- oper_count++;
- if (ptr->data > temp)
- {
- temp = ptr->data; //Если в i-ом данные >, чем записанные максимальные, то они становятся новыми максимальными
- }
- }
- ptr = descriptor->first;
- oper_count++;
- printf("Max data indexes:\n");
- for (i = 0; i < descriptor->N; i++)
- {
- if (fabs(ptr->data - temp) < 0.00001)
- {
- printf("[%d]\n", i + 1); //Если 1-ый элемент - наибольший, выводим его индекс
- }
- ptr = ptr->next;
- oper_count++;
- }
- printf("Search for max element is successfully completed.\nElements accessed: %d.\n", oper_count);
- }
- }
- void ListAddData(struct descriptor *descriptor) //Подпрограмма для добавления элемента
- {
- int i, N1, oper_count = 0;
- double temp;
- if (descriptor->list_exists == 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 2 to %d.\n", (descriptor->N) - 1);
- scanf("%d", &N1); //Ввод индекса нового элемента
- if ((N1 > (descriptor->N) - 1) || (N1 < 2)) //Если элемент невозможно добавить
- {
- printf("It's impossible to add new data at that place.");
- }
- else
- {
- ptr1 = malloc(sizeof(struct list)); //Выделение памяти под элемент списка
- ptr = descriptor->first;
- oper_count++;
- for (i = 0; i < N1 - 2; i++)
- {
- ptr = ptr->next; //Переходим к элементу, предшествующему новому
- oper_count++;
- }
- ptr1->prev = ptr; //Для нового элемента запись указателя на предыдущий элемент
- ptr = ptr->next; //Переход к элементу, следующему за новым
- oper_count++;
- ptr->prev = ptr1; //Для старого элемента запись указателя на предыдущий элемент (на новый элемент)
- ptr1->next = ptr; //Для нового элемента запись указателя на следующий элемент
- ptr = ptr1->prev; //Возвращение к элементу, предшествующему новому
- oper_count++;
- ptr->next = ptr1; //Для старого элемента запись указателя на следующий элемент (на новый элемент)
- printf("Enter new data.\n"); //Ввод данных в новый элемент
- scanf("%lf", &temp); //Ввод данных в новый элемент
- ptr1->data = temp; //Запись данных в новый элемент списка
- printf("Element is successfully added.\nElements accessed: %d.\n", oper_count);
- (descriptor->N)++;
- ListOutput(descriptor);
- }
- }
- }
- void ListDeleteEnd(struct descriptor *descriptor) //Подпрограмма для удаления последнего элемента списка
- {
- int i, oper_count = 0;
- if (descriptor->list_exists == 0) // Если списка не существует
- {
- printf("List wasn't created. Please create it before.\n");
- }
- else //Если список существует
- {
- if (descriptor->N == 1) //Если один элемент
- {
- free(descriptor->first); //Освобождение памяти (дескриптор)
- oper_count++;
- printf("There was only one list element, so the whole list was deleted. Before other operations, please create it.\n");
- descriptor->list_exists = 0;
- }
- else //Если больше одного элемента
- {
- ptr = descriptor->first;
- oper_count++;
- if (descriptor->N > 2) // Если элементов больше 2
- {
- for (i = 0; i < descriptor->N - 2; i++)
- {
- ptr = ptr->next; //Передвигаемся до предпоследнего элемента списка
- oper_count++;
- }
- }
- ptr1 = ptr->next; //Указатель ptr1 на предпоследний элемент списка
- oper_count++;
- free(ptr1); //Освобождение памяти (ptr1)
- ptr->next = NULL; //Обнуление указателя на следующий в первом элементе
- }
- printf("The last element is successfully deleted.\nElements accessed: %d.\n", oper_count);
- (descriptor->N)--;
- ListOutput(descriptor);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement