Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Программа со стеками. (http://www.tehnari.ru/f43/t47244/)

Хелен 09.02.2011 20:26

Программа со стеками.
 
Программа, формирующая односвязный список из пяти элементов, содержащих число и его текстовое представление. Выполняет вставку и удаление заданного элемента. В качестве ключа используется число.

Программа работает, но есть одно НО. Не вставляет элемент перед первым, т.е. напр. "0" элемент перед "1". Не могу никак додуматься. Толи ещё 1 функция нужна, то ли повернуть проверку счета не с начала в конец, а наоборот.

Код:

program linked_list;
const n = 5;
type        pnode = ^node;
        node = record          { элемент списка }
                d : word;
                s : string;
                p : pnode;
        end;
var        beg : pnode;  { указатель на начало списка }
        i, key        : word;
        s        : string;
        option        : word;
const        text: array [1 .. n] of string =
                        ('one', 'two', 'three', 'four', 'five');
procedure add(var beg : pnode; d : word; const s : string);

var p : pnode;            { указатель на создаваемый элемент }
      t : pnode;            { указатель для просмотра списка }
begin
        new(p);                        { создание элемента }
        p^.d := d; p^.s := s;        { заполнение элемента }
        p^.p := nil;

        if beg = nil then beg := p        { список был пуст }
        else begin                { список не пуст }
            t := beg;
          while t^.p <> nil do  { проход по списку до конца }
                t := t^.p;
          t^.p := p;  { привязка нового элемента к последнему }
        end
end;
function find(beg : pnode; key : word; var p, pp : pnode) : boolean;
begin
        p := beg;
        while p <> nil do begin                        { 1 }
                if p^.d = key then begin                { 2 }
                        find := true; exit end;
                pp := p;                          { 3 }
                p := p^.p;                        { 4 }
        end;
        find := false;
end;
procedure insert(beg : pnode; key, d : word; const s : string);
var p      : pnode;    { указатель на создаваемый элемент }
      pkey : pnode;    { указатель на искомый элемент }
      pp    : pnode;    { указатель на предыдущий элемент }

begin
    if not find(beg, key, pkey, pp) then begin
          writeln(' out error');
          exit;
  end;
  new(p);                {1}
  p^.d := d; p^.s := s;  {2}
  p^.p := pkey^.p;      {3}
  pkey^.p := p;            {4}
end;
p^.p:=nil;
procedure del(var beg : pnode; key : word);
var p  : pnode;    { указатель на удаляемый элемент }
      pp : pnode;    { указатель на предыдущий элемент }
begin
        if not find(beg, key, p, pp) then begin
                writeln(' delete error'); exit; end;
        if p = beg then
            beg := beg^.p  { удаление первого элемента }
        else pp^.p := p^.p;
        dispose(p);
end;
procedure print(beg : pnode);
var p : pnode;        { указатель для просмотра списка }
begin
        p := beg;
        while p <> nil do begin          { цикл по списку }
                writeln(p^.d:3, p^.s);        { вывод элемента }
            p := p^.p  { переход к следующему элементу списка }
        end;
end;
begin
    for i := 1 to 5 do add(beg, i, text[i]);

    while true do begin
        writeln('1 - past, 2 - delete,3 - out, 4 - exit');
          readln(option);

        case option of
        1: begin                                        { вставка }
                writeln('Key for past?');
                readln(key);
                writeln('past element?');
                readln(i); readln(s);
                insert(beg, key, i, s);
        end;
        2: begin                                        { удаление }
                writeln('Key for delete?');
                readln(key);
                del(beg, key);
        end;
        3: begin                                        { вывод }
                writeln('out list:');
                print(beg);
        end;
        4: exit;                                        { выход }
        end;
      writeln;
    end
end.



Часовой пояс GMT +4, время: 13:02.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.