PDA

View Full Version : Esercizio esame sulle liste in C


pierpy796
06-06-2017, 14:36
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");
}
}
}