Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    [c] operazione sulle liste

    Ho postato un nuovo messaggio perche quello di prima non mi ha cagato nessuno ...

    Cerco di fare una domanda più generale

    Ho una lista che contiene n stringhe

    volevo fare le seguenti operazioni su tale lista:

    - verificare se nella lista sono contenute stringhe uguali

    - se si quante uguali tra loro

    - stampare a video le stringhe nell'ordine da quelle ripetute più volte a quelle non ripetute

    GRAZIE A TUTTI CIAO


  2. #2
    Io farei in questo modo:

    - Crei una nuova lista ma stavolta oltre al campo stringa, metti anche un contatore.

    - Crei un nuovo elemento (e) settando a zero i due campi.

    - Ordini la lista delle tue stringhe.


    - Scorri la lista ordinata, se il valore della stringa corrente è diverso da quello del elemento nuovo (e, che al inizio sarà NULL) inserisci la stringa e ne crei uno in sucessione.
    Altrimenti vai avanti finchè non trovi una stringa diversa da quella di (e), incrementando ogni volta il contatore.

    - Vai avanti così finchè non hai finito tutta la lista.

    - In questo modo avrai una lista contenente di cui ogni elemento contiene una stringa, e quante volte esse si ripete.

    - Ordini la nuova lista.

    - La stampi.

    bye

  3. #3
    Pesantissimo io ho una lista del genere:

    codice:
    struct List
    {
      char *el;
      struct List *next;
      struct List *prev;
    };
    
    void init(struct List *aux, char *el);
    void add(struct List *aux, char *el);
    
    void init(struct List *aux, char *el)
    {
      assert(aux != NULL);
      //Bisogna allocare la memoria prima di effettuare la copiatura
      aux -> el = (char *)malloc(254 * sizeof(char));
      strcpy(aux->el, el);
      aux->next = NULL;
      aux->prev = NULL;
    }
    
    void add(struct List *aux, char *el)
    {
      assert(aux != NULL);
      while(aux->next != NULL)
        aux = aux->next;
      struct List *tmp = (struct List *)malloc(sizeof(struct List));
      //Bisogna allocare la memoria prima di effettuare la copiatura
      tmp -> el = (char *)malloc(254 * sizeof(char));
      strcpy(tmp->el, el);
      tmp->next = NULL;
      tmp->prev = aux;
    
      aux->next = tmp;
    }
    puoi farmi un esempio?

    GRAZIE CIAO

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Puoi fare qlcosa del genere:

    codice:
    //Struttura per mantenere il numero di occorrenze di una stringa
    
    struct ListCount
    {
      char *el;
      struct ListCount *next;
      int count;
    };
    
    //La seguente funzione prende in input una lista di List e
    //restituisce una lista di ListCount, costiutita da tanti elementi
    //quanti sono le stringhe diverse, e per ognuna il campo count 
    //contiene il numero di occorrenze della stringa
    
    struct ListCount *buildListCount(struct List lis){
            //Il puntatore a ListCount che sarà resituito come risultato
    	struct ListCount * lisCount= NULL;
            //scorriamo la lista di stringhe
    	for(;lis != NULL; lis = lis -> next){
                    //se listCount non è ancora inizializzato creiamo il
                    //primo elemento e ci inseriamo la prima stringa
                    //della lista
    		if(lisCount == NULL){
    			lisCount =(struct ListCount *)malloc(sizeof(struct ListCount));
    			lisCount -> el = lis -> el;
    			lisCount -> next = NULL;
    			lisCount -> count = 1;
    		}
                    //altrimenti scorriamo lisCount; se la stringa
                    //corrente è gia presente incrementiamo il campo
                    //count, se no aggiungiamo un nuovo elemento
                    //alla lista lisCount per la stringa corrente
    		else{
    			ListCount *temp = lisCount;
    			//ultimo elemento non nullo di lisCount
    			ListCount *last = NULL;
    			for(; temp != NULL; temp = temp -> next){
    				if(strcmp(lis -> el, temp -> el) == 0){
    					temp -> count = temp -> count + 1;
    					break;
    				}
    				last = temp;
    			}
    			//Se la stringa non è stata trovata temp == NULL
    			//quindi creiamo un nuovo elemento nella lista
    			if(temp == NULL){
    				last -> next = (struct ListCount *)malloc(sizeof(struct ListCount));
    				last = last -> next;
    				last -> el = lis -> el;
    				last -> next = NULL;
    				last -> count = 1;
    			}
    		}
    	}
    	return lisCount;
    }
    A questo punto, se vuoi stampare le stringhe in ordine decrescente di occorrenze puoi ordinare la lista restituita da buidListCount in base al campo el, e poi stamparla.

    PS: il codice non l'ho testato, quindi potrebbe contenere errori, però come idea è corretto,


  5. #5
    ok grazie ma non ho capito molto ...

    comunque mi da errore qui:

    codice:
    struct ListCount *buildListCount(struct List lis){
    Ma devo sostituire tutto il mio codice dove definisco la mia lista con quello che hai postato tu? oppure devo implementare le due porzioni di codice?

    Perchè nel mio prg successivamente nel main (), aggiungo elementi nella lista mediante una cosa del genere:

    codice:
    struct List *head = NULL;
    struct List *temp = NULL;
    
                        
    while(fgets(s,254,FileIn))
    {                
            if (strstr (s, par) != NULL)
            {
                  if(head == NULL){
                          head = (struct List *)malloc (sizeof(struct List));
                          init(head, s);
                  }
                  else
                           add(head, s);
    
                  temp = head;
                 
                  y++;
            }
            else           
                   x++;
    }
                  while(temp != NULL)
                  {
                          printf("%s\n", temp ->el);
                          temp = temp ->next;
                  }
                  c = -1;
                  fclose(FileIn); 
     
     }

    QUALCUNO RIESCE A SCHIARIRMI UN PO LE IDEE?

    grazie

    ciao

  6. #6
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    La riga su cui ti da errore sostituiscila con:

    struct ListCount *buildListCount(struct List *lis){

    Questo codice va AGGIUNTO al tuo, prima del main, non va a sostituire niente.


  8. #8
    ho apportato alcune modifiche ora non da più nessun errore ...

    codice:
    struct ListCount
    {
      char *el;
      struct ListCount *next;
      int count;
    };
    
    //La seguente funzione prende in input una lista di List e
    //restituisce una lista di ListCount, costiutita da tanti elementi
    //quanti sono le stringhe diverse, e per ognuna il campo count 
    //contiene il numero di occorrenze della stringa
    
    struct ListCount *buildListCount(struct List *lis){
            //Il puntatore a ListCount che sarà resituito come risultato
    	struct ListCount * lisCount = NULL;
            //scorriamo la lista di stringhe
    	for(lis != NULL; lis = lis -> next;)
     {
                    //se listCount non è ancora inizializzato creiamo il
                    //primo elemento e ci inseriamo la prima stringa
                    //della lista
    		if(lisCount == NULL){
    			lisCount =(struct ListCount *)malloc(sizeof(struct ListCount));
    			lisCount -> el = lis -> el;
    			lisCount -> next = NULL;
    			lisCount -> count = 1;
    		}
                    //altrimenti scorriamo lisCount; se la stringa
                    //corrente è gia presente incrementiamo il campo
                    //count, se no aggiungiamo un nuovo elemento
                    //alla lista lisCount per la stringa corrente
    		else
      {
    			struct ListCount *temp = lisCount;
    			//ultimo elemento non nullo di lisCount
    			struct ListCount *last = NULL;
    			for(; temp != NULL; temp = temp -> next){
    				if(strcmp(lis -> el, temp -> el) == 0){
    					temp -> count = temp -> count + 1;
    					break;
    				}
    				last = temp;
    			}
    			//Se la stringa non è stata trovata temp == NULL
    			//quindi creiamo un nuovo elemento nella lista
    			if(temp == NULL){
    				last -> next = (struct ListCount *)malloc(sizeof(struct ListCount));
    				last = last -> next;
    				last -> el = lis -> el;
    				last -> next = NULL;
    				last -> count = 1;
    			}
    		}
    	}
    	return lisCount;
    }

  9. #9
    Io ora nel MAIN ho questo codice che mi stampa tutta la mia lista anche i duplicati :

    codice:
    struct List *head = NULL;
    struct List *temp = NULL;
    
                        
    while(fgets(s,254,FileIn))
    {                
            if (strstr (s, par) != NULL)
            {
                  if(head == NULL){
                          head = (struct List *)malloc (sizeof(struct List));
                          init(head, s);
                  }
                  else
                           add(head, s);
    
                  temp = head;
                 
                  y++;
            }
            else           
                   x++;
    }
                  while(temp != NULL)
                  {
                          printf("%s\n", temp ->el);
                          temp = temp ->next;
                 
                  }
    
                  c = -1;
                  fclose(FileIn); 
     
     }
    Il codice postato nel post precedente definisce un COUNT ALLA LISTA

    come posso vedere quante volte è ripetuta una stessa stringa nella mia lista ?

    Per esempio la mia lista è composta da:

    vasco rossi
    rino gaetano
    vasco rossi
    vasco rossi
    rino gaetano
    patty pravo

    voglio vedere quante volte sono ripetute le stesse stringhe nella lista e stamparle a video nel seguente modo:

    vasco rossi
    rino gaetano
    patty pravo

    vasco rossi per primo perchè è contenuto 3 volte
    rino gatano secondo perchè contenuto 2 volte
    e per ultima patty pravo chè è presente solo una volta


    Spero di essere stato chiaro


    GRAZIE A TUTTI DI NUOVO

    CIAO CIAO

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Se head è la tua lista originaria fai cosi:

    struct ListCount *listCount = buildListCount(head);

    A questo punto listCount contiene tutte lel stringhe una sola volta e per ognuna di esse è indicato il numero di occorrenze nel campo count. Per stamparle in base al numero di occorrenze devi ordinare la lista in base al campo count, utilizzando un algoritmo di ordinamento.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.