[pseudopascal] Odwrócenie kolejności kolejki

0

Jak odwrócić kolejność elementów w kolejce? Kolejka jest zaimplementowana jako lista JEDNOKIERUNKOWA.
Czy jest jakiś lepszy wydajniejszy sposób niż ten który wymyśliłem?

Policzyć ilość elementów w kolejce (ile_elem)
W pętli 1 downto ile_elem
przechodzić po elementach s:=s.^next
i wpisać ten element s do nowej kloejki o tak
nowy_s:=s;
no i później przejść o jeden element dalej w tej nowej kolejce czyli
nowy_s:=nowy_s.^next;

A to WSZYSTKO musiałoby być w drugiej pętli for od 1 to ile_elem.

Wydaje mi się że powinno działać tylko że za każdym razem kiedy wybieram element z końca starej listy musze przejść od początku przez prawie całą listę....bo lista jest jednokierunkowa

Proszę napiszcie czy widzicie jakiś wydajniejszy sposób bo obawiam się tego zadania na kartkówcę, a mój gość ma bzika na punkcie wydajności...

0

Nie chce mi sie rozkminiac twojego algorytmu ale wystarczy zrobic mniej wiecej tak:

zmienne: pomocniczy_element //jako wskaznik, ale to juz zalezy od implementacji
w petli od poczatku do konca kolejki
{
tworzysz nowy_element
tutaj do nowy_element przypisujesz dane z aktualnej pozycji twojej pierwotnej listy
jesli pomocniczy_element = null to nowy_element.next = null else nowy_element.next = pomocniczy_element
pomocniczy_element = nowy_element
}

dop:
no tak, zapomnialem, masz lekko poprawiony, a czy zadziala, przeanalizuj i sam sobie odpowiedz :)

0

Mówisz że to będzie działać?
Ale jak, skoro ja w ogóle nie widze w Twoim programie tej części która wybiera prawy(końcowy) element z list żeby włożyć go na początek?
Tamten mój opis też nie będzie działał...
a powiedzcie proszę czy to zadziała?

new(tmp)
for i:=1 to dlkolejki div 2 do
begin
	tmp:=lewy;
	for j:=1 to dlkolejki+1-i
	   prawy:=prawy.^next
	lewy:=prawy;
	prawy:=tmp;
	lewy:=lewy.^next;
end;
0

Jakoś nie jestem przekonany co do tego rozwiązania.

Jeśli kolejkę kończysz nilem to można to rozwiązać tak:

var
 p,k,t:wsk;
 d:dana;

begin
p:=pocz_kolejki;
k:=nil;
while (p<>k) and (k^.nast<>p) do
 begin
  t:=p;
  while t^.nast<>k do
   t:=t^.nast;
  k:=t;
  d:=p^.dana;
  p^.dana:=k^.dana;
  k^.dana:=d;
  p:=p^.nast;
 end;
end;

Ogólnie mówiąc, to poruszasz się po jednym elemencie od strony początku koleki (p) i końca (k), dotąd aż się nie zejdą, lub miną. I zamieniasz w tych parach tylko dane w nich zawarte, bez żadnych modyfikacji samej struktury wskaźników.

0
Lancer napisał(a)

Jak odwrócić kolejność elementów w kolejce?

Czy możesz nieco przybliżyć cel tej operacji?

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