Hej igen! Om det är C++ det är frågan om är det vettigaste att helt enkelt använda den inbyggda "list". Ligger i #include-filen <list>. >Annars är principen nästan alltid att använda rekursion för länkade listor. Jaa ja ja ja, det vet jag ju hur man gör, kopierar.Länkad lista, Kopierings-Konstruktorn
Skulle ni kunna hjälpa mig med en liiiten pytte sak, nämligen Kopieringskonstruktorn till en LÄNKAD LISTA.
Jag har fått den att skapa ett listobjekt och kopiera första noden.
Men sen tar det stop.
Jag märker att den går in i for-loopen och klarar av att kopiera nod nr 2, men sedan vet jag inte vad jag gör för fel, när jag ska försöka stoppa in nod nr 2 längst bak i nya listan.
Så här har jag tänkt ut hur länkade listan skapas första gången:
Användaren skriver in 123 på tangentbordet.
List objektet skapas och stoppar in tal för tal i länkade listan bakvänt, dvs
tal 1=första noden, tal 2=andra noden (som hoppar in mellan last & nod 1) och tal 3=sist skapade noden i listan (som hoppar in mellan last & nod 2).
Vilket blir att listan får detta utseende: [1]<-[2]<-[3]<-(*last), då *last är pekare till första noden i listan och (*last) är list objektet, dvs ett klassobjekt som innehåller/pekar på struct noder.
Gå in på denna länk och ladda ner BigInt.zip (ta bort .gif) och se hur jag gjort/försökt:
http://f1.pg.briefcase.yahoo.com/bc/tombolo_omvik/lst?.dir=/Kompisar/CPP&.order=&.view=l&.src=bc&.done=http%3a//f1.pg.briefcase.yahoo.com/
Det ser så enkelt ut att kopiera min länkade lista. Man ska ju bara behöva stega framåt i båda listorna och kopiera nod för nod, men som sagt, jag kommer inte på hur man stegar framåt i den nya listan och stoppar in de nya noderna längst bak i den nya listan.
Jag hoppas att det är bara pekarna som pekar fel.Sv: Länkad lista, Kopierings-Konstruktorn
Annars är principen nästan alltid att använda rekursion för länkade listor.
I princip följande (halvpseudokod) :
void Kopiera(Nod1, Nod2)
{
Nod1.värde=Nod2.värde;
if(Nod2.barn != 0)
Kopiera(Nod1.barn, Nod2.barn);
}Sv:Länkad lista, Kopierings-Konstruktorn
Nja, svansrekursion brukar man väl byta ut mot vanlig iteration?
void Kopiera(Nod1, Nod2)
{
do {
Nod1->värde=Nod2->värde;
Nod1 = Nod1.barn; Nod2 = Nod2.barn;
}
while (Nod2)
}Sv: Länkad lista, Kopierings-Konstruktorn
Men kopierings-konstruktorn ska ju inte bara kopiera, utan den måste också skapa en ny lista + alla nya noder som sedan ska stoppas in i nya listan.
Jag kan skapa och kopiera första noden, men de övriga noderna kan jag sedan inte stoppa in i listan. (längst bak). Det är problemet. Har lite problem med pekarna i for() loopen, som sagt.
PS: Använda biblioteket <list> får jag inte göra för läraren, utan jag måste skapa mig en egen lista från grunden.
Så här ser min Kopierings-Konstruktor ut:
<C++ kod>
BigInt::BigInt(const BigInt &bi)
{
last=NULL;
count=0;
int bisize=bi.count;
int i=0;
Node *p=new Node;
Node *pbi=new Node;
pbi->next=bi.last;
pbi=pbi->next;
Node *newnode=MakeBigIntNode(pbi->digit);
newnode->next=last;
last=newnode;
p->next=newnode;
count++; //antal noder i listan
for(i=1; i<bisize; i++)
{
pbi=pbi->next;
Node *newnode=MakeBigIntNode(pbi->digit);
newnode->next=p->next;
p->next=newnode;
count++;
//p=p->next;
}
delete p;
delete pbi;
}Sv:Länkad lista, Kopierings-Konstruktorn
BigInt::BigInt(const BigInt &bi) : last(NULL), count(0) {
if (bi.last) {
last = MakeBigIntNode(bi.last->digit);
count = 1;
for (Node* itr = bi.last->next, *newitr = last; itr; itr = itr->next, count +=1)
newitr = newitr->next = MakeBigIntNode(itr->digit);
}
}