[Help] Programmino semplice su liste ordinate...

di il
6 risposte

[Help] Programmino semplice su liste ordinate...

Ciao a tutti sono nuovo e purtroppo non molto esperto di programmazione. Mi stavo esercitando sulle liste ordinate, ma non riesco a capire come mai questo programma non funzioni (si compila ma stampa solo il primo numero). Forse non riesco bene ad indirizzare i puntatori. Vi chiederei un'aiuto (il mio libro non lo fa). Grazie!

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

struct dato {
int info;
struct dato * next;
};
struct dato *testa, *aux, *nuovo;
int n;

int main()
{

n=0;
testa=(struct dato *)malloc(sizeof(struct dato));
testa->info=10;
testa->next=NULL;
aux=testa;
while(n<4)
{
nuovo=(struct dato *)malloc(sizeof(struct dato));
nuovo->info=n;
aux->next=nuovo;
aux=aux->next;
nuovo=nuovo->next;
n++;
}
testa->next=NULL;

while(testa!=NULL)
{
printf("--->%d", testa->info);
testa=testa->next;
}

system("PAUSE");
return 0;
}

6 Risposte

  • Re: [Help] Programmino semplice su liste ordinate...

    Codice corretto:
    
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    struct dato {
    int info;
    struct dato * next;
    };
    struct dato *testa, *aux, *nuovo;
    int n;
    
    int main()
    {
    
    n=0;
    testa=(struct dato *)malloc(sizeof(struct dato));
    testa->info=10;
    testa->next=NULL;
    aux=testa;
    while(n<4)
    {
    nuovo=(struct dato *)malloc(sizeof(struct dato));
    nuovo->info=n;
    aux->next=nuovo;
    aux=aux->next;
    nuovo=nuovo->next;
    n++;
    }
    
    while(testa!=NULL)
    {
    printf("--->%d", testa->info);
    testa=testa->next;
    }
    
    system("PAUSE");
    return 0;
    }
    L'errore era:
    
    testa -> next = NULL;
    

    A mio parere il codice è molto disordinato, anche se funzionante, ecco come lo avrei scritto io:
    
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct nodo *punt;
    typedef struct nodo {
    	int dato;
    	punt link;
    } lista;
    
    int main()
    {
    	int n = 0;
    
    	lista *testa = (lista*) malloc(sizeof(lista));
    	testa -> dato = 10;
    	testa -> link = NULL;
    
    	while(n < 4)
    	{
    		lista *p = testa;
    		while(p -> link) p = p -> link;
    		lista *q = (lista*) malloc(sizeof(lista));
    		q -> dato = n++;
    		p -> link = q;
    	}
    	while(testa) printf("--> %d ",testa -> dato), testa = testa -> link;
    	return 0;
    }

  • Re: [Help] Programmino semplice su liste ordinate...

    Grazie mille. Purtroppo io ancora non sono molto esperto e quindi credo di essere disordinato per quello. Sempre sulle liste ordinate ho fatto un programma con funzioni ricorsive, che si compila ma da errore quando cerco di aprire l'eseguibile. Mi dareste una mano? Il codice è questo:

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>

    struct dato {
    int info;
    struct dato *next;
    };
    struct dato *testa=NULL;
    int n;

    struct dato * inserimento (struct dato *, int);
    int listavuota (struct dato *);
    void visualizza (struct dato *);

    int main()
    {
    printf("Inserisci dei numeri (per terminare digita 0): ");
    while (n!=0)
    {
    scanf("%d", &n);
    testa=inserimento(testa,n);
    }

    visualizza(testa);

    system("PAUSE");
    return 0;
    }

    int listavuota (struct dato * testa)
    {
    if (testa==NULL)
    return 1;
    return 0;
    }

    struct dato * inserimento (struct dato *testa, int n)
    {
    struct dato *punt;
    if(listavuota(testa))
    {
    punt=(struct dato *)malloc(sizeof(struct dato));
    punt->info=n;
    punt->next=NULL;
    return punt;
    }
    else
    {
    testa->next=inserimento(testa->next,n);
    return testa;
    }
    }

    void visualizza (struct dato *testa)
    {
    printf("-->%d", testa->info);
    testa=testa->next;
    }
  • Re: [Help] Programmino semplice su liste ordinate...

    Io nell'esecuzione ho riscontrato questo errore:
    cube@akira:~/Programmi/liste$ ./a.out
    Segmentation fault (core dumped)
    
    ovvero, c'è qualche errore nella gestione dei puntatori. Se aspetti domani cerco l'errore, mentre sistemo il codice
  • Re: [Help] Programmino semplice su liste ordinate...

    Ok grazie!! A me compilandolo non dava errori...
  • Re: [Help] Programmino semplice su liste ordinate...

    Infatti a me lo ha dato durante l'esecuzione , comunque mi spiace farti aspettare, domani mattina torno prima da scuola e mi dedicherò al tuo programma

  • Re: [Help] Programmino semplice su liste ordinate...

    Codice originale
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    struct dato {
    int info;
    struct dato *next;
    };
    struct dato *testa=NULL;
    int n;
    
    struct dato * inserimento (struct dato *, int);
    int listavuota (struct dato *);
    void visualizza (struct dato *);
    
    int main()
    {
    printf("Inserisci dei numeri (per terminare digita 0): ");
    while (n!=0)
    {
    scanf("%d", &n);
    testa=inserimento(testa,n);
    }
    
    visualizza(testa);
    
    system("PAUSE");
    return 0;
    }
    
    int listavuota (struct dato * testa)
    {
    if (testa==NULL)
    return 1;
    return 0;
    }
    
    struct dato * inserimento (struct dato *testa, int n)
    {
    struct dato *punt;
    if(listavuota(testa))
    {
    punt=(struct dato *)malloc(sizeof(struct dato));
    punt->info=n;
    punt->next=NULL;
    return punt;
    }
    else
    {
    testa->next=inserimento(testa->next,n);
    return testa;
    }
    }
    
    void visualizza (struct dato *testa)
    {
    printf("-->%d", testa->info);
    testa=testa->next;
    }
    Ecco gli errori:
    1. Non hai inizializzato n (per questo non partiva)
    2. La funzione visualizza, visualizzava soltanto il primo elemento della lista
    3. Nella lista veniva inserito anche 0

    Dopo queste correzioni il programma funziona correttamente, non hai fatto alcun errore nella funzione ricorsiva . Ecco il codice corretto:
    #include <stdlib.h>
    #include <stdio.h>
    
    struct dato {
    	int info;
    	struct dato *next;
    };
    struct dato *testa=NULL;
    int n = 1;
    
    struct dato * inserimento (struct dato *, int);
    int listavuota (struct dato *);
    void visualizza (struct dato *);
    
    int main()
    {
    	printf("Inserisci dei numeri (per terminare digita 0): ");
    	while(n)
    	{
    		scanf("%d", &n);
    		if(n) testa=inserimento(testa,n);
    	}
    
    	visualizza(testa);
    
    	system("PAUSE");
    	return 0;
    }
    
    int listavuota (struct dato * testa)
    {
    	if (testa==NULL)
    	return 1;
    	return 0;
    }
    
    struct dato * inserimento (struct dato *testa, int n)
    {
    	struct dato *punt;
    	if(listavuota(testa))
    	{
    		punt=(struct dato *)malloc(sizeof(struct dato));
    		punt->info=n;
    		punt->next=NULL;
    		return punt;
    	}
    	else
    	{
    		testa->next=inserimento(testa->next,n);
    		return testa;
    	}
    }
    
    void visualizza (struct dato *testa)
    {
    	struct dato *punt = testa;
    	while(punt) printf(" --> %d",punt -> info), punt = punt -> next;
    }
    p.s. E' inutile che includi iostream, se poi includi stdlib e stdio
Devi accedere o registrarti per scrivere nel forum
6 risposte