Bandit
27-05-2012, 19:21
Ciao ragazzi
mi aiutate per favore con le operazioni sulle liste alcune non le capisco
Anzitutto vi posto l'intestazione
// LISTADI1.H : Implementazione dinamica della struttura astratta lista
// realizzata con libreria di funzioni. File di SPECIFICA
#ifndef _LISTA_H_ // Compilazione condizionale
#define _LISTA_H_
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 insert(L& l, const E & e); // Inserimento in coda
bool erase(L& l, const E & e); // Cancellazione di un elemento specificato
bool inlist(const L& l, const E & e); // Vera se e e' presente nella lista
void print(const L &l); // Stampa la lista
void clear(L & l); // Distrugge la lista
#endif
Da qui capiamo che la struttura record ha 2 campi
-il contenuto (elem )
-puntatore (punt)
ed l di tipo L che è puntatore alla testa della lista
Poi vi metto l'implementazione
// LISTA.CPP : Implementazione dinamica della struttura lista con
// libreria di funzioni. File di IMPLEMENTAZIONE
#include "lista1.h"
#include <iostream>
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
}
//------------------------------------------------------------
// insert versione iterativa
void insert(L& l,const E & e) {
if(l==0 || l->elem>e) push(l,e); //l'elemento va inserito in testa
else { //l'elemento va inserito al centro o in coda
L prec=l, succ;
//alloca ed inizializza il nuovo elemento
L q=new Record;
q->elem=e;
q->punt=0;
while(prec->punt && prec->punt->elem<e ) prec=prec->punt; //determina prec
succ=prec->punt; //determina succ, se l'inserimento è in coda succ deve valere 0
// collega il nuovo elemento al resto della lista (anche in coda se è il caso)
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
}
//------------------------------------------------------------
// lastpop versione iterativa
void lastpop(L& l,E& e) { //oppure: bool lastpop(L& l,E& e)
if(l->punt==0) pop(l,e);
else {
L temp=l;
while(temp->punt->punt) temp=temp->punt; //scorre la lista, si ferma sul penultimo elemento
e=temp->punt->elem; // copia in e l'ultimo elemento
L p=temp->punt; // salva l'indirizzo dell'ultimo elemento
temp->punt=0; // "stacca" l'ultimo elemento dalla lista
delete p; // dealloca l'ultimo elemento
}
}
//------------------------------------------------------------
// 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;
}
//------------------------------------------------------------
// stampa versione iterativa
void print(const L & l) {
L temp=l;
while(temp) {
cout << temp->elem;
cout << "\t";
temp=temp->punt;
}
}
Andiamo con ordine ragionando sull'operazione di push (inserimento in testa)
//------------------------------------------------------------
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
}
//------------------------------------------------------------
questa mi crea un record con puntatore q di tipo L. Accedo a questo record con q-> (che equivale a *q), ed in particolare accedo ai campi due record ponendovi "e" "l" .
Poi assegno q ad l, in modo tale che il puntatore alla testa della lista punti al nuovo record creato
poi la funzione inserimento
// insert versione iterativa
void insert(L& l,const E & e) {
if(l==0 || l->elem>e) push(l,e); //l'elemento va inserito in testa
else { //l'elemento va inserito al centro o in coda
L prec=l, succ;
//alloca ed inizializza il nuovo elemento
L q=new Record;
q->elem=e;
q->punt=0;
while(prec->punt && prec->punt->elem<e ) prec=prec->punt; //determina prec
succ=prec->punt; //determina succ, se l'inserimento è in coda succ deve valere 0
// collega il nuovo elemento al resto della lista (anche in coda se è il caso)
q->punt=succ;
prec->punt=q;
qui non ci incomincio a capire.....
if (il puntatore alla testa della lista è =0 oppure il campo elemento acceduto dal puntatore alla testa della lista è >e valore presente nel campo elemento del record) fai push mettendo il record in testa.
else
considera il puntatore a record "prec" inizializzato a quello di testa, e un altro puntatore a record "succ"
crea nuovo record, puntato da q , ed assegna ai due campi del nuovo record "e" e "0".
while( prec accede a punt ,secondo campo del record, e prec accede a punt che accede ad elemento del record successivo che sia < e ) cioè faccio scorrere prec, giusto? assegna a prec il puntatore e a succ il puntatore acceduto con prec.
assegna al secondo campo acceduto da q (quella del nuovo record) "succ"
e al campo punt acceduto da prec assegna q.
queste non le ho capite.
Mi aiutate per favore :muro:
mi aiutate per favore con le operazioni sulle liste alcune non le capisco
Anzitutto vi posto l'intestazione
// LISTADI1.H : Implementazione dinamica della struttura astratta lista
// realizzata con libreria di funzioni. File di SPECIFICA
#ifndef _LISTA_H_ // Compilazione condizionale
#define _LISTA_H_
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 insert(L& l, const E & e); // Inserimento in coda
bool erase(L& l, const E & e); // Cancellazione di un elemento specificato
bool inlist(const L& l, const E & e); // Vera se e e' presente nella lista
void print(const L &l); // Stampa la lista
void clear(L & l); // Distrugge la lista
#endif
Da qui capiamo che la struttura record ha 2 campi
-il contenuto (elem )
-puntatore (punt)
ed l di tipo L che è puntatore alla testa della lista
Poi vi metto l'implementazione
// LISTA.CPP : Implementazione dinamica della struttura lista con
// libreria di funzioni. File di IMPLEMENTAZIONE
#include "lista1.h"
#include <iostream>
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
}
//------------------------------------------------------------
// insert versione iterativa
void insert(L& l,const E & e) {
if(l==0 || l->elem>e) push(l,e); //l'elemento va inserito in testa
else { //l'elemento va inserito al centro o in coda
L prec=l, succ;
//alloca ed inizializza il nuovo elemento
L q=new Record;
q->elem=e;
q->punt=0;
while(prec->punt && prec->punt->elem<e ) prec=prec->punt; //determina prec
succ=prec->punt; //determina succ, se l'inserimento è in coda succ deve valere 0
// collega il nuovo elemento al resto della lista (anche in coda se è il caso)
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
}
//------------------------------------------------------------
// lastpop versione iterativa
void lastpop(L& l,E& e) { //oppure: bool lastpop(L& l,E& e)
if(l->punt==0) pop(l,e);
else {
L temp=l;
while(temp->punt->punt) temp=temp->punt; //scorre la lista, si ferma sul penultimo elemento
e=temp->punt->elem; // copia in e l'ultimo elemento
L p=temp->punt; // salva l'indirizzo dell'ultimo elemento
temp->punt=0; // "stacca" l'ultimo elemento dalla lista
delete p; // dealloca l'ultimo elemento
}
}
//------------------------------------------------------------
// 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;
}
//------------------------------------------------------------
// stampa versione iterativa
void print(const L & l) {
L temp=l;
while(temp) {
cout << temp->elem;
cout << "\t";
temp=temp->punt;
}
}
Andiamo con ordine ragionando sull'operazione di push (inserimento in testa)
//------------------------------------------------------------
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
}
//------------------------------------------------------------
questa mi crea un record con puntatore q di tipo L. Accedo a questo record con q-> (che equivale a *q), ed in particolare accedo ai campi due record ponendovi "e" "l" .
Poi assegno q ad l, in modo tale che il puntatore alla testa della lista punti al nuovo record creato
poi la funzione inserimento
// insert versione iterativa
void insert(L& l,const E & e) {
if(l==0 || l->elem>e) push(l,e); //l'elemento va inserito in testa
else { //l'elemento va inserito al centro o in coda
L prec=l, succ;
//alloca ed inizializza il nuovo elemento
L q=new Record;
q->elem=e;
q->punt=0;
while(prec->punt && prec->punt->elem<e ) prec=prec->punt; //determina prec
succ=prec->punt; //determina succ, se l'inserimento è in coda succ deve valere 0
// collega il nuovo elemento al resto della lista (anche in coda se è il caso)
q->punt=succ;
prec->punt=q;
qui non ci incomincio a capire.....
if (il puntatore alla testa della lista è =0 oppure il campo elemento acceduto dal puntatore alla testa della lista è >e valore presente nel campo elemento del record) fai push mettendo il record in testa.
else
considera il puntatore a record "prec" inizializzato a quello di testa, e un altro puntatore a record "succ"
crea nuovo record, puntato da q , ed assegna ai due campi del nuovo record "e" e "0".
while( prec accede a punt ,secondo campo del record, e prec accede a punt che accede ad elemento del record successivo che sia < e ) cioè faccio scorrere prec, giusto? assegna a prec il puntatore e a succ il puntatore acceduto con prec.
assegna al secondo campo acceduto da q (quella del nuovo record) "succ"
e al campo punt acceduto da prec assegna q.
queste non le ho capite.
Mi aiutate per favore :muro: