Zamiana wskaźników na liście dwukierunkowej

0

Chcę zamienić ze sobą dwa wskaźniki na liście dwukierunkowej. Pytanie brzmi czy o czymś zapomniałem czy coś namieszałem?

 void swap(list *tmp1, list *tmp2)
{
	list *przed1, *za1, *przed2, *za2, *cmp;

	przed1=tmp1->left;
	za1=tmp1->right;
	przed2=tmp2->left;
	za2=tmp2->right;

	przed1->right=tmp2;
	za1->left=tmp2;

	przed2->right=tmp1;
	za2->left=tmp1;

	tmp2->left=przed1;
	tmp2->right=za1;

	tmp1->left=za2;
	tmp1->right=przed2;

}
0

Zapomniałeś lub nie dostrzegasz dwóch rzeczy.

  1. Te elementy mogą być sąsiednimi elementami w dwóch wariantach.
  2. Jeden z nich może być pierwszym, więc musisz też mieć dostęp do nagłówku listy. Jeżeli to jest klasyczna lista to w grę wchodzi również ostatni.
0

Zauważyłem że miałem błąd, w którejś linijce miałem wskaźnik na za->right, a powinno być za->left, ale to i tak nie rozwiązuję problemu. Zakładając że zamieniam miejscami wskaźniki daleko od pierwszego/ostatniego to i tak funkcja nie działa poprawnie. Nawet jakbym przekształcił listę na cykliczną. Nie rozumiem tylko o jakich wariantach mówisz, co mam przez to rozumieć?

1

Nie wiem czy to zrozumiesz:
Tak nazwałeś zmienne że sam w tym wszystkim się pogubiłeś, jak nazwiesz je po ludzku tak żeby sama nazwa mówiła co tam jest to nie będzie takich problemów.
Dla mnie szybciej napisać od nowa niż analizować jak to się u ciebie nazywa.

void swap(List &L,list *A, list *B)
  {
   list *ALeft=A->left;
   list *ARight=A->right;
   list *BLeft=B->left;
   list *BRight=B->right;
 
   (ALeft?ALeft->right:L.head)=B;
   B->left=ALeft;
   B->right=ARight;
   (ARight?ARight->left:L.tail)=B;
 
   (BLeft?BLeft->right:L.head)=A;
   A->left=BLeft;
   A->right=BRight;
   (BRight?BRight->left:L.tail)=A;
  }
0

Funkcja działa poprawnie dla elementów, które są odpowiednio oddalone od siebie. A jak należy przekształcić funkcję jeśli chcę zamienić ze sobą dwóch "sąsiadów"?

0

A miał być pełny gotowiec? Może razem z funkcją sortującą? Zapakować?

0

No dobra, jeśli mamy np.
(ARight!=NULL?ARight->left:list.max)=B;
to jeśli są obok siebie ARight->left jest B i będzie wskazywał na siebie.
Wybaczcie, ale mózg już wysiada i nawet najprostszych rzeczy nie potrafię już zrobić, więc czy ktoś mógłby mi WPROST napisać, co ma przypisywać danym wskaźnikom kiedy są sąsiadami?

0

Ostatecznie tak wygląda moja funkcja sortująca:

void sort(list *L){

    bool end=true;
    struct lElement *tmp, *a, *b;

    while(end){
        end=false;
		tmp=L->root;
		while(tmp->right != L->root){
            a=tmp;
            b=tmp->right;
			if(a->value > b->value){

                a->right=b->right;
                b->right=a;
                b->left=a->left;
                a->left=b;
                a->right->left=a;
                b->left->right=b;

				if(a==L->root)
                    L->root=b;
                else
                    if(b==L->root)
                        L->root=a;
				if(a==L->max)
					L->max=b;
				else
					if(b==L->max)
						L->max=a;

                end=true;
            }
            tmp=tmp->right;
        }
    }
}

Temat do zamknięcia!!!

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