Non stampa la lista

di Anonimizzato9570 il
2 risposte
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

  • Ho risolto, grazie lo stesso
  • 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