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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2013, 16:20   #1
dima1257
Пользователь
 
Аватар для dima1257
 
Регистрация: 16.11.2012
Сообщений: 66
По умолчанию Вывести только повторяющиеся элементы односвязного списка.

Задача такая: В файл записывается последовательность целых чисел. Создается линейный список из считанной последовательности. Из исходного списка создать список всех одинаковых элементов списка. Вывести исходный список и список выбранных элементов на экран.

то есть если есть последовательность
Код:
1  1  7  4  7  5  5  8
в результате должно получиться
Код:
1 1 7 7 5 5
Код:
program lab_6;
uses crt;
const max_n=100;
type ptr=^din;
     din=record
     inf:integer;
     link:ptr;
     end;
var f:file of integer;
    n,i,k,tx:integer;
    x:byte;
    povtor:integer;
    p,p1,p2,head,pt1,pt2:ptr;

procedure sozd;
begin
     assign(f,'file.int');
     rewrite(F);
     writeln('Vvedi kol n:');
     readln(n);
     randomize;
     for i:=1 to n do
     begin
          k:= random(10);
          //read(k);
          write(f,k);
     end;
     close(f);
     writeln('Soderjimoe faila:');
     reset(f);
     while not eof(f) do
     begin
          read(f, k);
          write(k, ' ');
     end;
     close(f);
     writeln;
end;

procedure spisok;
begin
     writeln('Ishodniy spisok:');
     assign(f,'file.int');
     reset(f);
     i:=1;
     while not eof(f) do
     begin
          if i=1 then
          begin

             new(p);
             read(f,tx);
             p^.link:=nil;
             p^.inf:=tx;
             head:=p;
             p1:=p;
             i:=i+1;
          end
          else
          begin
               new(p);
               read(f,tx);
               p^.link:=nil;
               p^.inf:=tx;
               p1^.link:=p;
               p1:=p;
               i:=i+1;
          end;
     end;
     close(f);
end;

procedure sort;
begin
     p:=head;
     while p <> nil do
     begin
          write(p^.inf, ' ');
          p:=p^.link;
     end;
     writeln;
     writeln('Povtoryaushiesya elementi:');
     
     
     for x:=1 to n do

     begin
     p:=head;
     povtor:= p^.inf;
          if x <> 1 then
          for i:= 1 to x - 1  do
          begin
               p:= p^.link;
               povtor:= p^.inf;
          end;
          
          writeln('X:',x);
          povtor:=p^.inf; 
          while p <> nil do 
          begin
               if p^.inf = povtor then
               begin
                    writeln('Povtor = ', povtor);
               end;

               p:=p^.link;
          end;
     end;

end;

begin
     sozd;
     spisok;
     sort;
end.

Не получается вывести только повторяющиеся элементы. подскажите пожалуйста как это сделать или ссылку если есть.
Выдержка из правил форума: Не стоит отправлять в поиск, не хотите отвечать пройдите мимо. Хотите помочь, пишите конкретный ответ.
dima1257 вне форума Ответить с цитированием
Старый 28.12.2013, 00:30   #2
dima1257
Пользователь
 
Аватар для dima1257
 
Регистрация: 16.11.2012
Сообщений: 66
По умолчанию

Задачу сам решил.

вот кому интересно.
Код:
program lab_6;
uses crt;
const max_n=100;
type ptr=^din;
     din=record
     inf:integer;
     bil:boolean;
     link:ptr;
     end;
var f:file of integer;
    n,i,k,tx:integer;
    x:byte;
    povtor:integer;
    p,p1,p2,head,pt1,pt2:ptr;

procedure sozd;
begin
     assign(f,'file.int');
     rewrite(F);
     writeln('Vvedi kol n:');
     readln(n);
     randomize;
     for i:=1 to n do
     begin
          k:= random(10);
          //read(k);
          write(f,k);
     end;
     close(f);
     writeln('Soderjimoe faila:');
     reset(f);
     while not eof(f) do
     begin
          read(f, k);
          write(k, ' ');
     end;
     close(f);
     writeln;
end;

procedure spisok;
begin
     writeln('Ishodniy spisok:');
     assign(f,'file.int');
     reset(f);
     i:=1;
     while not eof(f) do
     begin
          if i=1 then
          begin

             new(p);
             read(f,tx);
             p^.link:=nil;
             p^.inf:=tx;
             p^.bil:= false;
             head:=p;
             p1:=p;
             i:=i+1;
          end
          else
          begin
               new(p);
               read(f,tx);
               p^.link:=nil;
               p^.inf:=tx;
               p^.bil:= false;
               p1^.link:=p;
               p1:=p;
               i:=i+1;
          end;
     end;
     close(f);
end;

procedure sort;
begin
     p:=head;
     while p <> nil do
     begin
          write(p^.inf, ' ');
          p:=p^.link;
     end;
     writeln;
     writeln('Povtoryaushiesya elementi:');
     
     p:=head; // встать в начало списка
     for i:= 1 to n do
     begin
          write(p^.inf, '---');
          
          p1:= head;
          for k:= 1 to n - 1 do
          begin
               write(p1^.inf, ' ');
               
               if k = i then
                  p1:= p1^.link;

               if p^.inf = p1^.inf then
               begin
                    p^.bil:= true;
               end;
               
               p1:= p1^.link;
          end;
          writeln;
          p:= p^.link;
     end;
     
     writeln;
     p:= head;
     while p <> nil do
     begin
          write('elem = ', p^.inf, ' ');
          write('bil = ', p^.bil);
          writeln;
          p:= p^.link;
     end;
     
     p:= head;
     while p <> nil do
     begin
          if p^.bil = true then
          begin
               write(p^.inf, ' ');
          end;
          p:= p^.link;
     end;
end;

begin
     sozd;
     spisok;
     sort;
end.
допустим дан список
Код:
1  5  4  5  7
Решено это при помощи буленовской переменной. Каждый элемент списка сравнивается со всем списком кроме своей позиции. Например берем первый элемент это 1. Сравниваем со всем списком кроме своей позиции, не находим повтора и соответственно по умолчанию логическая часть этого элемента остается false.

Берем второй элемент и сравниваем его со всем списком кроме своей позиции. Находим такой же элемент на 4й позиции и ставим логическую часть 4го элемента равной true.

С 3им элементом также как и с первым.

Берем 4й элемент и сравниваем его со всей последовательностью. Находим повтор во второй позиции и ставим логическую часть 2го элемента равной true.

C 5м элементом всё точно так же как с 1 и 3.
в результате получаем такое содержимое списка
Код:
1 false
5 true
4 false
5 true
7 false
И при помощи вот этого куска кода выводим только те элементы у которых логическая часть равна true.
Код:
 p:= head;
     while p <> nil do
     begin
          if p^.bil = true then
          begin
               write(p^.inf, ' ');
          end;
          p:= p^.link;
     end;
Список будет не сортирован, но это уже кому надо сделает.
Выдержка из правил форума: Не стоит отправлять в поиск, не хотите отвечать пройдите мимо. Хотите помочь, пишите конкретный ответ.
dima1257 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать новый массив, содержащий повторяющиеся элементы массива A. Элементы в новом массиве не повторяются(Pascal) mad_putin Помощь студентам 0 13.12.2012 00:09
Сортировка односвязного списка (C++) biograf Помощь студентам 0 14.12.2010 21:21
Вывести только одну категорию вместо списка категорий goofman PHP 3 18.05.2010 18:34
Сортировка односвязного списка amerhant Общие вопросы C/C++ 1 13.05.2010 20:25
Сортировка односвязного списка btf Общие вопросы C/C++ 0 15.02.2010 14:40