Podwójnie łączona lista

0

Witam.
Mam stworzyć program działający jako podwójnie łączona lista.
Dzięki poradnikom napisałem program w 90%. Teraz jednak pojawia się problem.
Mianowicie przy wypisywaniu elementów z listy, tworzę tymczasowy węzeł który wskazuje na początek listy, jednak gdy chcę wskazać na następny wskazuje mi KONIEC tej listy.
Gdzie może być błąd?

#include <iostream>

using namespace std;

class zespolona{
	int rzeczywista,urojona;
public:
	zespolona():rzeczywista(0),urojona(0){}
	zespolona(int a,int b):rzeczywista(a),urojona(b){}
	friend ostream & operator<<(ostream &out,const zespolona & obj){
		return out<<"Rzeczywsita "<<obj.rzeczywista<<" Urojona"<<obj.urojona<<" \n";
	}
	bool operator<(const zespolona& o){
		return rzeczywista<o.rzeczywista;
	}
	bool operator>(const zespolona& o) const{
		return rzeczywista<o.rzeczywista;
	}
	bool operator==(const zespolona& obj){
		return (rzeczywista==obj.rzeczywista && urojona==obj.urojona);
	}
};

struct node{
	zespolona t;
	node * next;
	node * prev;
	node():prev(NULL), next(NULL) {};
};

class lista{
protected:
	node *head;
	node *tail;

public:
	friend node;
	lista():head(NULL),tail(NULL) {}
	bool empty() const { return head==NULL;}  
	lista & operator+=(const zespolona &obj){
		if(empty()){
			node* temp = new node;
			head = temp;
			tail = temp;
			temp->prev = NULL;
			temp->next = NULL;
			temp->t = obj;
		}else{
			node* curr;
			curr = head;
			while( obj>curr->t && curr->next != tail->next) curr = curr->next;

			if(curr == head){
				node* temp = new node;
				temp->t = obj;
				temp->prev = curr;
				temp->next = NULL;
				head->next = temp;
				tail = temp;
				cout<<" Inserted "<<obj<<" After "<<curr->t<<endl;
			}else{
				if(curr == tail && obj>tail->t){
					tail->next = new node;
					(tail->next)->prev = tail;
					tail = tail->next;
					tail->next = NULL;
					tail->t = obj;
					cout<<" Added "<<obj<<" at the end "<<endl;
				}else{
					node* temp = new node;
					temp->t = obj;
					temp->next = curr;
					(curr->prev)->next = temp;
					temp->prev = curr->prev;
					curr->prev = temp;
					cout<<" Inserted "<<obj<<" Before "<<curr->t<<endl;
				}
			}
		}	
		return *this;
	}

	friend ostream& operator<<(ostream& ostr, const lista& l ){
		if(l.empty()){
			ostr<<" The list is empty. "<<endl;
		}else{
			node *temp;
			temp=l.head;
			for(temp;temp!=l.tail;temp=temp->next){     //coś tutaj jest nie tak?
				ostr<<temp->t;
				temp=temp->next;
			}
			return ostr;
		}
	}
	~lista(){
		while(head){
			const node *element=head;
			head=head->next;
			delete element;
		}
	}

};
int main(){
	lista q1;
	q1 += zespolona(1, 4);
	q1 += zespolona(2, 11);
	q1 += zespolona(3, 11);
	q1 += zespolona(4, 11);
	q1 += zespolona(5, 4);
	q1 += zespolona(6, 11);
	q1 += zespolona(7, 11);
	q1 += zespolona(8, 11);
	cout<<q1;


	return EXIT_SUCCESS;
}
0

w tym miejscu co zaznaczyłeś, dwukrotnie przesuwasz się dalej po liście, dalej nie sprawdzalem:

                        for(temp/*<-- to nic nie robi, mozna to wywalic*/;temp!=l.tail;temp=temp->next/*2*/){     //coś tutaj jest nie tak?
                                ostr<<temp->t;
                                temp=temp->next;/*1*/
                        }
0
for(temp;temp!=l.tail;temp=temp->next){
           temp=temp->next;
}
</quote> Robiąc tak również nie działa, przelatuje tylko raz pętlę (po pierwszej iteracji temp wskazuje na KONIEC a nie na wartość następną) Nie mam pojęcia czemu tak sie dzieje
0
for(temp;temp!=l.tail;temp=temp->next)
{
}

</quote>a tak?

0

Oj mój błąd, tak mam.

 for(temp;temp!=l.tail;temp=temp->next){
            ostr<<temp->t;
}

Pętla jest uruchamiana raz.. obojętnie czy jest pusta czy pełna, temp-> next pokazuje na KONIEC, czyli l.tail ;/
Nie wiem dlaczego;/

1

poprawiłem Ci parę błędów, już się nie sypie ale nie sprawdzałem czy dobrze działa:

#include <iostream>

using namespace std;

class zespolona
{
  int rzeczywista,urojona;
public:
  zespolona():rzeczywista(0),urojona(0) {}
  zespolona(int a,int b):rzeczywista(a),urojona(b) {}
  friend ostream & operator<<(ostream &out,const zespolona & obj)
  {
    return out<<"Rzeczywsita "<<obj.rzeczywista<<" Urojona"<<obj.urojona<<" \n";
  }
  bool operator<(const zespolona& o)
  {
    return rzeczywista<o.rzeczywista;
  }
  bool operator>(const zespolona& o) const
  {
    return rzeczywista<o.rzeczywista;
  }
  bool operator==(const zespolona& obj)
  {
    return (rzeczywista==obj.rzeczywista && urojona==obj.urojona);
  }
};

struct node
{
  zespolona t;
  node * next;
  node * prev;
  node():prev(NULL), next(NULL) {}
  node(const zespolona& z): t(z), prev(NULL), next(NULL) {}
  node(const zespolona& z, node* prev): t(z), prev(prev), next(NULL) {}
};

class lista
{
protected:
  node *head;
  node *tail;

public:
  friend node;
  lista():head(NULL),tail(NULL) {}
  bool empty() const
  {
    return head==NULL;
  }
  lista & operator+=(const zespolona &obj)
  {
    if(empty())
      {
        head = tail = new node(obj);
        // tutaj cos przekombinowales
      }
    else
      {
        tail->next = new node(obj,tail);
        tail = tail->next;
        // nie mam pojecia co ty wyprawiasz w tym fragmencie:
        /*node* curr = head;
        while( obj>curr->t && curr->next != tail->next) curr = curr->next;

        if(curr == head)
          {
            node* temp = new node;
            temp->t = obj;
            temp->prev = curr;
            temp->next = NULL;
            head->next = temp;
            tail = temp;
            cout<<" Inserted "<<obj<<" After "<<curr->t<<endl;
          }
        else
          {
            if(curr == tail && obj>tail->t)
              {
                tail->next = new node;
                (tail->next)->prev = tail;
                tail = tail->next;
                tail->next = NULL;
                tail->t = obj;
                cout<<" Added "<<obj<<" at the end "<<endl;
              }
            else
              {
                node* temp = new node;
                temp->t = obj;
                temp->next = curr;
                (curr->prev)->next = temp;
                temp->prev = curr->prev;
                curr->prev = temp;
                cout<<" Inserted "<<obj<<" Before "<<curr->t<<endl;
              }
          }*/
      }
    return *this;
  }

  friend ostream& operator<<(ostream& ostr, const lista& l )
  {
    if(l.empty())
      {
        ostr<<" The list is empty. "<<endl;
      }
    else
      {
        for(node* temp = l.head; ; temp=temp->next)    //coś tutaj jest nie tak?
          {
            ostr << temp->t;
            if (temp==l.tail) // inaczej by nie wyswietlilo ostatniego elementu
              break;
          }
        return ostr;
      }
  }
  ~lista()
  {
    while(head)
      {
        node *next = head->next;
        delete head;
        head = next;
      }
  }

};
int main()
{
  lista q1;
  q1 += zespolona(1, 4);
  q1 += zespolona(2, 11);
  q1 += zespolona(3, 11);
  q1 += zespolona(4, 11);
  q1 += zespolona(5, 4);
  q1 += zespolona(6, 11);
  q1 += zespolona(7, 11);
  q1 += zespolona(8, 11);
  cout<<q1;


  return 0;
}
0

dzięki;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1