PDA

View Full Version : [C++]Liste


Luc@s
09-10-2003, 16:07
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???

cionci
09-10-2003, 16:21
Consiglio...con la ricorsione si fa molto prima:

void remove(List* &p, int n)
{
if(!p) return;
if(p->info == n)
{
List *tmp = p->next;
delete p;
p = tmp;
}
else
remove(p->next, n);
}

Luc@s
09-10-2003, 16:34
per il p.s?


Tnk 1000

Luc@s
09-10-2003, 16:47
altra domanda.
Perche mi da errore in questo modo???

#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=0)
{
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()
{
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, 1);
p->remove(p, 5);
cout << "Dopo\n";
p->print(p, 1);
system("PAUSE");
return 0;
}


Mi sa che il prob è dove ho grassettato:(

Luc@s
09-10-2003, 17:26
Il problema e che mi stampa 'indirizzi e nn i dati:(

Luc@s
09-10-2003, 17:29
Ed Ecco il ris

mjordan
09-10-2003, 18:44
Ho visto che hai stampato gli indirizzi per cercare di renderti conto della situazione. Perchè non usi un debugger? Puoi ispezionare i singoli valori degli elementi nella struttura in cinque minuti e porre delle condizioni mentre costruisci la lista per accertarti che tutto vada per il verso giusto ...

Kleidemos
09-10-2003, 19:03
Originariamente inviato da mjordan
Ho visto che hai stampato gli indirizzi per cercare di renderti conto della situazione. Perchè non usi un debugger? Puoi ispezionare i singoli valori degli elementi nella struttura in cinque minuti e porre delle condizioni mentre costruisci la lista per accertarti che tutto vada per il verso giusto ...

ma io pero gli indirizzi voglio eliminarli con il mode della funz print solo che se lo metto a 1 mi restano sempre gli indirizzi:(

mjordan
09-10-2003, 19:08
void print(List * pr, int mode=0)
{
...
}

Kleidemos
09-10-2003, 19:15
ma l'idea delgi indirizzi i è sembrata stupida??
Come l'ho implementata sta lista, in generale???

Luc@s
09-10-2003, 19:18
cmq con la tua correzione e acendo print(p) mi viene la roba in allegato

P.S: cosa dicevi x il debugger?

mjordan
09-10-2003, 19:34
La mia non era una correzione ... Ho semplicemente copiato e incollato il prototipo della funzione ... :) Com'è che adesso l'output è diverso? :)

Per il debugger dicevo che è uno strumento con cui vale "perdere" un po di tempo ...
Questi problemi non derivano dalla capacità o meno di chi programma. Possono essere anche delle sviste fatte al volo al momento della codifica. Con un debugger come ad esempio gdb, puoi tracciare l'esecuzione del tuo proramma, controllare i valori che passi ad una funzione, ispezionare il contenuto di variabili o porre delle condizioni quando costruisci delle strutture di dati ... In sostanza questi problemi penso li abbiamo avuti tutti noi. Ma con un debugger correggerli sono 15 minuti di lavoro (e qualche diottria guadagnata :D )