insert-sort na liście dwukierunkowej

0

Witam !
Chciałem napisać program który sortuje listę dwukierunkową. Mój kod działa poprawnie z wyjątkiem jednej sytuacji gdy pierwszy element jest największy i nie potrafię znaleźć błędu mógłby mi ktoś pomóc ?

#include <iostream>

using namespace std;

struct node                       
{
  node *next;
  node *back;
  int value;
};

void add_start(node *&head, int x)
{
	node *temp=new node;
	temp->value=x;
	temp->next=head;
	head->back=temp;
	temp->back=NULL;
	head=temp;

}

void show_list(node *head)
{
	node *temp=head;
	while(temp)
	{
		cout<<temp->value<<"\t";
		temp=temp->next;
	}
	
}
void sort(node *&head)
{
	node *temp=head->next;				//zapamietywany element
	node *pom=head;						// poprzedni element
	node *wsk=head->next;				//nastepny element
	while(wsk != NULL)				
	{
		temp=wsk;
		pom=temp->back;
		wsk=temp->next;

		if(pom->value > temp->value)				// jezeli zapmaietany element jest mniejdzy niz poprzedni
		{
			if(wsk==NULL)							// jesli zapamietany element jest ostatni
			{
				pom->next=wsk;
			}
			else
			{
				pom->next=temp->next;
				wsk->back=pom;
			}
			
		}
		
		while(pom->value > temp->value )			// dopoki poprzednie elemnty sa wieksze
		{
			if(pom->back == NULL)					//jezeli przesuwany element jest pierwszy
			{
				if(pom->value > temp->value )		//jezeli pierwszy element jest wiekszy 
				{
					temp->next=pom;
					pom->back=temp;
					head=temp;
					temp->back=NULL;
				}
			}
			else
			{
				pom=pom->back;
			}

			if(pom==temp)
			{
				break;
			}
			
		}	
		if(pom->value <= temp->value && pom!=temp)		// jesli poprzednik nie jest wiekszy
		{
			temp->next=pom->next;
			temp->back=pom;
			pom->next=temp;
			
		}
					
	}
	
}

int main()
{
	node *head=new node;
	head->next=NULL;
	head->value=1;
	head->back=NULL;
	add_start(head, 1);
	add_start(head, 2);
	add_start(head, 3);
	add_start(head, 1);
	head->back=NULL;

	show_list(head);
	sort(head);
	cout<<endl;
	show_list(head);

	cout<<endl<<endl;
	system("PAUSE");
}
0

Okropnie przekombinowałeś.
Zapamiętaj, jak sobie pościelisz tak się wyśpisz, zrobiłeś brzydką strukturę danych - to masz skomplikowane działania.

#include <iostream> 
using namespace std;
 
struct node                       
  {
   node *next,*back;
   int value;
  };

struct list
  {
   node *head,*tail;
  };
 
node *make_node(int value,node *next,node *back)
  {
   node *tmp=new node;
   tmp->value=value;
   tmp->next=next;
   tmp->back=back;
   return tmp;
  }
  
void add_start(list &L,int value)
  {
   L.head=(L.head?L.head->back:L.tail)=make_node(value,L.head,0);
  }
 
void show_list(const list &L)
  {
   for(node *i=L.head;i;i=i->next) cout<<i->value<<"\t";
   cout<<endl;
  }
  
void sort(list &L)
  {
   if((L.head)&&(L.head!=L.tail))
     {
      for(bool more=true;more;)
        {
         more=false;
         for(node *b=L.head,*n=b->next;n;b=n,n=b->next)
           {
            if(b->value>n->value)
              {
               (b->back?b->back->next:L.head)=n;
               (n->next?n->next->back:L.tail)=b;
               n->back=b->back;
               b->next=n->next;
               n->next=b;
               b->back=n;
               more=true;
              }
           }      
        }      
     }
  }
 
int main()
  {
   list L={0,0};
   add_start(L,1);
   add_start(L,2);
   add_start(L,3);
   show_list(L);
   sort(L);
   show_list(L);
   return 0;
  }

http://ideone.com/MvFPE9

0

dzięki za pomoc, ale zmieniłeś cały mój program i niestety teraz nic z niego nie rozumiem ;/

0

jak byś mi chociaż wytłumaczył tą część

(b->back?b->back->next:L.head)=n;
(n->next?n->next->back:L.tail)=b;

bo wiem an czym polega instr warunkowa w tej postaci:

zmienna = (warunek) ? (wyr gdy jest prawdziwy) : (wyr gdy jest fałszywy)

0

Dokładnie to samo z tym że operator trójargumentowy może stać również po lewej stronie.

0

czyli jesli dobrze rozumiem to na samym poczatku:

  • b** wskazuje na head, a n wskazuje na nastepny element
    czyli b->back == NULL wiec wykona się n=L.head
    n->next != NULL wiec wykona sie b=n->next->back

czyli i n i b wskazuje na head?

0
(w?a:b)=x; // if(w) a=x; else b=x;

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