Pointer-Problem bei verketteter Liste

Pollux

Erfahrenes Mitglied
Hi,

ich habe ein Problem, an dem ich nun schon mehrere Stunden sitze.
Ich habe eine doppelt verkettete Liste und einen Testtreiber:

Code:
bool equal(Clist const& a, Clist const& b) {
  if (a.size_ != b.size_) return false;
  if (!a.size_) return true;
  // Verzeigerung überprüfen
  assert (a.head_ && a.tail_ && b.head_ && b.tail_);
  assert(!a.head_->prev_ && !a.tail_->next_);
  assert(!b.head_->prev_ && !b.tail_->next_);
  for (ClistElem *p(a.head_), *q(b.head_); p && q; p=p->next_, q=q->next_) {
    if (p->next_) assert(p->next_->prev_ == p);

mein Kopierkonstruktor sieht so aus

Code:
Clist::Clist(Clist const &list): head_(0),tail_(0), size_(0) 
{
	if(list.empty())
	return;

	ClistElem *plist = list.head_;
	ClistElem *pnew = new ClistElem;	// Neues Element

	pnew->value_ = plist->value_;
	head_ = plist;

	while(plist->next_ != 0)
		{
		plist = plist->next_;
		pnew->next_ = new ClistElem;
		pnew = pnew->next_;
		pnew->value_ = plist->value_; // Strings kopieren
		}
	pnew->next_ = 0;
}

Allerdings schiesst er mich immer bei der Zeile
Code:
bool<unnamed>::equal(const Clist&, const Clist&): Assertion `p->next_->prev_ == p' failed
raus und ich verstehe einfach nicht, wieso.
Kann mir da jemand helfen?

Vielen Dank schonmal für eure Bemühungen.
 
Hi.

Wenn du eine doppelt verkettete Liste kopieren willst, solltest du die Elemente auch doppelt verketten. pnext_ wird doch bei dir gar nirgendwo gesetzt?! :confused:

Außerdem sollte head_ nicht auf plist zeigen, sondern auf pnew.

Gruß
 
Zurück