Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Turbo Pascal] Список


Автор: Dower 2.4.2011, 15:00
Помогите решить задачку.

Дано число D и указатель P0 на один из элементов непустого двусвязного списка. Вставить перед данным элементом списка новый элемент со значением D и вывести указатель на добавленный элемент списка.

Автор: v4v4n 2.4.2011, 18:43
Код

function AddBefore(D:TData;var P0:PElem):PElem;
var R:PElem;
Begin
    New(R); R^.Data:=D; R^.Next:=P0;
    if P0<>nil then begin
          if P0^.Prev<>nil then P0^.Prev^.Next:=R;
          R^.Prev:=P0^.Prev; 
          P0^.Prev:=R;
    end
    else R^.Prev:=nil; 
    AddBefore:=R;
End;

это правильный вариант

Автор: Dower 2.4.2011, 19:48
Спасибо, а что эта функция делает и куда ее вставлять?

Автор: v4v4n 3.4.2011, 10:03
Эта функция вставляет перед элементом, на который указывает P0, новый элемент со значением D. И возвращает указатель на добавленный элемент списка.

А вставлять в программу, которая работает со списком.

Автор: Dower 4.4.2011, 18:08
А не поможете написать саму программу, а то никак не получается.

Автор: Dower 24.4.2011, 14:30
Так самому и не получилось дописать.
 Помогите кто знает как доделать.

Автор: v4v4n 25.4.2011, 16:06
Код

Type
      TData = integer;
      PElem =^TElem;
      TElem = record
          Data : TData;
          Next, Prev : PElem;
      end;
function AddBefore(D:TData;var P0:PElem):PElem;
var R:PElem;
Begin
    New(R); R^.Data:=D; R^.Next:=P0;
    if P0<>nil then begin
          R^.Prev:=P0^.Prev; 
          P0^.Prev:=R;
    end
    else R^.Prev:=nil; 
    AddBefore:=R;
End;
procedure DelAll(var E:PElem);
var Elem:PElem;
begin
    while E<>nil do begin
        Elem:=E^.Next;
        Dispose(E);
        E:=Elem;
    end;
end;
procedure List(E:PElem);
var Elem:PElem;
begin
    Elem:=E;
    while Elem<>nil do begin
        Write(Elem^.Data:4);
        Elem:=Elem^.Next;
    end;
    if E=nil then write('nil':4);
end;
var First : PElem;
      i : integer;
BEGIN
      First:=nil;
      for i:=1 to 10 do First:=AddBefore(random(90)+10,First);
      List(First);
      DelAll(First);
END.

Автор: Dower 25.4.2011, 16:13
Спасибо, но мне не совсем понятен принцип работы. при запуске программы на экран выводится строка 48 43 24 38 70 34 28 87 12 10 и ничего не происходит.

Автор: v4v4n 25.4.2011, 19:09
Но этот список формируется с помощью функции, которую требовалось создать в условии задачи.
Ну что бы было веселее, можно сделать в программе так:
Код

...
var First, P : PElem;
      i, k : integer;
      x : TData;
BEGIN
      First:=nil;
      for i:=1 to 10 do First:=AddBefore(random(90)+10,First);
      List(First);
      k:=0;
      While (k<1)or(k>10) do begin
               Write('номер элемента перед которым нужно вставить новый элемент '); readln(k);
               Write('значение нового элемента '); readln(x);
      end;
      P:=First; i:=1;
      While (i<>k) do begin
              P:=P^.Next; inc(i);
      end;
      P:=AddBefore(x,P);
      writeln('адрес нового элемента ',seg(P^),':',ofs(P^));
      List(First);
      DelAll(First);
END.

Автор: Dower 25.4.2011, 21:02
Теперь более понятно. Но вот в в 20 строке написано List(First), и программка не учитывая переменные k и x выводит на экран первоначальный список элементов без изменений. А если First заменить на P то выводится список уже с подставленным новым элементом, но элементы стоящие до него не выводятся, т.е последовательность чисел начинается сразу с нового элемента.
Как сделать что бы после подстановки выводился весь список целиком с добавленным элементом?

Автор: v4v4n 26.4.2011, 06:26
Согласен, есть ошибка. тут исправлено 
Код

function AddBefore(D:TData;var P0:PElem):PElem;
var R:PElem;
Begin
    New(R); R^.Data:=D; R^.Next:=P0;
    if P0<>nil then begin
          if P0^.Prev<>nil then P0^.Prev^.Next:=R;
          R^.Prev:=P0^.Prev; 
          P0^.Prev:=R;
    end
    else R^.Prev:=nil; 
    AddBefore:=R;
End;

Автор: Dower 26.4.2011, 06:41
Большое спасибо за помощь, теперь все работает.

Автор: deimond 26.4.2011, 07:59
У меня вопрос по теме, если нужно вставить после данного элемента списка новый элемент, что нужно изменить в функции?

Автор: v4v4n 26.4.2011, 10:27
deimond, http://forum.vingrad.ru/index.php?showtopic=327477&view=findpost&p=2335392

Автор: Dower 23.5.2011, 18:10
Возник еще один вопрос. Программа работает, но единственное не может вставить элемент перед первым элементом списка. Подскажите как это исправить?

Автор: Dower 26.5.2011, 08:22
АП____

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)