Esercizio esame imminente

di il
7 risposte

Esercizio esame imminente

Ciao a tutti ragazzi, ho un problema con questo semplice programma. Praticamente non mi stampa la lista aggiornata una volta che faccio l'inserimento in coda. Grazie a tutti!
P.s. vi allego programma e output

/* Programma per la costruzione e l'inserimento in coda di un elemento in una stringa */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char tipoelem;

struct strutturalista {
	tipoelem info;
	struct strutturalista *next;
};

typedef struct strutturalista tiponodo;

typedef tiponodo *tipolista; 

tipolista costruiscilista() {
tipolista list = NULL;
tiponodo *ultimo, *pgen;
tipoelem dato;
	
	pgen=malloc(sizeof(tiponodo));
	if(pgen==NULL) {
	printf("Errore in allocazione del RG\n");
	return NULL;
	}
		ultimo=pgen;
		printf("Scrivi i caratteri per comporre la lista:\n");
		scanf("%c",&dato);
		
			while(dato!='0') {
			ultimo->next=malloc(sizeof(tiponodo));
			ultimo=ultimo->next;
			ultimo->info=dato;
			scanf("%c",&dato);
			}
				ultimo->next=NULL;
			    list=pgen->next;
				free(pgen);
				return list;
}

void stampalista (tipolista list) {
tiponodo *aux;

aux=list;
while(aux->next!=NULL) {
	printf("%c",aux->info);
	aux=aux->next;
    }
}

void insincoda (tipolista *plis, tipoelem el) {
tiponodo *aux, *ultimo, *pgen;

	pgen=malloc(sizeof(tiponodo));
	if(pgen==NULL) {
	printf("Errore in allocazione del RG\n");
	return;
	}
		pgen->next=*plis;
		aux=pgen;
			while(aux->next)
			aux=aux->next;
		ultimo=aux;
				ultimo->next=malloc(sizeof(tiponodo));
				ultimo->next->info=el;
				ultimo->next->next=NULL;
				*plis=pgen->next;
				free(pgen);
				return;
}

int main() {
	tipolista lista;
	tipoelem elem;
			
printf("Costruzione della lista\n");
printf("Inserisci 0 per terminare l'inserimento...\n\n");
lista = costruiscilista();
printf("\n");
printf("Inserisci l'elemento che va in coda -> ");
scanf(" %c", &elem);
insincoda(&lista, elem);
stampalista(lista);
return 0;
}
Output -> http://i58.tinypic.com/n1aq9f.pn
Allegati:
Output
Output

7 Risposte

  • Re: Esercizio esame imminente

    Forse mi sbaglio io, ma per inserire un elemento in coda secondo me dovresti:
    - scorrere tutta la lista finchè trovi next = NULL
    - allocare un nuovo nodo e settargli il valore dell'elemento e next = NULL
    - porre next = nuovo elemento
    Inoltre, la funzione insincoda() avrebbe bisogno di ricevere un puntatore a tipolista solo per gestire il caso di lista vuota, cioè puntatore al primo elemento NULL...
  • Re: Esercizio esame imminente

    Grazie per la risposta!

    candaluar ha scritto:


    - scorrere tutta la lista finchè trovi next = NULL
    - allocare un nuovo nodo e settargli il valore dell'elemento e next = NULL
    - porre next = nuovo elemento
    Questo il programma lo fa e precisamente qui:
    pgen->next=*plis;
          aux=pgen;
             while(aux->next)
             aux=aux->next;
          ultimo=aux;
                ultimo->next=malloc(sizeof(tiponodo));
                ultimo->next->info=el;
                ultimo->next->next=NULL;
                *plis=pgen->next;
                free(pgen);
                return;
    Inoltre, la funzione insincoda() avrebbe bisogno di ricevere un puntatore a tipolista solo per gestire il caso di lista vuota, cioè puntatore al primo elemento NULL...
    Anche questo lo fa -.-
    void insincoda (tipolista *plis, tipoelem el)
  • Re: Esercizio esame imminente

    Ciao,
    l'errore era nella stampalista. La condizione corretta è
    
    while(aux != NULL) stampa
    
    Altrimenti ti fermavi sempre al penultimo elemento.

    Comunque, se ti va di darci un'occhiata, ho fatto qualche correzione al codice che ne migliora la leggibilità e forse anche un po' la logica...
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef char tipoelem;
    
    struct strutturalista
    {
        tipoelem info;
        struct strutturalista *next;
    };
    
    typedef struct strutturalista tiponodo;
    
    typedef tiponodo* tipolista;
    
    tipolista insincoda (tipolista plis, tipoelem el)
    {
        tiponodo *pgen;
        tipolista aux;
    
        pgen = (tiponodo *) malloc(sizeof(tiponodo));
        pgen->info = el;
        pgen->next = NULL;
        if(pgen==NULL)
        {
            printf("Errore in allocazione del RG\n");
            return plis;
        }
    
        if(plis == NULL)
            return pgen;
    
        aux = plis;
        while(aux->next != NULL)
            aux = aux->next;
         aux->next = pgen;
    
        return plis;
    }
    
    tipolista costruiscilista()
    {
        tipolista list = NULL;
        tiponodo *pgen;
        tipoelem dato;
    
        pgen = (tiponodo *) malloc(sizeof(tiponodo));
        if(pgen==NULL)
        {
            printf("Errore in allocazione del RG\n");
            return NULL;
        }
        printf("Scrivi i caratteri per comporre la lista:\n");
        do
        {
            scanf(" %c",&dato);
            if(dato != '0')
            {
                list = insincoda(list, dato);
            }
        } while(dato!='0');
    
        return list;
    }
    
    void stampalista (tipolista list)
    {
        tiponodo *aux;
        aux=list;
        while(aux != NULL)
        {
            printf("%c\n",aux->info);
            aux=aux->next;
        }
    }
    
    int main()
    {
        tipolista lista;
        tipoelem elem;
    
        printf("Costruzione della lista\n");
        printf("Inserisci 0 per terminare l'inserimento...\n\n");
        lista = costruiscilista();
        printf("\n");
        stampalista(lista);
        printf("Inserisci l'elemento che va in coda -> ");
        scanf(" %c", &elem);
        lista = insincoda(lista, elem);
        stampalista(lista);
        return 0;
    }
    
  • Re: Esercizio esame imminente

    Tu sei un maledetto genio!!! Correggero il codice con il tuo! Grazie!
  • Re: Esercizio esame imminente

    Prego! Per altri dubbi siamo qui.

  • Re: Esercizio esame imminente

    Altro piccolo dubbio. Nella funzione mia insincoda alla fine viene fatto *plis=pgen-> next. È necessaria questa istruzione? A me pare che il puntatore sempre li rimane (forse è inutile). Grazie
  • Re: Esercizio esame imminente

    Così a occhio non saprei, però la funzione per l'inserimento in coda come l'avevi scritta tu non mi convinceva... Ad esempio perché fai
    pgen->next=*plis;
    ? Questo sembra più un inserimento in testa...

    Diciamo che l'algoritmo generico per l'inserimento in coda è quello che ho seguito nel codice che ti ho postato:

    - creo un nuovo nodo al quale assegno il dato che viene fornito come parametro della funzione e metto a NULL il suo campo next
    - se la lista è vuota (controllo che tu non facevi) allora ritorno direttamente il nodo, dato che questo sarà il primo, unico e ultimo elemento di tale lista
    - se invece la lista non è vuota la scorro fino all'ultimo elemento e poi "incollo" il nodo che ho generato all'inizio
Devi accedere o registrarti per scrivere nel forum
7 risposte