Lista ridotta all'osso

di il
4 risposte

Lista ridotta all'osso

Ho provato a sfoltire l'header per la mia lista, non riscontro errori, ma vorrei che qualcuno + esperto mi desse l'ok, in particolare la funzione removefront() fatta in quel modo non mi convince
/*
 * lista.h
 *
 *  Created on: 26/giu/2013
 *      Author: gen
 */

#ifndef LISTA_H_
#define LISTA_H_

#include <iostream>
#include "nodo.h"
using namespace std;

template <class t>
class  lista{
public:
	  lista();
	  ~lista();
	void  insertFront(const t& value);
	bool removeFront();
	bool isEmpty();
	void print();
private:
	nodo <t> *firstPtr;
	nodo <t> *lastPtr;
};


template <class t>
 lista<t>::lista():firstPtr(0),lastPtr(0){}

template <class t>
 lista<t>::~lista(){
	if(!isEmpty()){
	nodo <t> * currentPtr=firstPtr;
	nodo <t>* tempPtr;
	while(currentPtr!=0){
		tempPtr=currentPtr;
		currentPtr=currentPtr->next;
		delete tempPtr;
	}
	}
}

template <class t>
void lista<t>::insertFront(const t& value){
	nodo <t>*newPtr=new nodo<t>(value);
	if(isEmpty()){
		cout<<"La lista è vuota, inserisco "<<value;
		firstPtr=lastPtr=newPtr;
	}
	else{
		cout<<"\n la lista non è vuota, inserisco"<<value;
		newPtr->next=firstPtr;
		firstPtr=newPtr;
	}
}

template <class t>
bool lista<t>::removeFront(){
	if(isEmpty()){
		return false;
	}
	else{
		if(firstPtr==lastPtr)
			firstPtr=lastPtr=0;
		else{
			firstPtr=firstPtr->next;
		}
		return true;
	}
}

template <class t>
bool lista<t>::isEmpty(){
	return firstPtr==0;
}

template <class t >
void lista<t>::print(){
	if (isEmpty())
		cout<<"\nLa lista è vuota";
	else{
		cout<<endl;
	nodo <t>* currentPtr=firstPtr;
	while(currentPtr!=0){
		cout<<currentPtr->value<<" ";
		currentPtr=currentPtr->next;
	}
	}

}
in questa versione ho scritto solo le funzioni per l'inserimento e la rimozione da testa.

4 Risposte

  • Re: Lista ridotta all'osso

    Dov'è finito il delete in removeFront? devi rimuovere fisicamente la memoria allocata con new come abbiamo detto nel thread precedente.
  • Re: Lista ridotta all'osso

    Okok, in definitiva il programma ovviamente funziona, ma non sarebbe una struttura affidabile senza quel famoso delete ed immagino che non sarebbe utilizzabile per applicazioni professionali.
  • Re: Lista ridotta all'osso

    Non vogliamo fare applicazioni professionali, ma applicazioni privi di errori concettuali ed è quindi giusto metterlo sto delete.
  • Re: Lista ridotta all'osso

    Riprendo questa discussione perchè sto creando una classe eccezioni per gestire alcuni errori della lista:
    premetto che anche se non ho implementato tutte le funzioni della lista ma solo quelle tipiche di uno stack, ho comunque simulato creando una classe ulteriore chiamata stack che ereditasse da lista.

    quindi abbiamo :
    #include "lista.h"
    template <class t>
    class stack:public lista<t>{
    public:
    	stack(){new lista<t>();}
    	void push(const t& value){insertFront(value);}
    	bool pop (){if(lista<t>::removeFront())return true;return false;}
    	void printback(){lista<t>::print();}
    };
    
    
    e la classe eccezioni:
    template <class t>
    class eccezione{
    public:
    	eccezione (stack<t> s){
    		while (s.getDim>5)
    			s.pop();
    	}
    
    };
    
    
    che in pratica non fa altro che eseguire tante pop fin quando la lista ha al massimo 5 nodi

    l'errore che riscontro sta nel main, mi sono scervellato tutto il pomeriggio ma non ne vengo a capo:
    int main() {
    	try{
    	stack<char> l;
    	l.push('g');
    	l.push('e');
    	l.push('n');
    	l.push('n');
    	l.push('a');
    	l.push('a');
    	l.pop();
    	l.print();
    	if (l.isFull())
    		throw eccezione( l);
    	}
    		catch (eccezione & e){
    			cout<<"Eccezione eseguita";
    		}
    
    
    	return 0;
    }
    missing template arguments before '(' token
Devi accedere o registrarti per scrivere nel forum
4 risposte