Nowy korzeń listy cyklicznej

0

Witam
Potrzebuje zmienić head'a listy cyklicznej jednokierunkowe na jego następnika. Dla przykłady gdy mam w liście 3 elementy o kluczach 1 2 3 i "jedynka" jest czołem zrobić tak aby nim była "dwójka" bez straty żadnego węzła. Ma ktoś jakieś pomysły. Głowię się nad z tym, a w internecie nie mogę znaleźć żadnych przykładów.
Z góry dzięki

2

Jeśli masz jednokierunkową listę cykliczną a->b->c->a to nie bardzo widzę jaki masz problem. head = head->next;?

0

Tak też robiłem, ale nie jest to jednak dobry pomysł na rozwiązanie mojego problemu.

Spróbuje inaczej.Posiadam funkcję która dodaje do listy X nowych wylosowanych elementów w porządku rosnącym wg. klucza. Problem w tym że węzeł dodany do listy jako pierwszy zawsze zostanie na 1 miejscu.

Poniżej kod tej funkcji

 

void dod_X(lista   *& head , int X){
		
        int key;
	lista *p  =head ;
	lista *ele = new lista;
	
	for(int i=0;i<X;i++){
	
	p  = head ;
	ele = new lista;

	key=(rand()%19990)+10;
	
	int k;
	
	k=czy(p,key);               ///funkcja sprawdzajaca czy wylosowana liczba już wcześniej nie wystąpiła, klucze muszą być unikalne
    if(k>0){
	ele->key=key;
	ele->s1=rand();
	ele->s2='Z';
	
	if(p)
	{
	
				
			
		do{
		          
			
			if(p->next->key > ele->key) break;
			
			p=p->next;
			
		
		}while(p->next!=head); 

		
		
		ele->next = p->next ;
	
 		p->next = ele;
		
		
		
	}else {
		
	ele->next = ele;    /// jeśli lista jest pusta ele ma zostać head'em
	
	head=ele;}
	
	


}

	else --i;  w przypadku gdy klucz sie powtarza cofnij licznik i losuj ponownie
	
}




		

}

Po dodaniu 1500 węzłów i wypisaniu pierwszych 20 otrzymuje takie wyniki:60de984e86.png

Jakieś pomysły jak zmodyfikować funkcję by wszystkie węzły były posortowane ?

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