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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 18:41   #1
Keyx
Новичок
Джуниор
 
Регистрация: 29.06.2010
Сообщений: 2
Печаль Pascal связаные списки

Доброго времени суток! Заранее извиняюсь если такая тема есть, я её найти не смог. Не могу решить задачу:


Создать два связанных списка, содержащих целые числа. Выдать их содержимое на экран. За-тем объединить два списка в один и его содержимое тоже выдать на экран.


Вроде как задачка простая но с паскалем я никогда дела не имел...
Keyx вне форума Ответить с цитированием
Старый 29.06.2010, 21:09   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

скину работу со списками, разберешься если будут вопросы пиши:
Код:
program spisok;
type PList=^TList;

  TList=record
    inf:integer;
    prior:Plist;
    next:Plist
  end;

  ListCont=object first,last:PList;
    constructor Init;
    function Empty:boolean; //функция проверки существования списка
    procedure Insert(x:integer); //процедура всавки элементов в конец списка
    procedure Print_forward(start:PList); //процедура печати списка от первого
    procedure Print_back(start:PList);  //процедура печати списка от последнего
    procedure Remove(var start:PList);  //процедура удаления списка
    function GetById(i:integer):PList;  //получение указателя по индексу
    function GetByValue(x:integer):PList; //получение указателя по значению
    function GetNextByValue(P:Plist):Plist;   //получение значения следующего за текущим
    procedure RemoveAll(var start:PList;x:integer); //процедура удаления элементов по значению
    procedure Swap(i,j:integer);  //процедура обмена элементов
    procedure BubbleSort; //сортировка пузырьком
    procedure QuickSort(l:integer;r:integer);   //быстрая сортировка
    function Exist(P:Plist):boolean;  //проверка входит ли элемент в список
    function countElement(start:Plist):integer; //количество элементов
    function GetNext(P:Plist):Plist;
  end;

constructor ListCont.Init;  //инициализация списка
begin
  first:=nil; last:=nil;
end;

function ListCont.countElement(start:Plist):integer;  //подсчет количества элементов
var
  temp:integer;
begin
  temp:=0;
  while(start<>nil) do
  begin
    inc(temp);
    start:=start^.next;
  end;
  countElement:=temp;
end;


function ListCont.GetNextByValue(P:Plist):Plist;  
Var S:PList;
    i:integer;
begin
   if (Exist(P)) then
   begin
      if p=last then GetNextByValue:=nil
      else
      begin
        s:=p^.next;
        GetNextByValue:=S;
      end;
    end
   else GetNextByValue:=nil;
end;


function ListCont.Exist(P:Plist):boolean;
var
  start:PList;
  flag:boolean;
begin
  flag:=false;
  start:=first;
  while ((start<>nil) and (flag=false)) do
  begin
    if start=p then flag:=true
    else start:=start^.next;
  end;
end;


function ListCont.Empty:boolean;  //процедура проверки наличия списка
begin
  Empty:=(last=nil) and (first=nil);
end;

procedure ListCont.QuickSort(l:integer;r:integer);   //быстрая сортировка
var
  i,j:integer;
  X:Plist;
begin
   i:=l;
   j:=r;
   x:=GetByid((l+r) div 2);
   repeat
      while (GetById(i)^.inf<x^.inf) do inc(i);
      while (GetById(j)^.inf>x^.inf) do dec(j);
      if (i<=j) then
      begin
        Swap(i,j);
        inc(i);
        dec(j);
      end;
   until (i>j);
   if j>l then QuickSort(l,j);
   if r>i then QuickSort(i,r);
end;

procedure ListCont.BubbleSort;   //пузырьковая сортировка
var
  p,q:PList;
  i,j,n:integer;
begin
  n:=countElement(first);
  for i:=2 to n do
  begin
    for j:=n downto i do
    begin
      p:=GetById(j-1);
      q:=GetById(j);
      if p^.inf<q^.inf then
      begin
        swap(j,j-1);
      end;
    end;
  end;
    
end;
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 29.06.2010, 21:10   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
procedure ListCont.Insert(x:integer); //процедура всавки элементов в конец списка(информационная часть)
var
  p:PList;
begin
  new(p);
  p^.inf:=x;
  p^.next:=nil;
  if Empty then
  begin
    first:=p;
    first^.prior:=nil;
  end
  else
  begin
    last^.next:=p;
    p^.prior:=last;
  end;
  last:=p;
end;

procedure ListCont.Remove(var start:PList);  //процедура удаления списка
var
  q:Plist;
begin
  if Exist(start) then
  begin
  if start=nil then writeln('List not init')
  else
  begin
    while start<>nil do
    begin
      q:=start;
      start:=start^.next;
      dispose(q);
    end;
  end;
  end
  else writeln('ne tot spisok');
end;

procedure ListCont.Print_forward(start:PList); //процедра печати элементов с первого(начало)
begin
 if start=nil then writeln('List not init')
 else
 begin
 while (start<>nil) do
  begin
   write(start^.inf,' ');
   start:=start^.next;
  end;
 end;
end;

procedure ListCont.Print_back(start:PList); //процедра печати элементов с последнего(начало)
begin
  if start=nil then writeln('List not init')
  else
  begin
    while (start<>nil) do
    begin
      write(start^.inf,' ');
      start:=start^.prior;
    end;
  end;
end;


function ListCont.GetById(i:integer):PList;  //получение указателя по индексу(индекс)
var
  p:PList;
  j:integer;
begin
  p:=first;
  j:=1;
  while ((p<>nil) and (j<>i)) do
  begin
    p:=p^.next;
    inc(j);
  end;
  if p=nil then GetById:=nil
  else if j=i then GetById:=p;
end;

function ListCont.GetByValue(x:integer):PList; //получение указателя по значению(инофрмационное поле)
var
  p:PList;
begin
  p:=first;
  while ((p<>nil) and (p^.inf<>x)) do
  begin
    p:=p^.next;
  end;
  if p=nil then GetByValue:=nil
  else if p^.inf=x then GetByValue:=p;
end;



procedure ListCont.RemoveAll(var start:PList;x:integer);  //процедру удления элементов больших по значению(информационное поле)
//если такого значения инф поля нет то список оставлять таким?
var
  p,q,t:PList;
begin
  p:=first;
  t:=GetByValue(x);
  if t=nil then writeln('element not find')
  else
  begin
    while (p<>nil) do
    begin
      if p^.inf > x then   //косяк
      begin //нашли нужные значения
        if p = first then
        begin //если удаляем первый элемент
          first := p^.next; //то редактируем указатель начала
          first^.prior := nil;
          //удалить
        end
        else
        if p^.next = nil then p^.prior^.next := nil
        else//если последний, то редактируем предпоследний
        begin //если где-то в середине
          p^.prior^.next := p^.next;//редактируем
          p^.next^.prior := p^.prior;//соседнии элементы
        end;
        q := p; //указатель на удаляемый элемент
        p := p^.next;
        dispose(q);//удаляем
        continue
    end;
    p:=p^.next;
  end;
  end;
end;


procedure ListCont.Swap(i,j:integer);  //процедура обмена элементов
var
  p,q,t:PList;
begin
  p:=ListCont.GetById(i);
  q:=ListCont.GetById(j);
  if ((p<>nil) and (q<>nil)) then
  begin
    new(t);
    t^.inf:=p^.inf;
    p^.inf:=q^.inf;
    q^.inf:=t^.inf;
  end
  else writeln('element not find')
end;


function ListCont.GetNext(P:Plist):Plist;   //получение значения следующего за текущим
var
  max,x,q,start:PList;
  flag:boolean;
begin
  flag:=false;
  writeln('element ',p^.inf);
  new(max);
  max^.inf:=32767;
  start:=first;
  while (start<>nil) do
  begin
    if start^.inf>p^.inf then
    begin
      if ((start^.inf<max^.inf) and (start^.inf<>p^.inf)) then
      begin
        max:=start;
        flag:=true;
      end;

    end;
    start:=start^.next;
  end;
  if flag=false then GetNext:=nil
  else GetNext:=max;
end;
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 30.06.2010, 09:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Помимо этого по поводу внесения и создания списков вот еще тема:http://www.programmersforum.ru/showthread.php?t=87357
И таких тем много тут обсуждалось.
Ну а само объединение - это пройтись по списку потом по второму, создать новый на его основе.
Примеры процедур проходя Sparky не дала так что по той ссылке что я выкладываю это процедура outt.
Вот там применяется один цикл, а ты допиши второй внизу и в этих циклах не вывод а добавление в новый список.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подпрограммы и связаные структуры данных на С++ psihadelic Помощь студентам 6 14.01.2010 22:57
Процессы, связаные с терминалом (С/С++) tisha077 Общие вопросы C/C++ 0 07.01.2010 17:43
Процессы, связаные с терминалом (С/С++) tisha077 Помощь студентам 0 07.01.2010 17:22