PDA

Visualizza la versione completa : comportamento strano funzione list_search


SSSS90
13-06-2014, 22:36
Salve ho il seguente programma che gestisce il parco auto di un autonoleggio,nell'inserire la prima auto è tutto ok,ma nell'inserimento della seconda auto con un numero di targa diverso,la funzione list search fa qualcosa di strano,insomma il risultato è che anche se la seconda auto ha una targa diversa mi viene stampato il messaggio :Impossibile inserire l'auto,perche' c'e' gia' un auto con la stessa targa....
qualcuno può darmi una mano...ci sho sbattuto la testa tutto il giorno..grazie mille anticipatamente..



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<stdbool.h>
struct SKey{
char targa[11];
};
typedef struct SKey TKey;
struct SSat {
char marca[16];
char modello[16];
int km;
bool disponibile;
};
typedef struct SSat TSat;
struct SInfo{
TKey key;
TSat satellite;
};
typedef struct SInfo TInfo;
struct SNode {
TInfo info;
struct SNode *link;
};
typedef struct SNode TNode;
typedef TNode* TList;
bool greater (TKey key1, TKey key2);
bool lower (TKey key1, TKey key2);
bool equal (TKey key1, TKey key2);
void print_key (TKey key);
void print_satellite (TSat sat);
void print_info (TInfo info);
TKey read_key ();
TSat read_satellite ();
TInfo read_info ();


int menu();
bool inserisci_auto(TList *list, TInfo info);
int elimina_auto_vecchie(TList *list, int km);
void visualizza_auto_disponibili(TList list);
bool noleggia_auto(TList list, TKey key);
bool restituisci_auto(TList list, TKey key, int km_percorsi);
/*PROTOTIPI FUNZIONI SULLE LISTE*/
TList list_create();
TNode*list_search(TList list,TKey key);
/**************************/
TInfo leggi_info();

main()
{
int scelta;
TList list;
TInfo info;
/* Inizializzo la lista */
list = list_create();
/* Scelta della funzione per gestire la rubrica */
while(scelta=menu()){
switch(scelta){

case 1: system("CLS");
printf("\n--------------------\n");
printf("\nInserimento nuova auto\n");
printf("\n--------------------\n\n");
info=read_info();

if(inserisci_auto(&list,info) == true)
printf("L'auto e'stata inserita correttamente nell'elenco\n");
else
printf("Impossibile inserire l'auto,perche' c'e' gia' un auto con la stessa targa\n");

system("pause");
break;


case 2: system("CLS");
printf("\n---------------------------------\n");
printf("\nEliminazione auto vecchie\n");
printf("\n---------------------------------\n\n");
/* da completare */
system("PAUSE");
break;

case 3: system("CLS");
printf("\n-------------------------------------\n");
printf("\nVisualizza auto disponibili\n");
printf("\n-------------------------------------\n");
/* da completare */
system("PAUSE");
break;

case 4: system("CLS");
printf("\n-------------------------------------\n");
printf("\nNoleggio auto\n");
printf("\n-------------------------------------\n");
/* da completare */
system("PAUSE");
break;

case 5: system("CLS");
printf("\n-------------------------------------\n");
printf("\nRestituzione auto\n");
printf("\n-------------------------------------\n");
/* da completare */
system("PAUSE");
break;
}
}
system("PAUSE");
}

int menu()
{
int scelta;

system("CLS");
printf("-------------------------------------------------\n");
printf("PROGRAMMA PER LA GESTIONE DI UN AUTONOLEGGIO\n\n");
printf("1. Inserimento nuova auto\n");
printf("2. Eliminazione auto vecchie\n");
printf("3. Visualizza auto disponibili\n");
printf("4. Noleggio auto\n");
printf("5. Restituzione auto\n");
printf("0. EXIT\n\n");
printf("-------------------------------------------------\n");
printf("Selezionare la scelta [0-5]: ");
scanf("%d", &scelta);
while((scelta<0)||(scelta>5)){
printf("ERRORE! valore non consentito\n");
printf("Selezionare la scelta [0-5]: ");
scanf("%d", &scelta);
}
return scelta;
system("PAUSE");
}

/*FUNZIONI SULLE LISTE*/
TList list_create(){
return NULL;
}

TList list_insert (TList list, TInfo info){
TList prec, curr, new_node;
prec=NULL;
curr=list;
/* F1: ricerca della posizione di inserimento */
while ((curr!=NULL) && (greater(info.key, curr->info.key)==true) ){
prec=curr;
curr=curr->link;
}
/* F2: allocazione del nuovo nodo */
new_node=(TNode *) malloc (sizeof(TNode));
if (new_node==NULL)
{
printf("Non e’ possibile allocare l’elemento\n");
exit(1);
}
new_node->info=info;
/* F3: aggiornamento della catena dei collegamenti */
if (prec==NULL)
{
/* C1: inserimento in Testa */
new_node->link=list;
list=new_node;
return list;
}
else {
/* C2: inserimento in posizione centrale o in coda */
prec->link=new_node;
new_node->link=curr;
return list;
}
}



TNode*list_search(TList list,TKey key){/*viene passata attraverso TKey key la targa?*/
TNode *curr;
curr=list;
while((curr!=NULL) && (greater(key, curr->info.key)== true) )/*a detta della traccia questo confronto viene fatto tra le targhe*/
/*printf("siamo all'interno della funzione list_search il valore di key e'%d\n\n\n",key);*/
/*printf("siamo all'interno della funzione list_search il valore di curr->info.key e'%d",curr->info.key);*/
{
curr=curr->link;
}
/* Analisi delle post - condizioni
C1: valore da cercare piu’
piccolo della Testa : curr != NULL
C2: valore da cercare maggiore
della Coda : curr != NULL
C3: valore da cercare compreso tra
quello di Testa e quello di Coda : curr->info>=info
*/
if ((curr!=NULL) && (equal(curr->info.key, key)==true) )
/* Elemento trovato */
return curr;
else
return NULL;
}



/*FUNZIONI BOOLEANE*/
bool greater (TKey key1, TKey key2)
{
if (strcmp(key1.targa, key2.targa)>0)
return true;
else
return false;
}
bool lower (TKey key1, TKey key2)
{
if (strcmp(key1.targa, key2.targa)<0)
return true;
else
return false;
}
bool equal(TKey key1, TKey key2)
{
if (strcmp(key1.targa, key2.targa)==0)
return true;
else
return false;
}


/*FUNZIONI PER INFO E SATELLITE*/
TKey read_key(){

TKey key;
printf("Inserisci la targa: ");
scanf("%s",key.targa);
return key;
}
TSat read_satellite(){
TSat sat;
printf("Inserisci la marca: ");
scanf("%s",sat.marca);
printf("Inserisci il modello: ");
scanf("%s",sat.modello);
sat.km=0;
sat.disponibile=true;
return sat;
}

TInfo read_info()
{
TInfo info;
TKey key;

key=read_key();
info.satellite=read_satellite();
}

/*FUNZIONI SPECIFICHE RICHIESTE DALLA TRACCIA*/

bool inserisci_auto(TList *list, TInfo info){

TNode*node;

node=list_search(*list,info.key);
if(node==NULL)
{
*list=list_insert(*list,info);
return true;
}
else
return false;







}

oregon
13-06-2014, 22:41
Come mai la read_info non restituisce alcun valore?

SSSS90
13-06-2014, 22:57
grz della risposta..ma ho inserito il return info...ma il programma mi da sempre lo stesso problema...è davvero strano....qualkosa mi sfugge,il problema è che quando inserisco la seconda targa DIVERSA DALLA PRIMA la seguente riga di codice:
if ((curr!=NULL) && (equal(curr->info.key, key)==true) ) contenuta nella funzione
TNode*list_search(TList list,TKey key) anzichè ritornare NULL ritorna curr....

oregon
13-06-2014, 23:03
Sempre nella read_info non assegni la targa alla struttura info ...

P.S. Ma l'hai fatto un minimo di debugging ? Come compilavi senza restituire il valore dalla funzione? Quale compilatore non ti avvisa?

SSSS90
13-06-2014, 23:05
ok ho risolto..bisogna correggere....
info.key=read_key();..grazie mille per l'aiuto....
sei geniale

devc++..

oregon
13-06-2014, 23:10
Lascialo perdere il devc++ ...

SSSS90
13-06-2014, 23:12
e che devo usare?

oregon
13-06-2014, 23:17
Qualsiasi altro IDE e compilatore ...

Con Windows uso sempre Visual Studio e la prima cosa che ha rilevato compilando è che la funzione non restituiva un valore.
Appena corretto, con un breakpoint nella funzione, il contenuto di info ha rilevato la mancanza della targa ... 3 minuti ...

Puoi anche usare Code::Blocks ... ma evita Devc++ ...

SSSS90
13-06-2014, 23:20
grazie ancora...a saperlo prima...

Loading