Salve ragazzi, come avete capito avrei bisogno di un aiuto...il professore di programmazione mi ha commissionato un programma in cui
-la funzione C riceve in ingresso un lista collegata di ptr a float; un numero
float A ed un valore
int X questa deve innanzitutto :
-verifcare se il num A è presente o meno nella lista restituendo al termine della sua esecuzione un valore Vero o Falso (ho COPIATO da libro di testo la Boolean search_A......);
- e, se il numero A è presente nella lista, la funz deve cancellare (liberando la memoria), gli elementi della lista il cui valore è compreso entro A-x ed A+x inclusi.La lista modificata deve essere visibile alla funz chiamante....
ecco sicuramente per voi sarà un gioco da ragazzi...ma a me non torna ...e ci sto perdendo la testa..... cosa cavolo sto sbagliando?????!!!!!!! fino alla funzione visita è tutto ok...poi il Boolean non mi trova MAI il valore di A............. Bho
#include <stdio.h>
#include <stdlib.h>
//definizione del tipo booleano
typedef unsigned short int Boolean;
#define TRUE 1
#define FALSE 0
//definizione della struttura della lista colegata da puntatori
struct list{
float value;
struct list *next_ptr;
};
//prototipi delle funzioni
void init(struct list ** ptrptr);
void visit(struct list * ptr);
Boolean search_A( struct list *ptr, struct list **ptrptr, float A );
void pre_insert( struct list ** ptrptr, float value );
void cancella (struct list **ptrptr,int x, float A);
int main(int argc, char *argv[])
{
struct list * ptr;
struct list **ptrptr;
int N;
int count;
float A;
float value;
int x;
char selez;
Boolean found,exit_required;
init( &ptr );
printf("\n Questa funzione fa schifo.\n\n");
printf("\n Inserisci il valore di A\n\n"); scanf("&f", &A);
while (getchar() != '\n');
printf("\n Inserisci il valore di x\n\n"); scanf("&d", &x);
printf("\n a - Inserisci numero di elementi della lista:");
printf("\n d - Visita la lista");
printf("\n e - Esegui la funzione");
printf("\n f - Visita la lista dopo la funzione");
printf("\n g - Esci dal programma");
do
{ fflush(stdin);
exit_required=FALSE;
printf("\n\n Seleziona cosa desideri fare ");
selez=getchar();
switch (selez)
{
case 'a':;
case 'A':
printf( "\nInserisci numero di elementi: " );
// gli elementi della lista sono letti uno alla volta
scanf( "%d", &N );
for ( count = 0; count < N; count ++ ) {
printf( "\n inserisci elemento %d della lista: ", count );
scanf( "%f", &value );
// inserimento in testa
pre_insert( &ptr, value );
}
break;
case 'd' :;
case 'D': printf("Visita la lista");
visit( ptr );
break;
case 'e':;
case 'E':
printf("Esegue la funzione di ricerca di A");
search_A( ptr,ptrptr, A );
if (found == TRUE){
printf("A è stato trovato, verrà eseguita la funzione di calncellamento. \n\n\n");
cancella (&ptr,x,A);
}
else printf("\n\n A Non trovato");
break;
case 'f': printf("Visita la lista dopo la funzione");
visit( ptr );
break;
case 'g' : printf("Esci dal programma");
exit_required=TRUE;
break;
}//switch
}//do
while (exit_required==FALSE);
system ("PAUSE");
return 0;
}//main
//inizializzazione
void init(struct list ** ptrptr){
*ptrptr=NULL;
}
//visita
void visit(struct list * ptr){
while(ptr!=NULL){
printf("\t %f", ptr->value);
ptr=ptr->next_ptr;
}
printf("\n\n");
}
//inserimento in testa
void pre_insert (struct list **ptrptr, float value)
{
struct list *tmp_ptr;
tmp_ptr=*ptrptr; //"salvo il vecchio puntatore
(*ptrptr)=(struct list *)malloc(sizeof(struct list)); //ora ptr punta al nuovo elemento al quale ho dato memoria
(*ptrptr)->value=value; //associo alla memoria creata prima valore
(*ptrptr)->next_ptr=tmp_ptr; //il vecchio ptr sarà il next ptr del valore inserito in testa
}
Boolean search_A( struct list *ptr,struct list **ptrptr, float A )
{
Boolean found;
found=FALSE;
while(found==FALSE && ptr !=NULL)
{
if (ptr->value==A)
{ found=TRUE;
*ptrptr=ptr;
}
else
{ ptr = ptr->next_ptr;
}
return found;
}
}
void cancella (struct list **ptrptr,int x, float A)
{
struct list * tmp;
while (*ptrptr!=NULL)
{
if ( A-x <= (*ptrptr)->value && (*ptrptr)->value <= A+x)
{
tmp=*ptrptr;
*ptrptr= (*ptrptr)->next_ptr;
free (tmp);
}
else
ptrptr= &((*ptrptr)->next_ptr);
}
}