Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS //подключаем необходимые библиотеки
- #include <stdio.h> //ввоод/вывод
- #include <locale.h> //русский язык
- #include <string.h> //функции для работы со строками
- #include <stdlib.h> //выделение памяти
- #include <math.h>
- typedef struct Node {
- char* value;
- struct Node* next;
- struct Node* prev;
- } Node;
- void input(char** s) { //ввод строки
- printf("Введите строку из слов\n");
- char* tmp;// обьявляем указатель на строку
- tmp = (char*)malloc(330); // выделение памяти
- gets(tmp); // ввод строки
- tmp = strtok(tmp, ".");
- *s = tmp; //помещаем считанную строку в исходную
- }
- void PrintList(Node* head) {
- Node* p = head;
- if (!p) {
- printf("Пустой лист\n");
- return;
- }
- for (; p != NULL; p = p->next) {
- printf("%s ", p->value);
- }
- }
- Node* addElement(Node* head, char* word, int position)
- {
- Node* new_node, * tmp;
- int i = 0;
- new_node = (Node*)malloc(sizeof(Node));
- new_node->value = (char*)malloc(30);
- strcpy(new_node->value, word);
- new_node->next = NULL;
- new_node->prev = NULL;
- if (!head) {
- return new_node;
- }
- if (!position){
- new_node->next = head;
- return new_node;
- }
- tmp = head;
- while (tmp->next && i < position - 1){
- tmp = tmp->next;
- i++;
- }
- if (!tmp->next){
- new_node->prev = tmp;
- tmp->next = new_node;
- return head;
- }
- new_node->next = tmp->next;
- tmp->next = new_node;
- new_node->prev = tmp;
- new_node->next->prev = new_node;
- return head;
- }
- Node* DeleteNode(Node* head, int index) {
- Node* elm = head, * tmp;
- int i = 0;
- if (!elm)
- {
- printf("Пустой лист\n");
- return head;
- }
- //удаляем голову
- if (!index)
- {
- elm = head->next;
- elm->prev = NULL;
- head->next = NULL;
- head->prev = NULL;
- free(head);
- return elm;
- }
- while (elm && i < index - 1)
- {
- elm = elm->next;
- i++;
- }
- //если индекс больше длины списка, ничего не делаем
- if (!elm)
- return head;
- if (!elm->next)
- return head;
- tmp = elm->next;
- if ((elm->next)->next)
- {
- ((elm->next)->next)->prev = elm;
- elm->next = (elm->next)->next;
- tmp->next = NULL; //(elm->next)->next = NULL;
- tmp->prev = NULL;
- }
- else
- elm->next = NULL;
- free(tmp);
- return head;
- }
- Node* CreateList(char* s)
- {
- char* copied[330]; //обьявляем строку с заданным числом элементов
- strcpy(copied, s); //копируем строку s в copied
- int count = 0; //количество слов
- char* vec[30]; //массив слов
- char sep[] = " "; //разделитель - пробел
- char* cur = strtok(copied, sep); //обрезаем первый элемент до пробела
- Node* L = NULL;
- while (cur != NULL) //цикл
- {
- if (count == 30) {
- printf("Количество слов в строке превышает 30\n");
- return NULL;
- }
- vec[count] = cur; //присвоение слова массиву
- count++; //увеличиваем на еденицу
- cur = strtok(NULL, sep);
- }
- for (int i = 0; i < count; ++i) {
- L = addElement(L, vec[i], i);
- }
- return L;
- }
- int isVowel(char c) {
- if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y') {
- return 1;
- }
- return 0;
- }
- Node* func1(Node* L) { // функция, создающая список L1, состоящий из слов с первой гласной буквой
- Node* L1 = NULL;
- Node* p = L;
- int ind1 = 0;
- for (; p != NULL; p = p->next) {
- if (isVowel(p->value[0])){
- L1 = addElement(L1, p->value, ind1);
- ind1++;
- }
- }
- return L1;
- }
- Node* func2(Node* L) { // функция, создающая список L1, состоящий из слов с первой согласной буквой
- Node* L2 = NULL;
- Node* p = L;
- int ind2 = 0;
- for (; p != NULL; p = p->next) {
- if (!isVowel(p->value[0])) {
- L2 = addElement(L2, p->value, ind2);
- ind2++;
- }
- }
- return L2;
- }
- Node* ChangeList(Node* L) {
- char* mx;
- mx = (char*)malloc(30);
- strcpy(mx, L->value);
- Node* p;
- for (p = L; p != NULL; p = p->next) {
- if (strcmp(p->value, mx) > 0) {
- strcpy(mx, p->value);
- }
- }
- int i = 0;
- for (p = L; p != NULL; ) {
- if (!strcmp(mx, p->value)) {
- p = p->next;
- L = DeleteNode(L, i);
- --i;
- }
- else {
- p = p->next;
- }
- ++i;
- }
- return L;
- }
- Node* ClearList(Node* L) {
- Node* next, * tmp = L;
- while (tmp)
- {
- next = tmp->next;
- free(tmp);
- tmp = next;
- }
- L = NULL;
- printf("Лист очищен\n");
- }
- int main() {
- setlocale(LC_ALL, "rus"); //подключаем русский язык
- char* s; //обьявление строки
- input(&s); //вызываем функцию ввода строки
- Node* L;
- L = CreateList(s); //вызываем функцию выполнения задания
- PrintList(L);
- printf("\nСписок из гласных:\n");
- Node* L1 = func1(L);
- PrintList(L1);
- printf("\nСписок из согласных:\n");
- Node* L2 = func2(L);
- PrintList(L2);
- ClearList(L1);
- ClearList(L2);
- ClearList(L);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement