Salve, ho realizzato questo esercizio con le liste dove mi funzionano tutte le funzioni tranne la funzione CrescenzaSequenza(Lista l) che restituisce un segmentation fault. Dove ho sbagliato? Grazie.
Questa è la funzione:
int CrescenzaSequenza(Lista l){ //restituisce 1 se la sequenza è crescente, 0 se la sequenza è decrescente
Nodo *temp = l;
int trovato = 1;
while (temp != NULL && trovato == 1){
if (temp->dato > temp->prox->dato){
trovato = 0;
}
temp = temp->prox;
}
printf("trovato> %d\n",trovato);
return trovato;
}
Mentre questo è l'intero codice del programma:
#include <stdio.h>
#include <stdlib.h>
#define DIM 10
typedef struct Nodo{
int dato;
struct Nodo *prox;
}Nodo;
typedef Nodo *Lista;
Lista Inizializza();
Lista InserimentoCoda(Lista l, int e);
int NumeroPositivi(Lista l);
int NumeroNulli(Lista l);
int NumeroNegativi(Lista l);
int NumeroPari(Lista l);
int NumeroDispari(Lista l);
int CrescenzaSequenza(Lista l);
void StampaLista(Lista l);
int main(void){
Lista l;
int pos;
int nul;
int neg;
int par;
int dis;
int cres;
int i = 0;
int Vett[DIM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
l = Inizializza();
while (i < DIM){
l = InserimentoCoda(l, Vett[i]);
i++;
}
printf("Gli elementi inseriti nella lista sono i seguenti: \n");
StampaLista(l);
pos = NumeroPositivi(l); //restituisce il numero dei numeri positivi
nul = NumeroNulli(l); //restituisce il numero dei numeri nulli
neg = NumeroNegativi(l); //restituisce il numero dei numeri negativi
par = NumeroPari(l); //restituisce il numero dei numeri pari
dis = NumeroDispari(l); //restituisce il numero dei numeri dispari
cres = CrescenzaSequenza(l); //restituisce 1 se la sequenza è crescente, 0 se la sequenza è decrescente
printf("Il numero dei numeri positivi e' %d\n", pos);
printf("Il numero dei numeri nulli e' %d\n", nul);
printf("Il numero dei numeri negativi e' %d\n", neg);
printf("Il numero dei numeri pari e' %d\n", par);
printf("Il numero dei numeri dispari e' %d\n", dis);
if (cres == 1){
printf("La sequenza e' crescente\n");
}else printf("La sequenza e' decrescente\n");
system("pause");
return 0;
}
Lista Inizializza(){
return NULL;
}
void StampaLista(Lista l){
Nodo *puntcorrente = l;
while (puntcorrente != NULL){
printf("elemento corrente> %d\n",puntcorrente->dato);
puntcorrente = puntcorrente->prox;
}
}
int ListaVuota(Lista l){
return (l == NULL);
}
Lista InserimentoCoda(Lista l, int e){
//creo un nodo, lo alloco, lo faccio puntare a NULL. L'ultimo nodo punterà al nodo creato
//in questo modo il nuovo nodo è adesso l'ultimo elemento
Nodo *temp;
if(ListaVuota(l)) {
//se la lista è vuota, il nodo andrà al primo posto
temp = malloc(sizeof(Nodo));
temp->dato = e;
temp->prox = NULL;
} else {
temp = l;
//ciclo per posizionarsi sull’ultimo elemento con prox==NULL
while(temp->prox != NULL){
temp = temp->prox;
}
//assegnazione nuovo nodo in ultima posizione
temp->prox = malloc(sizeof(Nodo));
temp->prox->dato = e;
temp->prox->prox = NULL;
temp = l;
}
return temp;
}
int NumeroPositivi(Lista l){
Nodo *temp = l;
int cont = 0;
while (temp != NULL){
if (temp->dato > 0){
cont++;
}
temp = temp->prox;
}
printf("cont> %d\n",cont);
return cont;
}
int NumeroNulli(Lista l){
Nodo *temp = l;
int cont = 0;
while (temp != NULL){
if (temp->dato == 0){
cont++;
}
temp = temp->prox;
}
printf("cont> %d\n",cont);
return cont;
}
int NumeroNegativi(Lista l){
Nodo *temp = l;
int cont = 0;
while (temp != NULL){
if (temp->dato < 0){
cont++;
}
temp = temp->prox;
}
printf("cont> %d\n",cont);
return cont;
}
int NumeroPari(Lista l){
Nodo *temp = l;
int cont = 0;
while (temp != NULL){
if ((temp->dato % 2) == 0){
cont++;
}
temp = temp->prox;
}
printf("cont> %d\n",cont);
return cont;
}
int NumeroDispari(Lista l){
Nodo *temp = l;
int cont = 0;
while (temp != NULL){
if ((temp->dato % 2) != 0){
cont++;
}
temp = temp->prox;
}
printf("cont> %d\n",cont);
return cont;
}
int CrescenzaSequenza(Lista l){ //restituisce 1 se la sequenza è crescente, 0 se la sequenza è decrescente
Nodo *temp = l;
int trovato = 1;
while (temp != NULL && trovato == 1){
if (temp->dato > temp->prox->dato){
trovato = 0;
}
temp = temp->prox;
}
printf("trovato> %d\n",trovato);
return trovato;
}