Отсортировать список по количеству гласных букв в слове - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, Как можно отсортировать список по кол-ву гласных? У меня присутствует сортировка по алфавиту, но нужно сделать по гласным
#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; 
    }
}
Задал массив для гласных но если буду сравнивать слово из списка(value) с массивом нужен вложенный цикл чтобы он находил соответствия затем нужно посчитать кол-во гласных и после этого сравнить уже с кол-вом гласных в других словах
#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);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы