Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Список выводит элементы попорядку, а стек - в обратном порядке.

Код: Выделить весь код
type
	tData = integer;
   tPtr  = ^tNode;
   tNode = record
   	data: tData;
      next: tPtr;
   end;
   tStack = record
   	first, last: tPtr;
   end;

var
   S: tStack;
   D: tData;


function NotEmpty (var S: tStack): boolean; {проверка стека на пустоту}
begin
   NotEmpty := S.First <> nil;
end;

procedure Build (var S: tStack; D: tData); {первоначальное заполнение стека}
var
   f: text;
   p: tPtr;
begin
   assign (f,'stack.txt');
   reset (f);
   S.First := nil;
   S.Last := nil;
   while not eof(f) do begin
      New(p);
      readln (f, D);
      p^.data := D;
      if S.First = nil then
      	S.First := p
      else
      	S.Last^.next := p;
      S.Last := p;
   end;
   close(f);
end;

procedure Push (var S: tStack; D: tData); {добавить элемент}
var
	p: tPtr;
begin
	write ('Item = ');
   readln (D);
   New(p);
   p^.data := D;
   S.Last^.next := p;
   D := 0;
end;

procedure Pop (var S: tStack; var D: tData); {изъять элемент}
var
	p: tPtr;
begin
	if NotEmpty(S) then begin
   	D := S.Last^.data;
      p^ := S.Last^;
      S.Last := S.Last^.next;
      p^.next := nil;
     { Dispose(p); }
   end;
end;

procedure Clear;
begin
end;

procedure Echo (S: tStack); {вывод стека на экран}
var
	p: tPtr;
begin
   {p^ := S.Last^;}
   while S.Last <> nil do begin
      Pop (S, D);
   	writeln (D);
      Echo (S);
   end;

end;
В данном случае ECHO возвращает последний элемент стека и два нолика.
Почему?
Может я и правда каких-то серьёзных ошибок в этом коде не вижу?
Если что, хотелось бы пользоваться только p^.next, а p^.prev не пользоваться ^^

Отправлено: 15:21, 01-04-2009 | #5