PDA

Visualizza la versione completa : [C]Problema lista


claretta
19-02-2010, 15:56
Salvo ho un problema con un programma:

Questo è il codiche del file squadra.c:


/************************************************** **************************/
/* 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


/* 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à!!!

ignaziodeblasi
19-02-2010, 16:25
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 (http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)

claretta
19-02-2010, 19:52
Io ho usato questa funzione ma non mi restituisce il giusto risultato


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?

ignaziodeblasi
20-02-2010, 00:41
Sinceramente non ho fatto girare il programmino per mancanza di tempo.. però a vederlo sembra giusto anche se farei una piccola modifica:


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.

ignaziodeblasi
20-02-2010, 02:35
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


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;


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 :)

Loading