Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с двусвязным списком..
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Andrewshkovskii
Проблема следущая,при добавлении справа,теряются 2 элемента,код,по-моему мнения верный,возможно проблема в том,что нет передачи параметров?...
Модуль с типом
UNIT TYPES;

  INTERFACE

  type
    ts  = ^nvs;
    nvs = record
            name: string[15];
            Llink: ts;
            Rlink: ts;
          end;
  IMPLEMENTATION
END.

Вот код модуля :
unit spisok;

INTERFACE
  uses types;
  procedure output2S;
  procedure input2S;
  procedure add_left;
  procedure add_right;
  procedure delsearch3_left(del:boolean);
  procedure delsearch3_right(del:boolean);

IMPLEMENTATION

  var
    left,right,a:ts;
    i: integer;
    n: string;

procedure input2S;
 var
  i,j:byte;
  begin
      writeln('Vvedite kol-vo vagonov v sostave');
      readln(j);
      for i:=1 to j do
       begin
        writeln('Vvedite nomer vagona:');
        readln(n);
        new(a);
        a^.name:=n;
        a^.llink:=nil;
        a^.rlink:=left;
        left:=a;
        right:=a;
      end;
  end;

procedure output2S;
  begin
     writeln('Sostav : ');
     a:=left;
     repeat
           write(a^.name,' ');
           a:=a^.rlink;
     until a=nil;
     writeln;
  end;

procedure add_left;
  begin
     writeln('Dobovlyaem element sleva');
     writeln('Vvedite nomer vagona:');
     readln(n);
     new(a);
     a^.name := n;
     a^.llink:=nil;
     left^.llink:=a;
     a^.rlink:=left;
     left:=a;
  end;

procedure add_right;
  begin
     writeln('Dobovlyaem element sprava');
     writeln('Vvedite nomer vagona:');
     readln(n);
     new(a);
     a^.name := n;
     a^.rlink:=nil;
     right^.rlink:=a;
     a^.llink:=right;
     right:=a;
  end;

procedure delsearch3_left(del:boolean);
  var
    pos: byte;
    flg: boolean;
  begin
    writeln('Vvedite iskomii vagon');
    readln(n);
    flg:=false;
    pos:=0;
    a:=left;
    repeat
      if a^.name = n then
        flg:=true
      else
        a:=a^.rlink;
      pos:=pos+1;
    until (a=nil) or (flg=true);
    if flg=true then
       writeln('Pozicija vagona v sostave   = ', pos)
    else
       writeln('Iskomogo elementa net.');
    if (del=true) and (flg=true) then
      begin

            if (a<>left) and (a<>right) then          { v centre     }
              begin
                a^.llink^.rlink:=a^.rlink;
                a^.rlink^.llink:=a^.llink;
                dispose(a);
              end;
            if (a=left) and (a=right) then            { edinstvennij }
              begin
                dispose(a);
                right:=nil;
                left:=nil;
              end;
              if (a=left) and (a<>right) then         { krajnij sleva }
                begin
                  a:=left;
                  left:=left^.rlink;
                  left^.llink:=nil;
                  dispose(a);
                end;
              if (a=right) and (a<>left) then         { krajnij sprava }
                begin
                  a:=right;
                  right:=right^.llink;
                  right^.rlink:=nil;
                  dispose(a);
                end;

      end;
  end;

procedure delsearch3_right(del:boolean);
  var
    pos: byte;
    flg: boolean;
  begin
    writeln('Vvedite iskomii vagon');
    readln(n);
    flg:=false;
    pos:=0;
    a:=right;
    repeat
      if a^.name = n then
        flg:=true
      else
        a:=a^.llink;
      pos:=pos+1;
    until (a=nil) or (flg=true);
    if flg=true then
      writeln('Pozicija vagona v sostave = ', pos)
    else
      writeln('Iskomogo elementa net.');
    if (del=true) and (flg=true) then
      begin

            if (a<>left) and (a<>right) then        { v centre     }
              begin
                a^.llink^.rlink:=a^.rlink;
                a^.rlink^.llink:=a^.llink;
                dispose(a);
              end;
            if (a=left) and (a=right) then          { edinstvenniy }
              begin
                dispose(a);
                right:=nil;
                left:=nil;
              end;
            if (a=left) and (a<>right) then         { krajnij sleva }
              begin
                a:=left;
                left:=left^.rlink;
                left^.llink:=nil;
                dispose(a);
              end;
            if (a=right) and (a<>left) then         { krajnij sprava }
              begin
                a:=right;
                right:=right^.llink;
                right^.rlink:=nil;
                dispose(a);
              end;

      end;
  end;

volvo
Вроде все верно... На всякий случай покажи кусок кода, где ты вызываешь add_right ... И заодно - как ты инициализируешь left и right (у тебя же они из основной программы недоступны, а обнулить их по-любому в начале надо...)
Andrewshkovskii
вот так вызываю..

begin
clrscr;
input2s;
output2s;
add_right;
output2s;
readkey;
end.


left и right обнилил в начале..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.