Отсортировать список по количеству гласных букв в слове - C (СИ)
Формулировка задачи:
Добрый вечер,
Как можно отсортировать список по кол-ву гласных?
У меня присутствует сортировка по алфавиту, но нужно сделать по гласным
Задал массив для гласных но если буду сравнивать слово из списка(value) с массивом нужен вложенный цикл чтобы он находил соответствия затем нужно посчитать кол-во гласных и после этого сравнить уже с кол-вом гласных в других словах
но не особо получается
#define N 20 ... void ins_sort(Node *list){ //сортировка по алфавиту Node *a = list->next; char tmp[N]; int i = 0; while (a){ if (strcmp(list->value, a->value) > 0){ strcpy_s(tmp, a->value); while(list->value[i] != '\0'){ a->value[i] = list->value[i]; a->value[i+1] = '\0'; i++; } strcpy_s(list->value, tmp); i = 0; } a = a->next; } }
#define N 20 ... void ins_sort(Node *list){ Node *a = list->next; char tmp[N]; int i = 0; while (a){ char glasnii[12] = "AaEeYyOoIiUu" ... if(while(list->value[i] != '\0') a->value[i] = list->value[i]; a->value[i+1] = '\0'; i++; strcpy_s(list->value, tmp); i = 0; } a = a->next; } }
добавил одну переменную в node, отвечающую за кол-глс int kol_gls;
и попробовал вот так сделать но возникают траблы
void ins_sort_2(Node *list){ //сортировка по кол-ву гласных Node *a = list->next; char tmp[N]; int i = 0; char glas[12] = {'A','a','E','e','Y','y','U','u','I','i','O','o'}; int count = 0; while (a){ strcpy_s(tmp, a->value); while(list->value[i] != '\0'){ for(int m = 0; m < 12;){ if(list->value[i] == glas[m]){ count++; i++; } else m++; } i++; list->kol_gls = count; } i = 0; a = a->next; } }
Решение задачи: «Отсортировать список по количеству гласных букв в слове»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> #include <string.h> #include <ctype.h> #define MAX_LEN 32 struct node { struct node* next; char buf[MAX_LEN]; }; int count_vch(const char* s); int slist_add(struct node** lst, const char* str); void slist_sort(struct node** lst); void slist_clear(struct node* lst); int main(void){ struct node* p, *lst = NULL; slist_add(&lst, "ABCDEF"); slist_add(&lst, "EEEeeeeeeeeeeee"); slist_add(&lst, "IIIIIIIII"); slist_add(&lst, "OOOOX"); slist_add(&lst, "AAAAOO"); slist_add(&lst, "XOR"); slist_add(&lst, "UNIVERSAL"); slist_sort(&lst); for(p = lst; p != NULL; p = p->next) puts(p->buf); slist_clear(lst); return 0; } //подсчёт гласных int count_vch(const char* s){ static int abc[26]; int i, n = 0; if(abc[0] != 1){ memset(abc, 0, sizeof(abc)); abc['A'-'A'] = abc['E'-'A'] = abc['Y'-'A'] = abc['O'-'A'] = abc['I'-'A'] = abc['U'-'A'] = 1; } for(; *s; ++s){ i = toupper(*s) - 'A'; if((i >= 0 && i <= 26) && abc[i]) ++n; } return n; } //сортировка void slist_sort(struct node** lst){ struct node* t, *pa, *pb, *p, *i; for(t = NULL, i = *lst; i != NULL; ) { pa = i; i = i->next; pb = t; for(p = NULL; (pb != NULL) && count_vch(pa->buf) > count_vch(pb->buf); ) { p = pb; pb = pb->next; } if(p == NULL) { pa->next = t; t = pa; } else { pa->next = pb; p->next = pa; } } if(t != NULL) *lst = t; } //добавление в список int slist_add(struct node** lst, const char* str){ size_t n; struct node* p = (struct node*)malloc(sizeof(struct node)); if(p != NULL){ if((n = strlen(str)) >= MAX_LEN) n = MAX_LEN - 1; strncpy(p->buf, str, n); p->buf[n] = '\0'; p->next = *lst; *lst = p; } return (p != NULL); } //удаление списка void slist_clear(struct node* lst){ struct node* t; while(lst != NULL){ t = lst; lst = lst->next; free(t); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д