Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Ordinamento Lista Concatenata

    Salve...
    Il seguente programma implementa due linked list con le relative funzioni.
    Inoltre è presente una funzione per concatenare le due linked list.
    Il problema è che la lista ottenuta dalla concatenazione non è ordinata.
    Potreste modificarmi il codice della funzione ordina, affinchè l'output
    sia quello desiderato?
    Il codice sorgente è il seguente:

    codice:
    //file.cpp
    #include "Lista.h"
    #include <iostream>
    #include <list>
    using namespace std;
    
    //------------------------------------------------------------
    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
    }
    //------------------------------------------------------------
    // append versione iterativa
    void append(L& l,const E & e) {
       if(l==0) push(l,e);
       else     {
         L temp=l;
         L q=new Record;	//alloca spazio
         q->elem=e;	//vi pone e
         q->punt=0;	// e' l'ultimo elemento della lista
         while(temp->punt) temp=temp->punt; //scorre la lista, si ferma sull'ultimo elemento
         temp->punt=q;		//lo mette in coda alla lista
      }  //fine if
    }
    //------------------------------------------------------------
    // inserimento ordinato
    void insert (L& l, const E & e){
    	if(l==0 || l->elem > e)
    		push(l,e);
    	else{
    		L prec=l, succ=0;
    		L q=new Record; //alloca ed inizializza il nuovo elemento
    		q->elem=e;
    		q->punt=0;
    
    		while (prec->punt && prec->punt->elem < e) //scorre la lista
    			prec=prec->punt; //determina prec
    			succ=prec->punt; //determina succ, se l'inserimento è in coda succ vale zero
    			q->punt=succ;
    			prec->punt=q;
    	}
    }
    //------------------------------------------------------------
    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
    }
    //------------------------------------------------------------
    // Eliminazione dell'ultimo elemento: versione iterativa
    bool lastpop(L& testa_lista) {
         L el=testa_lista;
    
         while (el->punt!= NULL) {
        	 if (el->punt->punt==NULL) {
        		 L Y=el->punt;
        		 el->punt=NULL;
        		 delete Y;
        		 return true;
        	 }
        	 el = el->punt;
         }
         return false;
    }
    //------------------------------------------------------------
    // inlist: ricerca sequenziale versione iterativa
    bool inlist(const L& l,const E & e) {
        L temp=l;
        bool trovato=false;
    	while (temp && !trovato) {
          if (e==temp->elem) trovato=true;
          else
          temp=temp->punt;
        }
        return trovato;
    }
    //------------------------------------------------------------
    //concatenazione di due liste
    L concatenate(L list1,L list2){
    	L l3;
    	l3=list1;
    
    	while(l3->punt!=NULL)
    		l3=l3->punt;
    		l3->punt=list2;
    
    	return list1;
    }
    //-------------------------------------------------------
    //ordinamento della lista
    void ordina(L& l){
    	L temp=NULL;
    	L current = l;
    
    		while(current->punt != NULL) {
    	        if(current->elem > current->punt->elem){
    	            temp->elem = current->elem;
    	            current->elem = current->punt->elem;
    	            current->punt->elem = temp->elem;
    	        }
    	        current = current->punt;
    	    }
    }
    //------------------------------------------------------------
    // stampa versione iterativa
    void print(const L & l) {
        L temp=l;
    	while(temp) {
    	  cout << temp->elem;
          cout <<  "\t";
          temp=temp->punt;
    	}
    	cout<<"\n";
    }
    
    void clear(L&l){
     L temp;
     while(l){
    	   temp=l;
    	   l=l->punt;
    	   delete temp;
     }
    }
    
    //file.h
    #ifndef LISTA_H
    #define LISTA_H
    
    #ifndef _LISTA_H_						// Compilazione condizionale
    #define _LISTA_H_
    
    #include <list>
    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& );					    // Inizializza la lista
    bool empty(const L& );					// Test di lista vuota
    bool full(const L& );					// Test di lista piena
    void push(L& , const E & );	        // Inserimento in testa
    void append(L& , const E & );			// Inserimento in coda
    void insert(L& , const E & );         // Inserimento ordinato
    void pop(L& , E& );					// Cancellazione in testa
    bool lastpop(L& );				        // Cancellazione in coda
    bool inlist(const L& , const E & );   // Vera se e e' presente nella lista
    L concatenate(L , L);       // Concatenazione di due liste
    void ordina(L& );
    void print(const L & );				// Stampa la lista
    void clear(L &);                       //Svuota la lista
    #endif
    
    #endif
    
    //main
    #include <iostream>
    #include <stdlib.h>
    #include "Lista.h"
    using namespace std;
    
    int main(){
    	L Listauno;
    	L Listadue;
    	L Listatre;
    
    	start(Listauno);
    	start(Listadue);
    	start(Listatre);
    
    	cout<<"***PRIMA LISTA***\n";
    		insert(Listauno,5);
    		insert(Listauno,2);
    		insert(Listauno,9);
    		insert(Listauno,7);
    
    	print(Listauno);
    
    	cout<<"***SECONDA LISTA***\n";
    		insert(Listadue,3);
    		insert(Listadue,1);
    		insert(Listadue,8);
    
    	print(Listadue);
    
    	cout<<"***TERZA LISTA***\n";
    	Listatre=concatenate(Listauno,Listadue);
    	ordina(Listatre);
    	print(Listatre);
    
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466

    Re: Ordinamento Lista Concatenata

    Originariamente inviato da hitman89
    Potreste modificarmi il codice
    Non si fanno modifiche su richiesta ...

    Prova a farci capire cosa non va nel tuo ordinamento, cosa hai provato, cosa faresti tu ...
    Insomma, arriviamo alla soluzione insieme ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Il problema è nella funzione ordina, in quanto se provo ad eseguire il programma, esso va in crash... Per cui non so come ovviare a questo problema.
    Ho provato con un ciclo for ma invano perchè non conosco la condizione di terminazione.
    Dunque ho preferito un ciclo while per scorrere tutti gli elementi della lista ottenuta dalla concatenazione! Grazie

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Il crash lo ottieni perché non allochi lo spazio per temp

    L temp=new Record;

    Fatto questo, devi controllare il codice dell'ordinamento perché non va ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.