PDA

Visualizza la versione completa : [C++]Liste


Luc@s
09-10-2003, 17:04
Ho il seguente cod:


#include <iostream>
#include <cstdio>

using namespace std;

struct List
{
/*
* The list information
*/
int info;
/*
* The next list element
*/
List *next;
/*
* Create struct
* 1. The struct info
* 2. The next structure addres
*/
List(int Info, List *Next)
{
info = Info;
next = Next;
}
/*
* Add a element
* 1. A List pointer
* 2. A value of element
*/
void add(List *pr, int n)
{
if(pr == NULL){ /* first element */
pr->info = n;
pr->next = NULL;
}
/* another case */
List *p = pr;
while(p->next != NULL)
p = p->next;
p->next = new List(n, NULL);
}
/*
* Print all element
* 1. A List pointer
*/
void print(List *pr)
{
List *p = pr;
while(p->next != NULL){
cout << "Info = " << p->info <<"\n";
p = p->next;
}
}
/*
* Find a element
* 1. A List pointer
* 2. A index that you wont to find
*/
List *find(List *pr, int index)
{
List *p = pr;
while((p->next != NULL) && (p->info != index))
p = p->next;
return p;
}
void remove(List* pr, int n)
{
/*
List *p = ls;
while((p->next != NULL) && (p->info != n))
p = p->next;
delete p;
*/
}
/*
* Generate a list based.
* 1. a int array
* 2. a array lenght
*/
List* generate(List *pr, int parms[], int lenght)
{
for(register int i=0;i<lenght;i++){
pr->next = new List(parms[i], NULL);
}
}
};

int main()
{
List *p = new List(0, NULL);
int i = 0;
while( i != 10){
p->add(p, i);
i++;
}
p->print(p);
p->remove(p, 5);
p->print(p);
system("PAUSE");
return 0;
}


Ma pero remove nn mi fa il lavoro giusto, help me :(

P.s: nomenclatura generale(var e funz) e inglese(commenti) vanno bene???

dasvidania
10-10-2003, 00:47
potresti spiegare il problema ? non ti cancella l'elemento i-simo o non cancella niente?

dasvidania
10-10-2003, 01:03
forse ho capito!
hai passato il puntatore alla testa della lista, ma alla variabile puntatore p gli assegni ls che non è nulla o meglio non è stato allocato niente a ls, quindi quando gli assegni l'indirizzo di ls p punta a niente. ls fa parte del napespace?. Forse è questo. Non ti da errore di compilazione?.
Nelle altre funzioni tu passi pr e assegni: List *p = pr; qui invece gli passi pr e usi ls. Fammi sapere

Luc@s
10-10-2003, 07:37
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

struct List
{
/*
* The information index
*/
int index;
/*
* The information value
*/
void * data;
/*
* The next list element
*/
List * next;
/*
* Create struct
* 1. The struct index
* 2. The struct data
* 3. The next structure addres
*/
List(int Index, void * Data, List * Next)
{
data = Data;
index = Index;
next = Next;
}
/*
* Add a element
* 1. A List pointer
* 2. A index of element
* 3. The value of element
*/
void add(List * pr, int index, void * data)
{
if(pr == NULL){ /* first element */
pr->index = index;
pr->data = data;
pr->next = NULL;
}
/* another case */
List * p = pr;
while(p->next != NULL)
p = p->next;
p->next = new List(index, data, NULL);
}
/*
* Print all element
* 1. A List pointer
* 2. A mode
* 0 = wiew into a addres
* 1 = wiew into a string
*/
void print(List * pr, int mode=1)
{
List * p = pr;
while(p->next != NULL){
if(mode==0)
cout << "Info " << p->index <<" = " << p->data << "\n";
else if(mode==1)
cout << "Info " << p->index <<" = " << (char *) p->data << "\n";
p = p->next;
}
}
/*
* Find a element
* 1. A List pointer
* 2. A index that you wont to find
*/
List *find(List * pr, int index)
{
List * p = pr;
while((p->next != NULL) && (p->index != index))
p = p->next;
return p;
}
/*
* Remove a element
* 1. A List pointer
* 2. A index of element
*/
void remove(List * pr, int index)
{
List * p = pr;
if(!p) return;
if(p->index == index)
{
List * tmp = p->next;
delete p;
p = tmp;
}
else
remove(p->next, index);
}
/*
* Generate a list.
* 1. a array
* 2. a array lenght
*/
List* generate(List * pr, void * parms[], int lenght)
{
for(register int i=0; i<lenght; i++){
pr->next = new List(i, parms[i], NULL);
}
}
};

int main(int *argc, char *argv[])
{
string * st = new string("ciao");
List * p = new List(0, st, NULL);
int i = 0;
while( i != 10){
p->add(p, i, (string *) st);
i++;
}
cout << "Prima\n";
p->print(p);
p->remove(p, 5);
cout << "Dopo\n";
p->print(p);
system("PAUSE");
return 0;
}


Ora mi da errore in print().............mi stampa sempre gli indirizzi, why?


Tnk

dasvidania
10-10-2003, 10:47
xchè passargli p nella funzione?, il mo consiglio, quando fai liste è crearti 1 struttura(meglio 1 classe) nodo, con i campi informazione e next
e avere come membro privato della classe List 1 puntatore alla struttura(classe) nodo.
Cmq data l'hai definito * a void, xchè? forse è questo il problema.

Luc@s
10-10-2003, 14:56
e void * cosi posto castarlo in tutti i tipi :)

dasvidania
10-10-2003, 22:17
quello che usi è già un puntatore, quindi metti solo(char), altrimenti fai il cast di 1 puntatore con 1 puntatore a carattere e quindi ti restituisce l'indirizzo. Per la funzione add hai usato
pr->data = data;

Andrea Simonassi
11-10-2003, 01:15
void add(List *pr, int n)
{
//occhio!
//se pr è nullo non puoi metterci dentro dei dati
//....
if(pr == NULL){ /* first element */
/*pr->info = n;
pr->next = NULL;*/
throw string("INVALID NULL PARAMETER");
}
/* another case */
List *p = pr;
while(p->next != NULL)
p = p->next;
p->next = new List(n, NULL);
}

void print(List *pr)
{
List *p = pr;
//while(p->next != NULL){
while(p != NULL){//piccolo errorino, cosa succedeva prima
//a parte perdere la stampa dell'ultimo elemento, se il parametro
//fosse stato NULL?
//a questo proposito ricorda che per chi scrive delle funzioni di uso
//generale è importante capire di chi sia la responsabilità
//di controllare la correttezza del parametro (deve farlo il chiamante o
//la funzione?) se hai saltato il controllo del null perchè nel tuo
//progetto dovrebbe essere il chiamante il responsabile, ti conviene
//inserire una assert, in modo che in fase di debug
//salti fuori l'errore in caso il chiamante non faccia attenzione


cout << "Info = " << p->info <<"\n";
p = p->next;
}
}

//REMOVE CORRETTA
void remove(List* pr, int n)
{
List *p;

while((pr != NULL))
{
if(pr->next != NULL && pr->next->info == n)
{
p = pr->next;
pr->next = pr->next->next;
delete p;
}
pr = pr->next;
}
}




nella remove dimenticavi di ricostruire la lista prima di distruggere l'elemento trovato.

Buono studio

Ciao

Luc@s
11-10-2003, 07:33
Originariamente inviato da Andrea Simonassi

nella remove dimenticavi di ricostruire la lista prima di distruggere l'elemento trovato.

Buono studio

Ciao

Ma per il problema della stampa???

Cmq tnk

Andrea Simonassi
11-10-2003, 12:13
la print postata qua sopra mi funziona....

Anche l'ultima remove che hai inserito è sbagliata perchè non ricostruisce la lista, usa quella di cui sopra, che tra l'altro è iterativa e non ricorsiva.

Loading