Frequenza per ogni riga - lista concatenata in C

di il
4 risposte

Frequenza per ogni riga - lista concatenata in C

Buongiorno a tutti,
devo scrivere una lista concatenata per memorizzare una sequenza di caratteri (A, C, G, T) passati da terminale su più righe, e successivamente calcolare la frequenza di ciascuna lettera per ogni riga. Ho dei problemi su quest'ultima parte. Ho provato a scrivere una funzione "frequenza_a" per contare il numero di A per ciascuna riga (considero finita la riga quando premo invio), e volevo memorizzare la frequenza di A per ciascuna riga in un array, ma non funziona (mi stampa tutti zeri).

#include <stdio.h>
#include <stdlib.h>

typedef struct sequenza Sequenza;

struct sequenza 
{
  char carattere;
  Sequenza *prox;
};
Sequenza *testa = NULL;

// Funzione che aggiunge un elemento in testa alla lista e restituisce la nuova testa della lista
Sequenza * aggInTesta (Sequenza * testa, char car) 
{
  Sequenza * nuovaTesta;
  // Creo il nuovo elemento della lista
  nuovaTesta = (Sequenza *) malloc(sizeof(Sequenza));
  
  if(nuovaTesta == NULL) 
     return NULL;
  
  nuovaTesta->carattere = car;
  nuovaTesta->prox = NULL;
  
  // Nel caso ci siano altri elementi nella lista...
  if(testa != NULL) 
  {
     // ...assegno al campo prox il valore di testa per fare in modo che diventi il primo elemento
     nuovaTesta->prox = testa;
  }

  return nuovaTesta;
}

// Funzione per stampare gli elementi della lista al contrario
void StampaListaRovesciata(Sequenza *p) 
{  
  if(p == NULL)
     return;

  StampaListaRovesciata(p->prox);
  printf("%c", p->carattere);
}

// Funzione per trovare il numero di A per ogni riga della lista
int frequenza_a (Sequenza *cursore, int count_a[], int N)
{
  for(int i = 0; i < N; i++) 
     count_a[i] = 0; 

  while(cursore != NULL) 
  {
     for(int i = 0; i < N; i++)
     {
        if(cursore->carattere != '\n')
        {
           if(cursore->carattere == 'A')
              count_a[i]++;
        
        else
          count_a[i] = 0;
        }
    
        cursore = cursore->prox;
     }
  } 
  
  return count_a[N];
}


int main()
{
  int c;
  c = getchar();

  int riga = 0;

  int *freq_a;
  freq_a = malloc (riga*sizeof(int));

  while(c != EOF)
  {
     testa = aggInTesta(testa, c);

     if(testa == NULL) exit(EXIT_FAILURE); 

     if(c == '\n')
        riga++;
     
    c = getchar(); 
  }
  
  StampaListaRovesciata(testa);

  for(int i = 0; i < riga; i++)
     printf("frequenza di A = %d\n", frequenza_a(testa, freq_a, riga));
  
  exit(EXIT_SUCCESS);
}


Non so proprio cosa sbaglio, grazie mille in anticipo a chi mi aiuterà!

4 Risposte

  • Re: Frequenza per ogni riga - lista concatenata in C

    Un primo errore lo vedo qui:
    int main()
    {
      int c;
      c = getchar();
    
      int riga = 0;
    
      int *freq_a;
      freq_a = malloc (riga*sizeof(int));
    ......
      }
    Se riga vale 0, allora la malloc...
  • Re: Frequenza per ogni riga - lista concatenata in C

    Grazie mille per la risposta
    Se la riga vale 0, allora la malloc crea un vettore di dimensione 0, giusto? Ho corretto così: non inizializzo riga a 0 e il vettore freq_a lo creo dopo il ciclo while, così ho il valore di riga.
    
      int riga;
    
      while(c != EOF)
      {
         testa = aggInTesta(testa, c);
    
         if(testa == NULL) exit(EXIT_FAILURE); 
    
         if(c == '\n')
            riga++;
         
        c = getchar(); 
      }
      
      StampaListaRovesciata(testa);
    
      int *freq_a;
      freq_a = malloc (riga*sizeof(int));
    
      for(int i = 0; i < riga; i++)
         printf("frequenza di A = %d\n", frequenza_a(testa, freq_a, riga));
    
    Così è corretto?
  • Re: Frequenza per ogni riga - lista concatenata in C

    Dovrebbe essere corretto. Che poi il tutto funzioni è un altro discorso...
  • Re: Frequenza per ogni riga - lista concatenata in C

    Va bene grazie, ho provato a correggere la funzione frequenza e ora l'ho scritta così:
    
    // Funzione per trovare il numero di A per ogni riga della lista
    int frequenza (Sequenza *cursore, char lettera, int count)
    {
      count = 0; 
    
      while(cursore != NULL) 
      {
            if(cursore->carattere != '\n')
            {
               if(cursore->carattere == lettera)
                  count++;
            }
        
            cursore = cursore->prox; 
      } 
      
      return count;
    }
    
    e la chiamo nel main così:
    
    char A = 'A';
      for(int i = 0; i < riga; i++)
         printf("frequenza di A = %d\n", frequenza(testa, A, freq));
    
    però in questo modo mi conta tutte le A inserite. Ho provato anche a scrivere
    
      while(cursore->carattere != '\n')
    
    invece di 'if' perché mi sembrava più corretto, ma così quando eseguo il programma, si blocca.
    Come posso fare per farmi contare il numero di A per ciascuna riga?
Devi accedere o registrarti per scrivere nel forum
4 risposte