Чао, Хабрас.
Мы, начинающие, должны помогать друг другу. :)
Ваш подход слишком сложен. Нет необходимости сортировать введенную строку. Это список, который должен располагать буквы по порядку при добавлении в список.
Более того, есть ошибки. Например, вы объявили массив letter
как
Lettera letter[26];
Итак, допустимый диапазон индексов - [0, 26)
. Однако в этом l oop
for(int i=26; i>=0; i--){
if(letter[i].freq>0){
head=(Lista) malloc (sizeof(Nodo));
head->chara = letter[i].chara;
head->freq = letter[i].freq;
head->next = temp;
temp = head;
}
}
вы пытаетесь получить доступ к несуществующему элементу с индексом, равным 26
.
Вот демонстрационная программа, которая показывает, как буквы может быть добавлен в список.
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
typedef struct nodo
{
char chara;
size_t freq;
struct nodo *next;
} Nodo;
typedef Nodo *Lista;
void initialize( Lista *lista, const char *s )
{
for ( ; *s; ++s )
{
char c = *s;
if ( isalpha( ( unsigned char )c ) )
{
c = tolower( ( unsigned char )c );
Nodo **nodo = lista;
while ( *nodo != NULL && ( *nodo )->chara < c )
{
nodo = &( *nodo )->next;
}
if ( *nodo == NULL || c < ( *nodo )->chara )
{
Nodo *current = malloc( sizeof( Nodo ) );
current->chara = c;
current->freq = 1;
current->next = *nodo;
*nodo = current;
}
else
{
++( *nodo )->freq;
}
}
}
}
int main(void)
{
enum { N = 100 };
Lista lista = NULL;
char s[N];
s[0] = '\0';
printf( "Enter a text: " );
fgets( s, sizeof( s ), stdin );
initialize( &lista, s );
for ( Nodo *current = lista; current != NULL; current = current->next )
{
printf( "{ %c: %zu } ", current->chara, current->freq );
}
puts( "NULL" );
return 0;
}
Его вывод может выглядеть как
Enter a text: Buona notte Habras
{ a: 3 } { b: 2 } { e: 1 } { h: 1 } { n: 2 } { o: 2 } { r: 1 } { s: 1 } { t: 2 } { u: 1 } NULL