Advertisement
Wow_Rasl

Untitled

May 27th, 2022
526
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define _CRT_SECURE_NO_WARNINGS //подключаем необходимые библиотеки
  2. #include <stdio.h> //ввоод/вывод
  3. #include <locale.h> //русский язык
  4. #include <string.h> //функции для работы со строками
  5. #include <stdlib.h> //выделение памяти
  6. #include <math.h>
  7.  
  8. typedef struct Node {
  9.     char* value;
  10.     struct Node* next;
  11.     struct Node* prev;
  12. } Node;
  13.  
  14.  
  15. void input(char** s) { //ввод строки
  16.     printf("Введите строку из слов\n");
  17.     char* tmp;// обьявляем указатель на строку
  18.     tmp = (char*)malloc(330); // выделение памяти
  19.     gets(tmp); // ввод строки
  20.     tmp = strtok(tmp, ".");
  21.     *s = tmp; //помещаем считанную строку в исходную
  22. }
  23.  
  24. void PrintList(Node* head) {
  25.     Node* p = head;
  26.     if (!p) {
  27.         printf("Пустой лист\n");
  28.         return;
  29.     }
  30.     for (; p != NULL; p = p->next) {
  31.         printf("%s ", p->value);
  32.     }
  33. }
  34.  
  35. Node* addElement(Node* head, char* word, int position)
  36. {
  37.     Node* new_node, * tmp;
  38.     int i = 0;
  39.     new_node = (Node*)malloc(sizeof(Node));
  40.     new_node->value = (char*)malloc(30);
  41.     strcpy(new_node->value, word);
  42.     new_node->next = NULL;
  43.     new_node->prev = NULL;
  44.     if (!head) {
  45.         return new_node;
  46.     }
  47.  
  48.     if (!position){
  49.         new_node->next = head;
  50.         return new_node;
  51.     }
  52.  
  53.     tmp = head;
  54.     while (tmp->next && i < position - 1){
  55.         tmp = tmp->next;
  56.         i++;
  57.     }
  58.  
  59.     if (!tmp->next){
  60. new_node->prev = tmp;
  61. tmp->next = new_node;
  62. return head;
  63.     }
  64.     new_node->next = tmp->next;
  65.     tmp->next = new_node;
  66.     new_node->prev = tmp;
  67.     new_node->next->prev = new_node;
  68.     return head;
  69. }
  70.  
  71. Node* DeleteNode(Node* head, int index) {
  72.  
  73.     Node* elm = head, * tmp;
  74.     int i = 0;
  75.  
  76.     if (!elm)
  77.     {
  78.         printf("Пустой лист\n");
  79.         return head;
  80.     }
  81.  
  82.     //удаляем голову
  83.     if (!index)
  84.     {
  85.         elm = head->next;
  86.         elm->prev = NULL;
  87.         head->next = NULL;
  88.         head->prev = NULL;
  89.         free(head);
  90.         return elm;
  91.     }
  92.  
  93.     while (elm && i < index - 1)
  94.     {
  95.         elm = elm->next;
  96.         i++;
  97.     }
  98.  
  99.     //если индекс больше длины списка, ничего не делаем
  100.     if (!elm)
  101.         return head;
  102.     if (!elm->next)
  103.         return head;
  104.  
  105.     tmp = elm->next;
  106.  
  107.     if ((elm->next)->next)
  108.     {
  109.         ((elm->next)->next)->prev = elm;
  110.         elm->next = (elm->next)->next;
  111.         tmp->next = NULL; //(elm->next)->next = NULL;
  112.         tmp->prev = NULL;
  113.  
  114.     }
  115.     else
  116.         elm->next = NULL;
  117.  
  118.     free(tmp);
  119.  
  120.     return head;
  121. }
  122.  
  123. Node* CreateList(char* s)
  124. {
  125.     char* copied[330]; //обьявляем строку с заданным числом элементов
  126.     strcpy(copied, s); //копируем строку s в copied
  127.     int count = 0; //количество слов
  128.     char* vec[30]; //массив слов
  129.     char sep[] = " "; //разделитель - пробел
  130.  
  131.     char* cur = strtok(copied, sep); //обрезаем первый элемент до пробела
  132.     Node* L = NULL;
  133.     while (cur != NULL) //цикл
  134.     {
  135.         if (count == 30) {
  136.             printf("Количество слов в строке превышает 30\n");
  137.             return NULL;
  138.         }
  139.         vec[count] = cur; //присвоение слова массиву
  140.         count++; //увеличиваем на еденицу
  141.         cur = strtok(NULL, sep);
  142.     }
  143.     for (int i = 0; i < count; ++i) {
  144.         L = addElement(L, vec[i], i);
  145.     }
  146.     return L;
  147. }
  148.  
  149. int isVowel(char c) {
  150.     if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y') {
  151.         return 1;
  152.     }
  153.     return 0;
  154. }
  155.  
  156. Node* func1(Node* L) { // функция, создающая список L1, состоящий из слов с первой гласной буквой
  157.     Node* L1 = NULL;
  158.     Node* p = L;
  159.     int ind1 = 0;
  160.     for (; p != NULL; p = p->next) {
  161.         if (isVowel(p->value[0])){
  162.             L1 = addElement(L1, p->value, ind1);
  163.             ind1++;
  164.         }
  165.     }
  166.     return L1;
  167. }
  168.  
  169. Node* func2(Node* L) { // функция, создающая список L1, состоящий из слов с первой согласной буквой
  170.     Node* L2 = NULL;
  171.     Node* p = L;
  172.     int ind2 = 0;
  173.     for (; p != NULL; p = p->next) {
  174.         if (!isVowel(p->value[0])) {
  175.             L2 = addElement(L2, p->value, ind2);
  176.             ind2++;
  177.         }
  178.     }
  179.     return L2;
  180. }
  181.  
  182. Node* ChangeList(Node* L) {
  183.     char* mx;
  184.     mx = (char*)malloc(30);
  185.     strcpy(mx, L->value);
  186.  
  187.     Node* p;
  188.     for (p = L; p != NULL; p = p->next) {
  189.         if (strcmp(p->value, mx) > 0) {
  190.             strcpy(mx, p->value);
  191.         }
  192.     }
  193.     int i = 0;
  194.     for (p = L; p != NULL; ) {
  195.         if (!strcmp(mx, p->value)) {
  196.             p = p->next;
  197.             L = DeleteNode(L, i);
  198.             --i;
  199.         }
  200.         else {
  201.             p = p->next;
  202.         }
  203.         ++i;
  204.     }
  205.     return L;
  206. }
  207.  
  208. Node* ClearList(Node* L) {
  209.     Node* next, * tmp = L;
  210.  
  211.     while (tmp)
  212.     {
  213.         next = tmp->next;
  214.         free(tmp);
  215.         tmp = next;
  216.     }
  217.  
  218.     L = NULL;
  219.  
  220.     printf("Лист очищен\n");
  221. }
  222.  
  223.  
  224. int main() {
  225.     setlocale(LC_ALL, "rus"); //подключаем русский язык
  226.     char* s; //обьявление строки
  227.     input(&s); //вызываем функцию ввода строки
  228.     Node* L;
  229.     L = CreateList(s); //вызываем функцию выполнения задания
  230.     PrintList(L);
  231.     printf("\nСписок из гласных:\n");
  232.     Node* L1 = func1(L);
  233.     PrintList(L1);
  234.     printf("\nСписок из согласных:\n");
  235.     Node* L2 = func2(L);
  236.     PrintList(L2);
  237.  
  238.     ClearList(L1);
  239.     ClearList(L2);
  240.     ClearList(L);
  241. }
  242.  
Advertisement
RAW Paste Data Copied
Advertisement