Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] problema ordinamento più liste concatentate

    Sto sviluppando un progetto che deve leggere un testo e scrivere per ogni parola quante volte è presente nel testo e in quali righe.
    Non riesco a ordinare le parole da visualizzare.
    Prendendo come testo:

    Che fai tu, luna,in ciel? Dimmi, che fai,
    silenziosa luna

    dovrebbe visualizzare


    invece testando l'output non le riordina. Ho fatto un tentativo con la funziona ordina ma è come se non esistesse.
    Come posso ordinare le parole e tenere in corrispondenza i numeri di riga?

    Questo è il codice che ho scritto:
    codice:
    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
    # include <ctype.h>
    
    # define DIM 200
    # define MAX_CODE 100
    
    #define IS_FULL(ptr) (!(ptr))
    #define IS_EMPY(ptr) (!(ptr))
    
    typedef struct // struttura per memorizzare le parole e il numero di occorrenze
    					{
    					char t [20];
    					int occ;
    					} parola ;
    
    typedef struct ele {
    						  int key;
                        struct ele*link;
    						 }Ele;
    Ele *davanti[MAX_CODE];
    
    Ele *crea_coda( Ele *davanti, int riga );
    //void crea_coda ( Ele *davanti, int riga );
    void stampa_lista( Ele *inizio);
    
    
    //coda_pointer davanti[MAX_CODE],dietro[MAX_CODE];
    
    void inserimento( char s[], parola A[], int *n, int righe);
    
    
    void ordina ( parola A[], int n )
    {
    int i,j,pos,min;
    char parola;
    
    int occorrenze;
    char buffer[30];
    
    for (i = 0 ; i < n - 1 ; i++)
    {
    	for (j = i + 1 ; j < n ; j++)
       {
       	if (A[i].t > A[j].t)
          {
    	      strcpy(buffer,A[j].t);
    			strcpy(A[j].t,A[i].t);
             strcpy(A[i].t,buffer);
             occorrenze = A[j].occ;
             A[j].occ = A[i].occ;
             A[i].occ = occorrenze;
           }
    	}
    }
    
    }
    
    
    void stampa ( parola A[], int n )
    {
    	int i;
      	for (i=0;i<n;i++)
       	{
       	printf ("parola : %s occorrenze: %d ",A[i].t,A[i].occ);
          stampa_lista(davanti[i+1]); // i+1 perchè mettendo solo 1 sbagliava!
    //      printf("\n\n");
          }
    }
    
    void stampa_lista( Ele *inizio)
    {
    	while(inizio)
    	{
       	printf(" riga:  ");
    		printf("%d",inizio->key);
    	   inizio = inizio->link;
     	}
       printf("\n\n");
    /*
    	for (;inizio;inizio = inizio->link)
    	{
    		printf("riga:  ");
    		printf("%d",inizio->key);
       }
       printf("\n\n");
    */
    }
    
    int ricerca( char s[], parola A[], int n)
    {
    	int i,pos= -1;
    
       int dim=strlen(s);
       for(i=0;i<dim; i++)
        	s[i]=tolower(s[i]); // converte in minuscolo ogni lettera
    
      if( (s[dim-1]=='!') || (s[dim-1]=='?') || (s[dim-1]=='.') || (s[dim-1]==':')
      || ( s[dim-1]==',') || (s[dim-1]==';'))   //l'ultimo carattere è punteggiatura
       {
          s[dim-1]='\0';
       }
    
    	for (i=0;(i<n) && (pos <0);i++)
    	{
    		if ( strcmp (s,A[i].t )==0)
    			pos = i;
    	}
    	return pos;
    }
    
    Ele *crea_coda( Ele *davanti, int riga )
    //void crea_coda ( Ele *davanti, int riga )
    {
    Ele *p;
    Ele *aux = NULL;
    p = (Ele*) malloc (sizeof(Ele) );
    p->key = riga;
    p->link = NULL;
    
    //if (!davanti)
      //	return(p);
    //else
    	{
       aux = davanti;
       while ( aux->link && aux->link->key != riga) // per vedere se ho già inserito quel numero di riga aggiungere && aux->key != riga
       	aux = aux->link;
       aux->link = p;
    //   printf("  ------- riga crea_coda  P:  %d  AUX: %d  riga: %d\n",p->key,aux->link->key,riga);
       return (davanti);
       }
    }
    
    
    void inserimento( char s[], parola A[], int *n, int righe)
    {
    	int pos;
    
    	pos = ricerca(s,A ,*n);
    
    	if (pos <0) // la parola non esiste ancora perciò la creo
    	{
    		A[*n]. occ =1;
          strcpy (A[*n].t,s);
    	pos=(*n);  // da togliere serve alla printf
    		(*n)++;
    	}
    	else     // aggiorno il contatore esistente
    		A[pos].occ++;
    
    //   printf("--- ho messo [  %s  ]  in A[  %d  ]  ho passato la riga [  %d  ]\n", s,pos,righe);
    
    // creo la coda con i numeri di riga
      crea_coda(&davanti[pos],righe);
    	//davanti[pos] = crea_coda( &davanti[pos], righe );  da cancellare
    //
    }
    
    int main()
    {
    	parola A[DIM];
    	FILE *fp;
    	char s [20];
    	int n =0; // posizione nel vettore dell'ultima parola inserita
       char c;
       int righe = 1;
    
    int i;
    
    for ( i = 0 ; i < 10 ; i++ )
    	davanti[i] = NULL;
    
     	fp= fopen("testo.txt","rt");
    
    	if (fp== NULL)
    	{
    		printf (" file non trovato\n");
    		exit ( -1);
    	}
    	while (! feof(fp ))
    	{
    
    //		fscanf (fp ,"%s[^ \f\n\r\t\v]%c",s,&c);     // con s al posto di 255 non riesce a contare le righe!
    		fscanf (fp ,"%255[^ \f\n\r\t\v]%c",s,&c);
    //
    //	printf("riga: %d parola:%s  carattere: %c \n",righe,s,c);
       inserimento(s, A, &n, righe); // passa la parola,l'array e 0 (la prima volta)
    
    	if (c == '\n')
    		righe++;
    	}
    	fclose (fp);
       printf("\n\n\n");
    //ordinamento della lista
    ordina(A,n);
    	stampa (A,n);
    	printf ("\n\nfine premi invio per uscire");
    	fflush(stdin);
    	getchar();
    }

  2. #2
    ho risolto!

    bastava aggiungere questo pezzo di codice che la prima volta non aveva funzionato

    codice:
     
     temp = davanti[i + 1];
     davanti[i + 1] = davanti[j + 1];
     davanti[j + 1] = temp;
    con temp dichiarata

    codice:
    Ele *temp;
    Spero possa servire a qualcun'altro.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.