Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <string.h>
- struct _str
- {
- char ch;
- struct _str *next;
- };
- typedef struct _str str;
- str *m_head = 0, *m_curr = 0;
- int is_allowed = 0;
- void get_started();
- void empty_list();
- void is_empty();
- void set_curr_ptr_to_head_ptr();
- void is_last_node();
- void next_node();
- void print_value();
- void remove_current_node();
- void cut_out_node();
- void change_value();
- void add_new_node();
- void print_struct();
- void shutdown();
- int _is_empty();
- void get_started()
- {
- fflush(stdin);
- system("cls");
- if (!is_allowed)
- {
- char pw[50];
- int size;
- printf("Введите пароль.\n");
- printf("> ");
- fgets(pw, 50, stdin);
- size = strlen(pw);
- pw[size - 1] = '\0';
- if (!strcmp(pw, "laba4"))
- {
- is_allowed = 1;
- printf("Пароль корректный, можете приступить к работе.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Неверный пароль. Попробуйте еще раз.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Работа со списком уже начата. Для начала новой работы, ее сперва необходимо закончить.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void empty_list()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head)
- {
- str *tmp;
- while (m_head != 0)
- {
- tmp = m_head;
- m_head = m_head->next;
- free(tmp);
- }
- m_head = 0;
- m_curr = 0;
- printf("Список был успешно очищен.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Список уже пуст.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void is_empty()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head == 0)
- {
- printf("Список пуст.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Список не пуст.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void set_curr_ptr_to_head_ptr()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head)
- {
- m_curr = m_head;
- printf("Рабочий указатель установлен в начало списка.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Невозможно установить рабочий указатель в начало списка т.к. список пуст.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void is_last_node()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_curr)
- {
- if (m_curr->next == 0)
- {
- printf("Рабочий указатель находится в конце списка.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Рабочий указатель не находится в конце списка.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Список не существует.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void next_node()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_curr && m_curr->next != 0)
- {
- m_curr = m_curr->next;
- printf("Рабочий указатель успешно передвинут вперед.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Рабочий указатель не был передвинут вперед, т.к. он уже указывает на конец списка.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void print_value()
- {
- system("cls");
- if (is_allowed)
- {
- if(m_head!=0)
- {
- if (m_curr->next)
- {
- printf("Значение элемента за указателем: \'%c\'\n", m_curr->next->ch);
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Элементов за указателем нет.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Список пуст\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void remove_current_node()
- {
- str *tmp;
- system("cls");
- if (is_allowed)
- {
- if (m_head && m_curr)
- {
- if (m_curr == m_head && m_head->next == 0)
- {
- printf("За указателем ничего нет, нечего удалять.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- if (m_curr->next == 0)
- {
- printf("За указателем ничего нет, нечего удалять.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- if (m_curr->next->next != 0)
- {
- tmp = m_curr->next->next;
- free(m_curr->next);
- m_curr->next = tmp;
- }
- else
- {
- free(m_curr->next);
- m_curr->next = 0;
- }
- printf("Элемент успешно удален.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- }
- else
- {
- printf("Невозможно удалить текущий элемент, т.к. список не существует.\n");
- printf("Перед тем как удалить что-то, нужно сначала что-то добавить.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void cut_out_node()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head && m_curr)
- {
- str *tmp;
- char c;
- if (m_curr->next == 0)
- {
- printf("Невозможно взять элемент за указателем, т.к за рабочем указателем ничего нет.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- if (m_curr->next->next == 0)
- {
- c = m_curr->next->ch;
- free(m_curr->next);
- m_curr->next = 0;
- }
- else
- {
- tmp = m_curr->next->next;
- c = m_curr->next->ch;
- free(m_curr->next);
- m_curr->next = tmp;
- }
- printf("Вырезанный элемент: \'%c\'\n", c);
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Невозможно взять текущий элемент, т.к. списка не существует.\n");
- printf("Перед тем как взять что-то, нужно сначала что-то добавить.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void change_value()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head && m_curr)
- {
- if (m_curr->next == 0)
- {
- printf("Невозможно изменить значение за указателем, т.к. за рабочем указателем ничего нет.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Текущее значение элемента: \'%c\'.\n", m_curr->next->ch);
- printf("Новое значение элемета:\n");
- printf("> ");
- m_curr->next->ch = getchar();
- printf("\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Невозможно изменить значение за указателем, т.к. списка не существует.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void add_new_node()
- {
- system("cls");
- if (is_allowed)
- {
- str *tmp = 0;
- str *buf = 0;
- printf("Введите символ: \n");
- printf("> ");
- if (m_head == 0 && m_curr == 0)
- {
- m_head = (str *)malloc(sizeof(str));
- if(m_head)
- {
- m_curr = m_head;
- m_curr->next = 0;
- m_curr->ch = getchar();
- }
- }
- else
- {
- if (m_curr->next != 0)
- tmp = m_curr->next;
- m_curr->next = (str *)malloc(sizeof(str));
- if(m_curr->next != 0)
- {
- // m_curr = m_curr->next;
- m_curr->next->next = tmp;
- m_curr->next->ch = getchar();
- }
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void print_struct()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head)
- {
- str *tmp = m_head;
- printf("Текущая структура данных: ");
- while (tmp != 0)
- {
- if (tmp == m_curr)
- printf("%c* ", tmp->ch);
- else
- printf("%c ", tmp->ch);
- tmp = tmp->next;
- }
- printf("\n* текущее положение рабочего указателя.\n\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- else
- {
- printf("Невозможно распечатать структуру, т.к. она пуста.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void shutdown()
- {
- system("cls");
- if (is_allowed)
- {
- if (m_head)
- {
- str *tmp;
- while (m_head != 0)
- {
- tmp = m_head;
- m_head = m_head->next;
- free(tmp);
- }
- m_head = 0; m_curr = 0; is_allowed = 0;
- }
- else
- {
- printf("Невозможно освободить память, т.к. структура пуста.\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- else
- {
- printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
- printf("Для продолжения нажмите любую клавишу.\n");
- getch();
- }
- }
- void menu()
- {
- int input;
- do
- {
- system("cls");
- printf(" [ Меню ]\n");
- printf(" 1| Начать работу со списком\n");
- printf(" 2| Сделать список пустым\n");
- printf(" 3| Проверить пуст ли список\n");
- printf(" 4| Установить рабочий указатель начало списка\n");
- printf(" 5| Проверить стоит ли рабочий указатель в конце списка\n");
- printf(" 6| Передвинуть рабочий указатель списка вперед\n");
- printf(" 7| Показать значение элемента списка за указателем\n");
- printf(" 8| Удалить элемент списка за указателем\n");
- printf(" 9| Взять элемент списка за указателем\n");
- printf("10| Изменить значение элемента списка за указателем\n");
- printf("11| Добавить элемент за указателем\n");
- printf("12| Распечатать структуру данных\n");
- printf("13| Закончить работу со списком\n");
- printf(" 0| Выйти\n\n");
- printf(" [ Ввод ]\n");
- printf("> ");
- scanf("%d", &input);
- fflush(stdin);
- switch (input)
- {
- case 1:
- get_started();
- break;
- case 2:
- empty_list();
- break;
- case 3:
- is_empty();
- break;
- case 4:
- set_curr_ptr_to_head_ptr();
- break;
- case 5:
- is_last_node();
- break;
- case 6:
- next_node();
- break;
- case 7:
- print_value();
- break;
- case 8:
- remove_current_node();
- break;
- case 9:
- cut_out_node();
- break;
- case 10:
- change_value();
- break;
- case 11:
- add_new_node();
- break;
- case 12:
- print_struct();
- break;
- case 13:
- shutdown();
- break;
- default:
- printf("Символ введен не из списка\n");
- getch();
- break;
- }
- }
- while (input != 0);
- }
- int main(int argc, char *argv[])
- {
- system("chcp 65001");
- system("cls");
- menu();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement