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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2013, 22:59   #1
Lizoveta
Пользователь
 
Регистрация: 22.06.2013
Сообщений: 44
По умолчанию Паскаль, однонаправленные списки

Добрый вечер. Помогите, пожалуйста, хотя бы с частью из подпрограмм.
Для списка, приведённого ниже, надо написать подпрограммы, которые:
a) разворачивает список в обратном порядке за один проход по списку
б) подсчитывает число элементов списка, которые больше предыдущего, но меньше следующего
в) проверяет, есть ли а списке хотя бы два одинаковых элемента;
г) из каждой группы подряд идущих элементов списка оставляет только один
д) порождает из списков А и В список С, который состоит из элементов, которые содержатся только в А или только в B.

Вот само задание..Хотелось бы хоть как-то разобраться со списками..Пока это плохо получается. Вот все заготовки, какие у меня есть:
Код:
uses crt;
type plistelement=^listelement;              {описание списка}
     listelement=record
        hislo: integer;
        next:plistelement;
     end;
var pbegin,p: plistelement;
    n,x,i,k,s: integer;
    sred: real;


procedure printlist;                  {просмотр всех элементов списка}
var p: plistelement;
begin
     p:=pbegin;
     while p<>nil do
     begin
          writeln(p^.hislo);
          p:=p^.next;
     end;
end;
                                   {добавление элемента в список}
procedure putlist (chto: integer; kuda: plistelement);
var p: plistelement;
begin
     if kuda=nil then
     begin
          new(p);
          p^.next:=pbegin;
          pbegin:=p;
          p^.hislo:=chto;
     end
     else
     begin
     new(p);
     p^.next:=kuda^.next;
     kuda^.next:=p;
     p^.hislo:=chto;
     end;
end;
                                              {удаление элемента из списка}
procedure removefromlist (gde : plistelement);
var p: plistelement;
begin
     if gde=nil then
     begin
          p:=pbegin;
          pbegin:=p^.next;
          dispose(p);
     end
     else
     begin
          p:=gde^.next;
          gde^.next:=p^.next;
          dispose(p);
     end;
end;

begin                                    {тело программы}
clrscr;
pbegin:=nil;
n:=random(11)+10;        {случайным образом выясним кол-во чисел}
       for i:=1 to n do
           begin
                x:=random(100);     {рандомно заполняем и сами числа}
                putlist(x,p);       {вызов процедуры добавления в список}
                p:=p^.next;
           end;
end.
Заранее спасибо за любую помощь! Буду очень благодарна..
Lizoveta вне форума Ответить с цитированием
Старый 07.08.2013, 19:32   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Код:
 {добавление элемента в список}
procedure putlist (chto: integer; var kuda: plistelement);
var tmpList: plistelement;
begin
     if kuda=nil then
     begin
          new(kuda);
          tmpList := kuda;
     end
     else
     begin
       tmpList := kuda;
       while tmpList^.next <> nil do tmpList := tmpList^.next;
       new(tmpList^.next);
       tmpList := tmpList^.next;
     end;
     tmpList^.next := nil;
      tmpList^.hislo := chto;
end;

 {удаление элемента из списка по номеру позиции}
procedure removefromlist (var list : plistelement; elemNumber : Integer);
var
  tmpList1, tmpList2 : plistelement;
  number : Integer;
begin
   tmpList1 := list;
   number := 1;
   if tmpList1 <> nil then
   Begin
     while (number < elemNumber) and (tmpList1 <> nil ) do
     Begin
      Inc(number);
      tmpList1 := tmpList1^.next;
     End;

     tmpList2 := tmpList1;
     tmpList1 := list;
     if (tmpList2 <> nil) then
     Begin
       if (tmpList2 = list) then
       Begin
         list :=tmpList2^.next;
         Dispose(tmpList2);
       End
       else
       Begin
         while (tmpList1^.next <> tmpList2) do tmpList1 := tmpList1^.next;
         tmpList1^.next := tmpList2^.next;
         Dispose(tmplist2)
       End;
     End;
   End;
end;

{ проверка, есть ли в списке хотя бы два одинаковых элемента;}
function SearchAlikeElement(list : plistelement):Boolean;
Var
  tmpList1, tmpList2 : plistelement;
Begin
  tmpList1 := list;
  while (tmpList1 <> nil) do
  Begin
    tmpList2 := tmpList1^.next;
    if (tmpList2 <> nil) then
    Begin
      while (tmpList2 <> nil) do
      Begin
         if (tmpList1^.hislo = tmpList2^.hislo) then
         Begin
           SearchAlikeElement := true;
           Exit
         End;
        tmpList2 := tmpList2^.next;
      End;
    End;
    tmpList1 := tmpList1^.next;
  End;
  SearchAlikeElement := false;
End;

{из каждой группы подряд идущих элементов списка оставляет только один}
procedure DeleteRepeatElementInList( var list : plistelement);
Var
  tmpList, tmpList2 : plistElement;
  number_pos, tmpValue : Integer;
Begin
  tmpList := list;
   number_pos := 1;
  while (tmpList <> nil) do
  Begin
    tmpValue := tmpList^.hislo;
    tmpList2 := tmpList^.next;

    while (tmpList2 <> nil) and (tmpList2^.hislo = tmpValue) do
    Begin
      Inc(number_pos);
      Removefromlist(tmpList, number_pos);
      dec(number_pos);
      tmpList2 := tmpList2^.next;
    End;
    tmpList := tmpList^.next
  End;
End;
P.s. Не стоит давать локальным(использующиеся подпрограммах) и глобальным переменным одни и те же имена.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 10.08.2013, 19:05   #3
Lizoveta
Пользователь
 
Регистрация: 22.06.2013
Сообщений: 44
По умолчанию

Большое Спасибо
Lizoveta вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однонаправленные списки (паскаль) Татьана Помощь студентам 2 23.12.2012 12:21
Однонаправленные списки. tema654 Общие вопросы C/C++ 3 29.12.2011 14:49
паскаль. Динамические данные. Однонаправленные списки. Антон Лысенко Помощь студентам 2 21.12.2010 20:01
Однонаправленные списки в си Марсель059 C++ Builder 18 27.11.2009 13:16