Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 10:41   #1
deimond
 
Регистрация: 03.05.2011
Сообщений: 8
По умолчанию Turbo Pascal Добавление в очередь

Помогите с написанием задачки.
Дано число D и указатели P1 и P2 на начало и конец очереди (если очередь является пустой, то P1 = P2 = nil). Добавить элемент со значением D в конец очереди и вывести новые адреса начала и конца очереди.
Мне подсказали, что процедура будет выглядеть так
Код:
procedure Add2End(D:TData; var P1,P2:PElem);
var NewElem:PElem;
Begin
      new(NewElem);
      NewElem^.Data:=D; 
      NewElem^.Next:=nil; 
      if P1=nil then P1:=NewElem else P2^.Next:=NewElem;
      P2:=NewElem;
End;
Правильно написано? Что в теле основной программы писать?
Объявление по ходу будет таким
Код:
Type
      TData = integer;
      PElem =^TElem;
      TElem = record
          Data : TData;
          Next : PElem;
      end;
deimond вне форума Ответить с цитированием
Старый 03.05.2011, 11:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
procedure Add2End(D:TData; var P1,P2:PElem);
в Паскале не проверял, но лично я ошибок в коде не вижу.
теоретически возможна ситуация, когда P1 не равна nil, а P2 - равна nil.
Но в нормальной программе этой ситуации быть НЕ МОЖЕТ! Т.е. если только программист написал коряво иницилизацию очереди или принудительно обнулил переменную P2... Поэтому, проверку на P2=nil можно НЕ ДОБАВЛЯТЬ!
А в остальном, всё хорошо.

вызывать очень просто:
....
var MyDD : TData;
Head, Tail : PElem;
....
Head := nil;

MyDD := 100; {значение}
Add2End(MyDD, Head, Tail);
....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2011, 11:48   #3
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

у вас все верно, нужно еще глобальные переменные объявить, где будете хранить начало и конец очереди (например begQ,endQ:PElem)

в основном коде сначала обнуляете указатели начала и конца (begQ:=nil; endQ:=nil)
потом добавляете нужные элементы в конец этой процедурой (там как вам удобно, либо рандомом, либо руучками), процедуру вызывать так Add2End(число,begQ,endQ)
ну а адреса собственно хранятся в этих самых begQ и endQ, вот только как их выводить - не помню точно, вроде достаточно простого write(begQ)
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 22.05.2011, 22:41   #4
deimond
 
Регистрация: 03.05.2011
Сообщений: 8
По умолчанию

Запутался в основной программе. Не могу разобраться как вывести в итоге очередь результирующую.
Код:
Uses crt;
Type
      TData = integer;
      PElem =^TElem;
      TElem = record
          Data : TData;
          Next : PElem;
      end;

function Add2End(D:TData; var P1,P2:PElem):PElem;
var NewElem:PElem;
Begin
      new(NewElem);
      NewElem^.Data:=D;
      NewElem^.Next:=nil;
      if P1=nil then P1:=NewElem else P2^.Next:=NewElem;
      P2:=NewElem;
      Add2End:=P2;
End;

function AddAfter(x:TData;var E:PElem):PElem;
var NewElem : PElem;
begin
    new(NewElem);
    NewElem^.Data:=x;
    if E<>nil then begin
       NewElem^.Next:=E^.Next;
       E^.Next:=NewElem;
    end else NewElem^.Next:=nil;
    AddAfter:=NewElem;
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   P, P1, P2 : PElem;
      i : integer;
      D : TData;
BEGIN
      clrscr;
      randomize;
      P1:=nil; P2:=nil;
      for i:=1 to 10 do begin
         P1:=AddAfter(random(90)+10,P1);
         if P2=nil then P2:=P1;
      end;
      List(P2);

      Writeln;
      Write('znachenie elementa '); readln(D);
      P2:=P1;
      P:=Add2End(D,P1,P2);

      writeln('adres nachala ocheredi ',seg(P1^),':',ofs(P1^));
      writeln('adres konca ocheredi ',seg(P2^),':',ofs(P2^));

      List(P1);
      DelAll(P1);
      Readln;
END.
Как правильно заполнить очередь? Использовал функцию AddAfter, может в этом проблема?
deimond вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Turbo pascal! Scredis Помощь студентам 0 18.01.2011 23:54
Turbo Pascal Demenz Помощь студентам 3 27.05.2010 09:08
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28