Esercizio esame sulle liste.

di il
3 risposte

Esercizio esame sulle liste.

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");
} 
} 
}

3 Risposte

  • Re: Esercizio esame sulle liste.

    Prima cosa indenta in modo decente il codice.
    Seconda cosa usa i tag appositi per postare il codice...
  • Re: Esercizio esame sulle liste.

    Le chiedo scusa è la prima volta che scrivo in questo forum
  • Re: Esercizio esame sulle liste.

    Allora,..... è un vero casino, ma già per il punto 1...

    Tralasciando le cose più strane che hai scritto, il primo vero problema che vedo è: perché hai creato una struttura che è un array di 60 caratteri?
    Quello che ti veniva richiesto è semplicemente di creare una lista, ogni elemento del lista contiene uno dei 60 caratteri. Quindi alla fine avrai una lista di 60 nodi.

    Facendo così, probabilmente, ti può essere più semplice anche il calcolo della frequenza dei caratteri. Il primo approccio da utilizzare è utilizzare un array di 26 (numero delle lettere dell'alfabeto) per contare la frequenza di ogni singolo carattere.
Devi accedere o registrarti per scrivere nel forum
3 risposte