biondina
23-01-2014, 10:27
Ciao a tutti.
Ho un problema banale ma che non riesco proprio a risolvere. :cry:
L'esercio mi chiede:
" Il programma ha una lista collegata con puntatori, ordinata in senso crescente.
Devo scrivere la funzione che incrementa ordinatamente di 1 gli elementi della lista fino a ritrovare un elemento il cui valore incrementato è
maggiore di una soglia data in ingresso. Gli elementi a partire dal primo che supera la soglia fino all'ultimo devono essere cancellati liberando la memoria. La funzione deve restituire come valore di ritorno il numero di elementi cancellati"
Il mio problema è che se ad esempio inserisco la lista 2 4 6 8 10 12 e come soglia inserisco valore 8 (presente nella lista) mi ritorna il numero di cancellazioni è 3 che è giusto; ma se inserisco valore 7 (che non c'è nella lista) mi ritorna un valore tipo 229134. Perchè? :muro:
Sotto riporto il programma
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
struct list {
int value;
struct list * next_ptr;
};
void init( struct list ** ptrptr );
void visit( struct list * ptr );
void pre_insert( struct list ** ptrptr, int value );
void ord_insert(struct list ** ptrptr, int value);
int camb_list(struct list*ptrptr,int thres);
int delete_list_el (struct list**ptrptr);
void init( struct list ** ptrptr ){
*ptrptr = NULL;
}
void visit( struct list * ptr )
/* visita della lista*/
{
while ( ptr != NULL ) {
printf( "%d ", ptr->value );
ptr = ptr->next_ptr;
}
}
void pre_insert( struct list ** ptrptr, int value )
/* inserisce in testa*/
{
struct list * tmp_ptr;
tmp_ptr = *ptrptr;
*ptrptr = (struct list *) malloc( sizeof(struct list));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = tmp_ptr;
}
void ord_insert(struct list ** ptrptr, int value)
/* inserisce in ordine*/
{ while(*ptrptr!=NULL && (*ptrptr)->value<value)
{ptrptr=&((*ptrptr)->next_ptr);
}
pre_insert(ptrptr,value);
}
int camb_list (struct list*ptrptr,int thres)
/*incrementa valori della lista per 1, fino a trovare uno >= di soglia. se trova un elemento > lo cancella dalla lista */
{ int num_canch;
while (ptrptr!=NULL && (ptrptr)->value<=thres)
{ (ptrptr)->value=(ptrptr)->value+1;
if ((ptrptr)->value>=thres){
num_canch=delete_list_el(&ptrptr);
}
else
ptrptr=(ptrptr)->next_ptr;
}
return num_canch;
}
Ho un problema banale ma che non riesco proprio a risolvere. :cry:
L'esercio mi chiede:
" Il programma ha una lista collegata con puntatori, ordinata in senso crescente.
Devo scrivere la funzione che incrementa ordinatamente di 1 gli elementi della lista fino a ritrovare un elemento il cui valore incrementato è
maggiore di una soglia data in ingresso. Gli elementi a partire dal primo che supera la soglia fino all'ultimo devono essere cancellati liberando la memoria. La funzione deve restituire come valore di ritorno il numero di elementi cancellati"
Il mio problema è che se ad esempio inserisco la lista 2 4 6 8 10 12 e come soglia inserisco valore 8 (presente nella lista) mi ritorna il numero di cancellazioni è 3 che è giusto; ma se inserisco valore 7 (che non c'è nella lista) mi ritorna un valore tipo 229134. Perchè? :muro:
Sotto riporto il programma
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
struct list {
int value;
struct list * next_ptr;
};
void init( struct list ** ptrptr );
void visit( struct list * ptr );
void pre_insert( struct list ** ptrptr, int value );
void ord_insert(struct list ** ptrptr, int value);
int camb_list(struct list*ptrptr,int thres);
int delete_list_el (struct list**ptrptr);
void init( struct list ** ptrptr ){
*ptrptr = NULL;
}
void visit( struct list * ptr )
/* visita della lista*/
{
while ( ptr != NULL ) {
printf( "%d ", ptr->value );
ptr = ptr->next_ptr;
}
}
void pre_insert( struct list ** ptrptr, int value )
/* inserisce in testa*/
{
struct list * tmp_ptr;
tmp_ptr = *ptrptr;
*ptrptr = (struct list *) malloc( sizeof(struct list));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = tmp_ptr;
}
void ord_insert(struct list ** ptrptr, int value)
/* inserisce in ordine*/
{ while(*ptrptr!=NULL && (*ptrptr)->value<value)
{ptrptr=&((*ptrptr)->next_ptr);
}
pre_insert(ptrptr,value);
}
int camb_list (struct list*ptrptr,int thres)
/*incrementa valori della lista per 1, fino a trovare uno >= di soglia. se trova un elemento > lo cancella dalla lista */
{ int num_canch;
while (ptrptr!=NULL && (ptrptr)->value<=thres)
{ (ptrptr)->value=(ptrptr)->value+1;
if ((ptrptr)->value>=thres){
num_canch=delete_list_el(&ptrptr);
}
else
ptrptr=(ptrptr)->next_ptr;
}
return num_canch;
}