Concatenare due liste

di il
1 risposte

Concatenare due liste

Ciao, sto provando a creare una funzione che prenda come argomenti due liste e crei una terza lista contenente le prime due

questo è il mio nodo
/*
 * node.h
 *
 *  Created on: 09/lug/2013
 *      Author: gen
 */

#ifndef NODE_H_
#define NODE_H_

template <class t> class list;
template <class t>
class node {
	friend class list <t> ;
public:
	node(const t&);

private:
	t data;
	node<t>* next;
	node<t>* prev;
};



template <class t>
node<t>::node(const t & d):next(0),data(d){}

#endif /* NODE_H_ */
questa è la lista:
/*
 * list.h
 *
 *  Created on: 09/lug/2013
 *      Author: gen
 */

#ifndef LIST_H_
#define LIST_H_
#include "node.h"
#include <iostream>
using namespace std;


template <class t>
class list {
public:
	list();
	~list();
	bool isEmpty(){ return (firstPtr==0);}
	void insertFront(const t& );
	void print();
	void printBack();
	int getDim(){return dim;}
	void order();
	void swap(node<t> *);
	list concatenate(list<t>&l1,list<t>&l2){
		list list3;
		list3.firstPtr=l2.firstPtr;
		list3.lastPtr=l1.lastPtr;
		l1.firstPtr->prev=l2.lastPtr->next;
		return list3;
	}

private:
	int dim;
	node <t>* firstPtr;
	node<t>* lastPtr;
};

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

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

template <class t>
void list<t>::insertFront(const t& value){
	node <t> *newPtr=new node<t>(value);
	dim++;
	if(isEmpty()){
		firstPtr=lastPtr=newPtr;
		newPtr->prev=0;
	}
	else{
		firstPtr->prev=newPtr;
		newPtr->next=firstPtr;
		firstPtr=newPtr;
	}
}

template <class t>
void list<t>::print(){
	if(isEmpty())
		cout<<"La lista è vuota";
	else {
		node <t>*currentPtr=firstPtr;
		while (currentPtr!=0){
			cout<<currentPtr->data;
			currentPtr=currentPtr->next;
		}

	}
}


template <class t>
void list<t>::printBack(){
	if(isEmpty())
			cout<<"La lista è vuota";
	else{
		node <t>*currentPtr=lastPtr;
		while(currentPtr!=firstPtr){
			cout<<currentPtr->data;
			currentPtr=currentPtr->prev;
		}
		cout<<currentPtr->data;


	}
}



#endif /* LIST_H_ */
main:
// creare   una lista a puntatori(template) nella quale inserire elementi(template).
//Inoltre richiedeva una funzione printback() che stampasse gli elementi inseriti
//al contrario(dall'ultimo al primo) tramite un ordinamento ricorsivo.
//		Il tutto, ovviamente, condito con qualche eccezione qua
//e la(tipo per lista vuota,inserimento errato, ecc.)

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

int main() {

	list<int> mylist,mylist2,list3;

	mylist.insertFront(1);
	mylist.insertFront(2);
	mylist.insertFront(3);
	mylist.insertFront(4);
	mylist.insertFront(5);
	cout<<"Prima lista:\n";
		mylist.print();
		cout<<endl;
		mylist.printBack();

		mylist2.insertFront(6);
		mylist2.insertFront(7);
		mylist2.insertFront(8);
		mylist2.insertFront(9);
		mylist2.insertFront(10);
		cout<<"\nSeconda lista:\n";
			mylist2.print();
			cout<<endl;
			mylist2.printBack();
cout<<"\nListe concatenate:\n";
list3.concatenate(mylist,mylist2);
cout<<"\nLa lista ha "<<mylist.getDim()<<" nodi.\n";

//mylist.order();
return 0;
}
il problema sta nella funzione membro concatenate, praticamente il programma si blocca li, non mi da errori, ma in console non fa nulla quando arriva a chiamare la funzione immediatamente precedente alla concatenate, è sbagliata mia funzione?

1 Risposte

  • Re: Concatenare due liste

    Completamente.
    I puntatori di l1 e l2 non hanno nessun vincolo di relazione tra loro.
    Quello che devi fare è prima iterare sui puntatori di l1 e inserire i dati in l3, poi ripetere l'operazione con i puntatori di l2 continuando a inserire i dati sempre in l3.
    Tra l'altro la funzione concatenate() scritta così non ha senso di essere una funzione membro dato che *this non è coinvolto nell'operazione.
    Se la vuoi membro dev'essere:
    
       list& concatenate(const list<t>&l1,const list<t>&l2){
          if (!l1.isEmpty() ) {
               while (l1.firstPtr != l1.lastPtr) {
                  this->insertFront(l1.firstPtr->data);
                  l1.firstPtr = l1.firstPtr->next;       
               }
          }
          if (!l2.isEmpty()) {
               while (l2.firstPtr != l2.lastPtr) {
                   this->insertFront(l2.firstPtr->data);
                   l2.firstPtr = l2.firstPtr->next;       
               }
          }
          return *this;
       } 
    
Devi accedere o registrarti per scrivere nel forum
1 risposte