Aiuto con C, puntatori e doppi puntatori

di il
1 risposte

Aiuto con C, puntatori e doppi puntatori

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);        
      }     
}

1 Risposte

  • Re: Aiuto con C, puntatori e doppi puntatori

    ..poi il Boolean non mi trova MAI il valore di A.............
    
    --- cut ---
    //scanf("&f", &A);
    scanf("%f", &A)
    
    --- cut ---
    
    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; <------ ?????
      }
      return found; //$$max
    }
    --- cut ---
    
    Vai avanti con il resto del codice ed il debug...
    Saluti,
    Max
Devi accedere o registrarti per scrivere nel forum
1 risposte