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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2012, 01:39   #1
LowerDeez
 
Регистрация: 03.12.2012
Сообщений: 5
По умолчанию Pascal. Односвязные списки

Моя задача стоит так: Необходимо в списке L, состоящем из n элементов, кол-во которых заранее неизвестно, оставить лишь те эл., которые входят в него по одному разу.
С односвязными списками, до этого, дела не имел вообще, по этому все туманно. После поисков по форуму, как создавать список и заполнять его, вроде бы как немного разобрался, а вот с решением своей задачи вообще туго.
Прошу помочь разобраться, как это можно реализовать хоть приблизительно.
LowerDeez вне форума Ответить с цитированием
Старый 04.12.2012, 08:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
поисков по форуму, как создавать список и заполнять его, вроде бы как немного разобрался
ну, это уже, считай, полдела сделано.

Ещё напишите процедуру(или функцию, это не принципиально) удаления ЛЮБОГО элемента из списка. Написать её так, чтобы она удаляла в цикле все элементы, значение которых совпадает с переданным параметром:
DeleteAllElementWithValue( ЗначениеЭлемента)

Ещё напишите функцию (удобнее), которая возвращает количество элементов с заданным значением (подсчитывает количество).

Всё. это 99.9% задачи. дальше всё совсем просто.
цикл по всем элементам списка (от головы). Раз у Вас есть вывод элементов списка - значит цикл перебора у Вас уже тоже есть.
внутри цикла if CountValue(ТекущееЗначениеЭлемента) > 1 тогда удалить все элементы из списка, имеющие данное значение: DeleteAllElementWithValue( ТекущееЗначениеЭлемента)

профит.

ну, если будут затруднениия, приводите тут на форуме свои наработки полностью, пишите, в чём у Вас конкретно возникли затруднения...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.12.2012, 14:02   #3
LowerDeez
 
Регистрация: 03.12.2012
Сообщений: 5
По умолчанию

Код:
procedure del(ind:integer; var L:plist);
var x,dx:plist;
begin
x:=l;
while x<>nil do
if x^.a=ind then 
begin
if x=l then 
begin
l:=l^.next; 
dispose(x);
x:=l;
end else 
begin
dx^.next:=x^.Next; 
dispose(x);
x:=dx^.Next; 
end;
end 
else 
begin 
dx:=x;
x:=x^.Next; 
end; 
end;
Вот примерная процедура удаления элемента из массива. Суть её действия такова. Если, допустим, ввести список из элементов: 2 4 3 3 8 4 9 3, то она при вводе, например параметра 3, удалит все тройки из списка, и в рез-те получится: 2 4 8 4 9. Это то? или её нужно как то переделать?
По поводу подсчета элементов пока туго соображается, как это сделать с указателями и в списке(( с массивами попроще)
LowerDeez вне форума Ответить с цитированием
Старый 04.12.2012, 15:55   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Если, допустим, ввести список из элементов: 2 4 3 3 8 4 9 3, то она при вводе, например параметра 3, удалит все тройки из списка
Вы же своё задание поняли?
Да, именно это Вам и нужно, удалить из списка все элементы, которые в нём встречаются более одного раза.

саму процедуру я не проверял. Выглядит работоспобной. Но не мешало бы потестировать..

Цитата:
По поводу подсчета элементов пока туго соображается, как это сделать с указателями и в списке(( с массивами попроще)
Если у Вас есть код, который выводит список на экран, то взять его за основу и допилить подсчёт заданного элемента - элементарно!

да и вообще, цикл перебора списка используется при обработке элементов списка повсеместно. В той же процедуре удаления, например!

берём перебор из процедуры del
и получаем функцию:
Код:
function CountValue(ind:integer; L:plist) : integer;
var x : plist;
  Count : integer;
begin
  Count := 0;
  x:=l;
  while x<>nil do
     if x^.a=ind then Inc(Count); 
     x:=dx^.Next; 
  end;
  CountValue := Count
end;
что здесь сложного то?!


если остались вопросы, то давайте Ваш код целиком - посмотрим, что у вас не получается..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.12.2012, 21:22   #5
LowerDeez
 
Регистрация: 03.12.2012
Сообщений: 5
По умолчанию

Код:
uses
  crt;
 
type
  PList = ^TList;
  TList = record
    a: integer;
    pred, next: PList;
  end;
 
var
  head: PList;
  n, d, i: integer;

{Формирование списка}
procedure formlist(var head: plist; dob: integer);
var
  kur: plist;
begin
  new(kur);
  kur^.next := head;
  kur^.a := dob;
  head := kur;
end;
 
{Вывод списка на экран}
procedure printList(first: plist);
begin
  if first = nil then writeln('В списке нет элементов')
  else
  begin
    while first <> nil do
    begin
      write(first^.a:3);
      first := first^.next;
    end;
  end;
end;{PrintList}

procedure del(ind:integer; var L:plist);
var x,dx:plist;
begin
x:=l;
while x<>nil do
if x^.a=ind then begin
if x=l then begin
l:=l^.next; dispose(x);
x:=l;
end else begin
dx^.next:=x^.Next; dispose(x);
x:=dx^.Next; end;
end else begin dx:=x;
x:=x^.Next; end; end;

procedure delet (i:integer; var l:plist);
begin
l^.next:=l^.next^.next
end;

function CountValue(ind:integer; L:plist) : integer;
var x,dx : plist;
  Count : integer;
begin
  Count := 0;
  x:=l;
  while x<>nil do begin
     if x^.a=ind then Inc(Count);
     x:=dx^.Next;
  end;
  CountValue := Count
end;

begin
clrscr;
writeln('Введите количество элементов списка');
  readln(n);
 for i := 1 to n do
  begin
    d := random(10);
    FormList(head, d);
  end;
  writeln('Исходный список:');
  PrintList(head);
 if countvalue(i,head) > 1 then del(i,head);
printlist(head);
  readln;
end.
Вот вся программа, получается, но у меня не хочет выводить результирующий список((((( Где я тут натупил и ошибся?)
И когда первоначальный список выводится, он тоже какой то странный, каждый раз выводятся один и тот же список, если кол-во элементов не менять в нем, и при любом количестве всегда в конце 0 0.
LowerDeez вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] Односвязные списки acmilanfan Помощь студентам 0 17.05.2012 23:22
Односвязные списки. Killspamers Помощь студентам 7 19.03.2012 18:59
Односвязные списки Nike0 Общие вопросы C/C++ 0 26.12.2010 12:07
Односвязные списки Anna T Паскаль, Turbo Pascal, PascalABC.NET 2 19.12.2010 18:58
Односвязные списки art_stalker Общие вопросы C/C++ 5 21.04.2010 22:49