Non stampa la lista

di il
2 risposte

Non stampa la lista

Ragazzi sto provando ad implementare una lista a puntatori

prima avevo provato a fare inserire all'utente quanti nodi voleva, e poi con un for sulla procedura push inerivo gli elementi e con un for sulla procedura pop me li stampavo , e funzionava, poi però ho pensato che si perdeva l'utilità della lista facendo decidere a priori il numero dei nodi, quindi ho implementato il main con un
while(continua)
inserisci nuovi nodi (push) e incrementa le iterazioni
e con un for(int i=0;i<iterazioni;i++)
stampa i nodi (pop)

ma mi stampa solo l'ultimo nodo

vi passo i file :Main

#include "lista1.h"		

using namespace std;

// Prototipi di funzioni definite in questo modulo

void inserimentointesta(L& l);

void estrazioneintesta(L& l);




int main() {
    
	bool continua=true;

L l;	
int scelta,iterazioni=0;
	
	cout<<"\n Menu \n";
	while(continua){	
		continua=false;
			//definisce variabile di tipo lista
		start(l); 	// inizializza la lista
	

		inserimentointesta(l);
			cout<<"\nVuoi inserire un altro elemento ?\n";
		cin>>scelta;
		if(scelta==1)
			continua=true;
		iterazioni++;
		}
	cout<<"Estrazione di elementi dalla testa\n ";
	for(int i=0;i<iterazioni;i++)
	estrazioneintesta(l);
	
	}

	



void inserimentointesta (L& l) {
E e ;
	cout<<"\n Inserimento di un elemento in testa\n ";
	cout<<"elemento = "; cin>>e;
	if (!full(l)) push(l,e);
	else cout<<"\n Lista piena\n ";
}



void estrazioneintesta(L& l) {
	
E e;
	if (!empty(l)) {
		pop(l,e);
		cout<<"\nelemento =	"<<e;
	}
	else cout<<"Lista vuota estrazione impossibile\n ";
}

func.cpp

#include "lista1.h"


void start(L& l) {
	l=0;
}

bool empty(const L& l) {
	return (l==0);
}

bool full(const L& l) {
	return false;
}

void push(L& l,const E & e) {
L q=new Record;	//alloca spazio
	q->elem=e;	//vi pone e
	q->punt=l;	//lega al resto della lista
	l=q;		//lo mette in testa alla lista
}


void pop(L& l,E& e) {       //oppure: bool pop(L& l,E& e)
		e=l->elem;  	// copia in e il primo elemento
		L p=l;			// salva il valore di  l
		l=l->punt;		//aggiorna l
		delete p;		// dealloca il primo elemento
}



func.h
#ifndef _LISTA_H_						// Compilazione condizionale
#define _LISTA_H_
#include <iostream>
using namespace std;

typedef int E;							// Def. del tipo di el. della lista
struct Record;							// Predichiarazione
typedef Record* L;						// Def. del tipo puntatore a Record
struct Record {							// Tipo record costituito da
		E elem;							// campo informazione
		L punt;							// campo puntatore al prossimo nodo della lista
};

void start(L& l);						// Inizializza la lista								
bool empty(const L& l);					// Test di lista vuota
bool full(const L& l);					// Test di lista piena
void push(L& l, const E & e);		    // Inserimento in testa

void pop(L& l, E& e);					// Cancellazione in testa, restituisce l'elemento cancellato
	

#endif

2 Risposte

  • Re: Non stampa la lista

    Ho risolto, grazie lo stesso
  • Re: Non stampa la lista

    Anche se non capisco il motivo per il quale adesso mi stampa indirizzi di memoria quando faccio la pop(se invece stampo gli elementi con una nomale procedura di stampa è tt ok):
    facendo una push in questo modo:
        
    void push(L&l,int x){
         L p;
         p=new Record;
         p->val=x;
         p->punt=l;
         l=p;
         }
    e questa la pop:
    void pop(L&l,int s){
         s=l->val;
         L p;
         p=l;
         l=l->punt;
         delete p;
         }
    
    con questo main;
    void estrazione(L&l);
    int main(int argc, char *argv[])
    {
        int r;
        int x;
        L l;
        
        
         start(l);
        cout<<"\nQuanti elementi vuoi inserire?\n";
        cin>>r;
        for (int i=0;i<r;i++){
            cout<<"\n Inserire il "<<i+1<<" elemento nel nodo\n";
            cin>>x;
            push(l,x);
            }
            
            cout<<"\n - Estrazione - \n";
     for(int i=0;i<r;i++){
             
    estrazione(l);
    }
             
    
        
        
        
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    void estrazione(L&l)
    {
         int s;
         pop(l,s);
         cout<<s;// <------------------------  mi da degli indirizzi di memoria, non il valore dell'elemento
         }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte