Salve ragazzi tra pochi giorni ho un esame ed è già la seconda volta che provo a superarlo. L'anno scorso non riuscii a fare quest'esercizio e volevo chiedervi di aiutarmi.
Data L una lista di caratteri, si realizzino in C:
1)Una funzione che popoli L con 60 caratteri casuali tra 'a' e 'z'(codici ASCII a=97, z=122);
2)Una funzione che calcoli il carattere che appare con maggiore frequenza in L;
3)Una funzione che, letto un carattere c da tastiera, crei due nuove liste L1 e L2, dove L1 contiene tutti i caratteri alfabeticamente mino o uguali a c, ed L2 tutti quelli maggiori.
Il primo punto l'ho risolto con tranquillità, ma sono bloccato al secondo da 3 giorni:
Nell'ultima funzione (che posterò insieme a tutto il codice fin'ora svolto di seguito) volevo, prima di stampare i carattere con maggiore frequenza, stampare le occorrenze di tutti i caratteri, ovviamente evitando di riscrivere due volte gli stessi caratteri con il flag "gia_fatto". Ma quando vado a compilare il programma arriva al 24esimo,25esimo elemento e compare "Segmentation fault". Qualcuno saprebbe aiutarmi? Vi ringrazio in anticipo
P.S. se nei cicli FOR dell'ultima funzione, inserisco 30 e 30, invece di 60 e 60, il programma funziona e sono anche riuscito a risolvere il secondo punto. Può essere un problema legato alla memoria? Perchè 30 elementi li scorre senza problemi e tutti i 60 invece no?
CODICE:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
typedef struct s_info{
int info[60];
}t_info;
struct s_node{
t_info carattere;
struct s_node *link;
};
typedef struct s_node t_node;
typedef t_node *t_list;
//PROTOTIPI FUNZIONE
t_list crea_lista();
t_info info_casuali(t_list lista);
t_list inserisci_elemento(t_list lista,t_info info);
void stampa_lista(t_list lista);
void carattere_piu_frequente(t_list lista, t_info info);
int main(){
t_list lista;
int i;
t_info info;
lista=crea_lista();
for(i=0;i<60;i++){
info=info_casuali(lista);
lista=inserisci_elemento(lista,info);
}
stampa_lista(lista);
carattere_piu_frequente(lista,info);
return 0;
}
//IMPLEMENTO FUNZIONI
t_list crea_lista(){
return NULL;
}
t_info info_casuali(t_list lista){
int i;
t_info info;
srand(time(NULL));
for(i=0;i<60;i++){
info.info[i]=97+rand()%(122-97);
}
return info;
}
t_list inserisci_elemento(t_list lista,t_info info){
t_list newnode,curr,prec;
prec=NULL;
curr=lista;
while(curr!=NULL){
curr=curr->link;
}
newnode=(t_node*)malloc(sizeof(t_node));
newnode->carattere=info;
newnode->link=curr;
if(prec==NULL){
newnode->link=lista;
lista=newnode;
return lista;
} else {
prec->link=newnode;
newnode->link=curr;
return lista;
}
}
void stampa_lista(t_list lista){
int i=0;
t_list curr;
curr=lista;
while(curr!=NULL){
printf("%c -> ", curr->carattere.info[i]);
curr=curr->link;
i++;
}
printf("NULL");
printf("\n");
}
void carattere_piu_frequente(t_list lista, t_info info){
int i,j,gia_fatto,occorrenze;
t_list curr;
curr=lista;
for(i=0;i<60;i++){
gia_fatto=0;
for(j=0;j<i;j++){
if(curr->carattere.info[i]==curr->carattere.info[j]){
gia_fatto=1;
curr=curr->link;
}
}
if(gia_fatto==0){
occorrenze=0;
for(j=0;j<60;j++){
if(curr->carattere.info[i]==curr->carattere.info[j]){
occorrenze++;
curr=curr->link;
}
}
printf(" - lettera %c; occorrenze %d",curr->carattere.info[i],occorrenze);
printf("\n");
}
}
}