Witam oto dostałem zadanie domowe. Napisz program tworzący listę dwukierunkową oraz realizujacy zadania:
-usuwania elementów o wartości minimalnej
-wypisywania elementów listy od końca.
Wypisywanie już zrobiłem, lecz nie daje rady z tym usuwaniem. Czy może ktoś pomóc ???
a oto kod
oraz zwykle usuwanie, którego ma nie byc w programie.
-usuwania elementów o wartości minimalnej
-wypisywania elementów listy od końca.
Wypisywanie już zrobiłem, lecz nie daje rady z tym usuwaniem. Czy może ktoś pomóc ???
a oto kod
program dwukierunkowa;
uses crt;
const
N = 15;
type wskLista = ^element;
element = record
dane : integer;
wskPoprzednika : wskLista;
wskNastepnika : wskLista;
end;
type nodeList = ^e;
e = record
first : wskLista;
last: wskLista;
aktualny: wskLista;
end;
var
lista: nodeList;
wartosc : integer;
co: char;
procedure showActual(var lista: nodeList);
begin
writeln(lista^.aktualny^.dane);
end;
procedure createList(var lista : nodeList);
begin
lista^.first := nil;
lista^.last := nil;
lista^.aktualny := nil;
end;
procedure deleteList(var lista : nodeList);
var
tmp: wskLista;
begin
lista^.aktualny := lista^.first;
while lista^.aktualny <> nil do
begin
tmp := lista^.aktualny^.wskNastepnika;
writeln('Usuwam element ',tmp^.dane,' offset: ',ofs(tmp^.dane));
dispose(lista^.aktualny);
lista^.aktualny := tmp;
end
end;
procedure readList(var lista : wskLista);
var
tmp : wskLista;
begin
writeln('Zawartosc Listy od Konca');
tmp := lista;
while tmp <> nil do
begin
write(' => ',tmp^.dane);
tmp := tmp^.wskPoprzednika;
end;
writeln;
end;
procedure pushFront(var lista : nodeList; nowy: wskLista);
begin
lista^.first := nowy;
nowy^.wskNastepnika := lista^.aktualny;
lista^.aktualny^.wskPoprzednika := nowy;
nowy^.wskPoprzednika := nil;
lista^.aktualny := nowy;
end;
procedure pushInside(var lista : nodeList; nowy: wskLista);
begin
lista^.aktualny^.wskPoprzednika^.wskNastepnika := nowy;
nowy^.wskNastepnika := lista^.aktualny;
nowy^.wskPoprzednika := lista^.aktualny^.wskPoprzednika;
lista^.aktualny^.wskPoprzednika := nowy;
end;
procedure pushEnd(var lista: nodeList; nowy: wskLista);
begin
if lista^.first = nil then
lista^.first := nowy
else
begin
lista^.last^.wskNastepnika := nowy;
nowy^.wskPoprzednika := lista^.last;
end;
lista^.last := nowy;
end;
procedure push(var lista: nodeList; wart: integer);
var
nowy: wskLista;
begin
new(nowy);
nowy^.dane := wart;
if lista^.aktualny <> nil then
begin
if lista^.aktualny = lista^.first then
pushFront(lista, nowy)
else
pushInside(lista, nowy)
end
else
pushEnd(lista, nowy)
end;
begin
new(lista);
createList(lista);
repeat
clrscr;
writeln('d - dodaj do listy');
writeln('z - usun z listy minimalna wartosc');
writeln('w - wypisz liste od Konca');
writeln('q - koniec');
co:=readkey;
case co of
'd': begin write('podaj warosc: '); read(wartosc); push(lista, wartosc); end;
// 'z': begin pop(lista); end; //
'w': begin readList(lista^.last); co:=readkey; end;
end;
until co='q';
deleteList(lista);
end.
oraz zwykle usuwanie, którego ma nie byc w programie.
procedure popFront(var lista: nodeList);
begin
lista^.first := lista^.first^.wskNastepnika;
write('usunieto aktualny czyli ');
showActual(lista);
dispose(lista^.aktualny);
lista^.aktualny := lista^.first;
if lista^.first <> nil then
lista^.first^.wskPoprzednika := nil
else
lista^.last := nil
end;
procedure popInside(var lista: nodeList);
var
tmp: wskLista;
begin
tmp := lista^.aktualny^.wskPoprzednika;
tmp^.wskNastepnika := lista^.aktualny^.wskNastepnika;
lista^.aktualny^.wskNastepnika^.wskPoprzednika := tmp;
write('usunieto aktualny czyli ');
showActual(lista);
dispose(lista^.aktualny);
lista^.aktualny := tmp;
end;
procedure popEnd(var lista: nodeList);
var
tmp: wskLista;
begin
tmp := lista^.aktualny^.wskPoprzednika;
tmp^.wskNastepnika := nil;
lista^.last := tmp;
write('usunieto aktualny czyli ');
showActual(lista);
dispose(lista^.aktualny);
lista^.aktualny := lista^.last;
end;
procedure pop(var lista : nodeList);
begin
if lista^.aktualny <> nil then
begin
if lista^.aktualny = lista^.first then
popFront(lista)
else
begin
if lista^.aktualny = lista^.last then
popEnd(lista)
else
popInside(lista)
end
end
end;