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..
codice:
#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;
}