Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C]Problema lista

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    86

    [C]Problema lista

    Salvo ho un problema con un programma:

    Questo è il codiche del file squadra.c:
    codice:
    /****************************************************************************/
    /*                                LIBRERIE                                  */
    /****************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include "squadra.h"
    
    int calcolapuntgio(int r,int a,int c,int p,int ca,int co,int re){
    int prod;
    prod=(r*a)+(r*c)+(r*p)+(r*ca)+(r*co)+(r*re);
    
    return prod;
    }
    
    
    /****************************************************************************/
    /*                            INSERIMENTO IN LISTA                          */
    /****************************************************************************/
    void inserisci_l(pnodo *L, char *nome,int tot,int per)
    {
    	pnodo aus = NULL,
    		  tmp = NULL;
        if (( aus = (pnodo) malloc (sizeof(struct nodo) ) ) == NULL )
            fprintf(stderr,"ERRORE overflow %d\n");
    	else{
    		        aus->nome  = nome;
                    aus->totsq  = tot;
                    aus->fatmolt  = (per*100)/5;
                    aus->punteggio  = (aus->totsq)*(aus->fatmolt);
    	        	aus->next = NULL;
    		if(*L == NULL)
    			*L = aus;
    		else{
    			tmp = *L;
    			while(tmp->next)
    				tmp = tmp->next;
    			tmp->next = aus;
    		}
    	}
    }
    
    
    /****************************************************************************/
    /*                              STAMPA LISTA                                */
    /****************************************************************************/
    void print_l(pnodo L){
        while (L != NULL){
            printf(" %s %d %d %d\n",L->nome,L->totsq,L->fatmolt,L->punteggio);
            L = L->next;
        }
        printf("NULL\n");
    }
    Questo è il codice del file squadra.h
    codice:
    /* LISTA  */
    typedef struct nodo *pnodo;
    struct nodo{
    	char *nome;
    	int totsq;
    	int fatmolt;
    	int punteggio;
    	pnodo next;
    };
    
    void inserisci_l(pnodo *L, char *n,int t,int f);
    int calcolapuntgio(int a,int b,int c,int d, int e,int f,int h);
    void print_l(pnodo L);
    Per inserire i dati uso
    inserisci_l(&lista,nsq,totsq,vit);
    dove prima pongo
    pnodo lista=NULL;

    Il mio problema è come faccio a creare una funzione che prende in input l'intera lista e un nome e restituisce il punteggio corrispondente a quel nome?

    Grazie in anticipo a chi mi risponderà!!!

  2. #2
    Ciao.. Se ho capito bene basta, una volta che hai il nome della squadra da cercare, che scorri la lista dall'inizio, confronti il nome della squadra con quello dato in input e se è uguale stampi il punteggio e termini la funzione;
    Per confrontare i due nomi puoi usare la funzione strcmp della libreria string.h. Puoi controllare come funziona da
    qui

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    86
    Io ho usato questa funzione ma non mi restituisce il giusto risultato
    codice:
    int cerca(pnodo L,char *n1){
    	 int p1;
    	 while (L != NULL){
    		 if (strcmp(L->nome,n1)==0)
    		   p1=L->punteggio;
    		   else
    		   L=L->next;
    		   }
    	 return p1;
     }
    E nel main ho messo:

    vincente=cerca(lista,sq1)

    Forse sbaglio a passargli lista?

  4. #4
    Sinceramente non ho fatto girare il programmino per mancanza di tempo.. però a vederlo sembra giusto anche se farei una piccola modifica:
    codice:
    int cerca(pnodo L,char *n1){
    	 int p1;
    	 while (L != NULL){
    		 if (strcmp(L->nome,n1)==0)
                     { 
    		   p1=L->punteggio;
                       break;
                     } 
    		   else
    		   L=L->next;
    		   }
    	 return p1;
     }
    In questo modo appena trova la squadra stampa il punteggio esce dal while e ritorna p1.

  5. #5
    La modifica fatta prima serve se nella lista esiste una sola squadra con il nome cercato..
    Guardando adesso meglio il codice del tuo programma e avendolo eseguito posso notare che ci sono degli errori nella funzione inserisci_l; Infatti credo che il mal funzionamento del programma sia dovuto proprio a questo. Infatti se provi a stampare la lista una olta che hai finito l'inserimento potrai notare soltanto che la lista è formata da elementi che hanno sempre lo stesso nome; Questo accade perchè adesso srai lavorando con le stringhe che per come sono fatte sono puntatori all'elemento iniziale;
    Con l'istruzione
    codice:
    aus->nome  = nome;
    fai puntare aus-> nome a nome; quindi aus-> nome dipende fortemente da nome; infatti quando provi ad inserire un altro elemento in lista con il nome diverso non fai altro che far puntare nome all'elemento iniziale di un' altra stringa, e quindi far puntare ogni aus->nome a questo elemento. Per ovviare al problema devi apportare delle modifiche alla funzione inserisci_l;
    codice:
    void inserisci_l(pnodo *L, char *nome,int tot,int per)
    {
    	pnodo aus = NULL,
    		  tmp = NULL;
        if (( aus = (pnodo) malloc (sizeof(struct nodo) ) ) == NULL )
            fprintf(stderr,"ERRORE overflow %d\n");
    	else{
                  aus->nome = (char*)malloc(strlen(nome)*sizeof(char)); 
    	      strcpy(aus->nome,nome);
                    aus->totsq  = tot;
                    aus->fatmolt  = (per*100)/5;
                    aus->punteggio  = (aus->totsq)*(aus->fatmolt);
    	        	aus->next = NULL;
    		if(*L == NULL)
    			*L = aus;
    		else{
    			tmp = *L;
    			while(tmp->next)
    				tmp = tmp->next;
    			tmp->next = aus;
    		}
    	}
    }
    In questo modo allochi prima lo spazio necessario a contenere nome, e poi copi la stringa nome in aus->nome; Questa volta aus->nome non dipenderà da nessuno e resterà cosi anche quando nome verrà modificato

    NB: non ho considerato i terminatori di stringa

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