Menu
Archwium
Kategorie
Miniblog
Szukaj

[2]

12 Mar 2008, 19:08:06, Infa, Projekty | Trackback

Lista dwukierunkowa z elementem aktualnym jest listą dwukierunkową z trzema wyróżnionymi elementami: wskaźnik do początku, wskaźnik do końca i wskaźnik do tzw. rekordu aktualnego. Napisać program zawierający następujące procedury/funkcje: inicjalizacja, wstawienie elementu pod wskaźnikiem aktualnym, usuwanie rekordu pod wskaźnikiem aktualnym, przesuwanie wskaźnika aktualnego w lewo lub w prawo. Program powinien demonstrować takie operacje w trybie interakcyjnym (tzn. za pomocą menu).

program zad2;
uses	crt;
type	lista=^element;
		element=record
			liczba:integer;
			next,prev:lista;
		end;
var	head,aktualny:lista;
	key,znak:char;
	i,n:integer;

function nowy:lista;
var	v:lista;
begin
	new(v);
	v^.next:=Nil;
	v^.prev:=Nil;
	read(v^.liczba);
	nowy:=v;
end;

procedure dodaj(v:lista);
begin
	if head<>Nil then head^.prev:=v;
	v^.next:=head;
	head:=v;
	v^.prev:=Nil;
end;

procedure dodajpodaktualny(v:lista);
begin
	if aktualny=head then begin
		aktualny^.prev:=v;
		v^.next:=aktualny;
		aktualny:=v;
		head:=aktualny;
	end else begin
		v^.next:=aktualny;
		v^.prev:=aktualny^.prev;
		aktualny^.prev:=v;
		v^.prev^.next:=v;
		aktualny:=v;
	end;
end;

procedure usunpodaktualnym(v:lista);
begin
	if v^.prev<>Nil then v^.prev^.next:=v^.next
		else begin
			head:=v^.next;
			if head<>Nil then head^.prev:=Nil;
		end;
	if v^.next<>Nil then v^.next^.prev:=v^.prev;
	if v^.prev<>Nil then aktualny:=v^.prev
		else if v^.next<>Nil then aktualny:=v^.next
			else writeln('`-lista jest pusta');
end;

procedure przesunaktualny(x:char);
begin
	if ((x='l') and (aktualny^.prev<>Nil)) then aktualny:=aktualny^.prev 
		else if (x='l') then write('`-operacja niedozwolona - wyjscie poza liste')
			else if ((x='p') and (aktualny^.next<>Nil)) then aktualny:=aktualny^.next
				else if (x='p') then write('`-operacja niedozwolona - wyjscie poza liste')
end;

procedure drukuj;
var	v:lista;
begin
	v:=head;
	while v<>Nil do begin
		write(v^.liczba,' ');
		v:=v^.next;
	end;
	writeln;
	write('`-nacisnij enter aby wybrac inna pozycje z menu');
	readln;
end;

begin
	head:=Nil;
	n:=0;
	repeat
		clrscr;
		writeln('Wybierz pozycje z menu:');
		writeln('----------------------------------------------');
		writeln('(1) - inicjalizacja listy');
		writeln('(2) - dodaj element pod aktualnym wskaznikiem');
		writeln('(3) - usun element pod aktualnym wskaznikiem');
		writeln('(4) - przesun aktualny wskaznik');
		writeln('(5) - wyswietl liste');
		writeln('(6) - wyjscie z programu');
		writeln('----------------------------------------------');
		key:=readkey;
		case key of
			'1':begin
				write('`-podaj dlugosc listy: ');
				readln(n);
				write('`-podaj ',n,' elementow (liczby oddzielone spacja): ');
				for i:=1 to n do dodaj(nowy);
				readln;
				write('`-lista skladajaca sie z ',n,' elementow: ');
				drukuj;
				aktualny:=head;
			end;
			'2':begin
				if (n<=0) then begin
					writeln('`-zainicjalizuj liste');
					readln;
				end else begin
					write('`-podaj element jaki chcesz dodac pod aktualny wskaznik: ');
					dodajpodaktualny(nowy);
					n:=n+1;
					readln;
					write('`-lista skladajaca sie z ',n,' elementow: ');
					drukuj;
				end;
			end;
			'3':begin
				if (n<=0) then begin
					writeln('`-lista jest pusta');
					readln;
				end else begin
					write('`-czy chcesz usunac element pod aktualnym wskaznikiem? t/n: ');
					readln(znak);
					if znak='t' then begin
						usunpodaktualnym(aktualny);
						n:=n-1;
						if n<>0 then writeln('`-od teraz pod aktualnym wskaznikiem jest liczba: ',aktualny^.liczba);
						if n<>0 then write('`-lista skladajaca sie z ',n,' elementow: ');
						drukuj;
					end else begin
						write('`-lista skladajaca sie z ',n,' elementow nie ulegla zmianie: ');
						drukuj;
					end;
				end;
			end;
			'4':begin
				if (n<=0) then begin
					writeln('`-lista jest pusta');
					readln;
				end else begin
					writeln('`-na poczatku wskaznik aktualny jest ustawiony na ostatnio dodanym elemencie');
					write('`-wpisz l aby przesunac wskaznik w lewo albo p gdy w prawo: ');
					readln(znak);
					przesunaktualny(znak);
					if ((znak='l') and (aktualny^.prev<>Nil)) then write('`-wskaznik przesunieto w lewo - pod aktualnym wskaznikiem jest liczba: ',aktualny^.liczba)
						else if ((znak='p') and (aktualny^.next<>Nil)) then write('`-wskaznik przesunieto w prawo - pod aktualnym wskaznikiem jest liczba: ',aktualny^.liczba);
					readln;
				end;
			end;
			'5':begin
				if (n<=0) then begin
					writeln('`-lista jest pusta');
					readln; 
				end else begin
					write('`-lista skladajaca sie z ',n,' elementow: ');
					drukuj;
				end;
			end;
		end;
	until key='6';
end.

Wynik z konsoli:

maniek@maniek:~$ ./zad2
Wybierz pozycje z menu:
----------------------------------------------
(1) - inicjalizacja listy
(2) - dodaj element pod aktualnym wskaznikiem
(3) - usun element pod aktualnym wskaznikiem
(4) - przesun aktualny wskaznik
(5) - wyswietl liste
(6) - wyjscie z programu
----------------------------------------------
`-podaj dlugosc listy: 5
`-podaj 5 elementow (liczby oddzielone spacja): 1 10 11 4 5
`-lista skladajaca sie z 5 elementow: 5 4 11 10 1
`-nacisnij enter aby wybrac inna pozycje z menu

Komentarze:

Dodaj komentarz:

HTML w komentarzach jest wyłączony, możesz jednak skorzystać z Textile Lite.

<< Powrót do reszty wpisów