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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2017, 22:38   #1
Panchess
 
Регистрация: 15.03.2017
Сообщений: 5
По умолчанию После каждого элемента списка добавьте ту часть списка, которая была перед ним - Pascal ABC

Пусть дан список. После каждого элемента списка добавьте ту часть списка, которая была перед ним.
Panchess вне форума Ответить с цитированием
Старый 03.04.2017, 22:44   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И?

Покажите свои наработки, конкретные вопросы и т.п.

Или в раздел Фриланс если вы не хотите ничего делать, а ищете кого-то, кто выполнит ваши задачи за вознаграждение.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.04.2017, 19:08   #3
Panchess
 
Регистрация: 15.03.2017
Сообщений: 5
По умолчанию

И как теперь реализовать условие?
После каждого элемента списка добавьте ту часть списка, которая была перед ним.
Код:
Program Spisok;
Type
TData = integer;
TPElem = ^Telem;
TElem = record
Data: TData;
PNext: TPElem;
end;

TDList = record
Cnt : integer;
PFirst, PLast: TPElem;
end;

Procedure Add(var aList : TDList; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := PElem
  else
    aList.PLast^.PNext := PElem;
  aList.PLast := PElem;
  Inc(aList.Cnt);
end;

Procedure WorkAdd(var aList: TDList);
var
S: String;
Data: TData;
Code: Integer;
begin
repeat
Write('Element №', aList.Cnt + 1, ': ');
Readln(S);
if S <> '' then begin
Val(S, Data, Code);
if Code = 0 then
Add(aList, Data)
    end;
  until S = '.';
end;

Procedure LWriteln(var aList : TDList);
var
  PElem : TPElem;
  i : Integer;
begin
  PElem := aList.PFirst;
  i := 0;
  while PElem <> nil do begin
    Inc(i);
    if i > 1 then Write(', ');
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  if i = 0 then
    Writeln('Список пуст.')
  else
    Writeln;
end;

Var
  L : TDList;
  Data : TData;
 aPPrev : TPElem;
  Begin
  WorkAdd(L);
begin
        Writeln('Содержимое списка:');
        LWriteln(L);
        end;
          end.
Panchess вне форума Ответить с цитированием
Старый 07.04.2017, 11:48   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

задачка достаточно замороченная.
я бы решал её через создание НОВОГО списка, куда копировал (многократно) нужные элементы из исходного списка.

кстати, чтобы убедится в том, что мы оба одинаково понимаем условия задачи.

допустим, дан список:
1, 2, 3, 4, 5, 6, 7, 8

что должно быть в результате?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2017, 22:18   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Возможно, решение получится виде рекурсивной процедуры:
при погружении добраться до последнего элемента и там уже добавлять элементы.
потом снижение уровня - и новая порция.
Код:
program ProcessList;

type
  Tinf  = integer;
  PList = ^TList;

  TList = record
    Data: TInf;
    Next: PList;
  end;

  {Список}
  {Процедура добавления нового элемента в конец односвязного списка}
  procedure AddItem(var ARoot: PList; AData: TInf);
  var
    tmp: PList;
  begin
    if ARoot = nil then
    begin
      GetMem(ARoot, sizeof(TList));
      tmp := ARoot;
    end
    else
    begin
      tmp := ARoot;
      while tmp^.Next <> nil do
        tmp := tmp^.Next;
      GetMem(tmp^.Next, sizeof(TList));
      tmp := tmp^.Next;
    end;
    tmp^.Next := nil;
    tmp^.Data := AData;
  end;

  {процедура печати списка}
  procedure Print(ARoot: PList);
  begin
    Write('< ');
    if ARoot = nil then
    begin
      WriteLn('Список пуст.');
      exit;
    end;
    while ARoot <> nil do
    begin
      Write(ARoot^.Data, ' ');
      ARoot := ARoot^.Next;
    end;
    writeln('>');
  end;

  {процедура освобождения памяти списка}
  procedure FreeList(var ARoot: PList);
  var
    tmp: PList;
  begin
    while ARoot <> nil do
    begin
      tmp := ARoot;
      ARoot := ARoot^.Next;
      FreeMem(tmp, sizeof(TList));
    end;
  end;

  procedure Process(var ARoot: PList);

    procedure Recurse(Item: PList);
    var
      SrcItem, DstItem, NextItem: PList;
    begin
      if Item^.Next <> nil then
        Recurse(Item^.Next);
      DstItem  := Item;
      NextItem := Item^.Next;
      Item^.Next := nil;
      SrcItem  := ARoot;
      while SrcItem <> Item do
      begin
        AddItem(DstItem, SrcItem^.Data);
        DstItem := DstItem^.Next;
        SrcItem := SrcItem^.Next;
      end;
      DstItem^.Next := NextItem;
    end;

  begin
    if ARoot <> nil then
      Recurse(ARoot);
  end;

var
  i: integer;
  List: PList;
begin

  List := nil;
  for i := 1 to 5 do
    AddItem(List, i);

  WriteLn('Incoming list:');
  Print(List);

  Process(List);

  WriteLn('Processed list:');
  Print(List);

  FreeList(List);
end.
Результат прогона
Код:
Incoming list:
< 1 2 3 4 5 >
Processed list:
< 1 2 1 3 1 2 4 1 2 3 5 1 2 3 4 >

Последний раз редактировалось FPaul; 09.04.2017 в 08:36.
FPaul вне форума Ответить с цитированием
Старый 09.04.2017, 05:00   #6
DVladimir
Пользователь
 
Регистрация: 29.12.2015
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
допустим, дан список:
1, 2, 3, 4, 5, 6, 7, 8
получится 1,2,1,2,1,2,1
DVladimir вне форума Ответить с цитированием
Старый 10.04.2017, 11:12   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от DVladimir Посмотреть сообщение
получится 1,2,1,2,1,2,1
это с чего бы вдруг?!!

да и вопрос уже не актуален,
уже выше выложено готовое решение (с) FPaul.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если встречается нечетный элемент, то перед ним и после него вставить новые элементы со значением 0 (C++) yurets17 Помощь студентам 2 04.03.2014 18:12
Составить программу, которая формирует 2 списка, и написать процедуру присоединения 2го списка к 1му Neitrosha Помощь студентам 7 25.02.2011 21:18
Удаление последнего элемента из списка и реверс этого списка. Goose Общие вопросы C/C++ 8 16.05.2010 16:12
Дескрипторы потоков - Для каждого элемента списка необходимо создать поток, выполняющий требуемые функции kdv0403 Общие вопросы Delphi 2 09.06.2007 11:12