Отсортировать список по количеству гласных букв в слове - 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);
}
}