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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2009, 12:48   #1
tgig
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 10
По умолчанию Динамические списки

Ребята, помогите пжлста! Мне нужно написать подпрограмму чтобы она умела проверять есть ли в списке хотя бы два одинаковых элемента..Я тут что-то выискала, соединила но как массив впихнуть не знаю((( еще процедуры вставки элемента в начало списка и удаления всех отрицательных элементов из списка!!! Заранее спасибо...

type link=^rec;
rec=record
inf:integer;
next:link;
end;
var start,p,q:link;
ch:char;
procedure sozd;
begin
start:=nil;
end;
procedure dob;
begin
start:=nil;
repeat
new(p);
write('vvedite zha4enie:');
readln(p^.inf);
p^.next:=start;
start:=p;
writeln('else?');
readln(ch);
until ch='n';
writeln ('spisok sozdan');
end;
procedure prosmotr;
begin
p:=start;
while p<>nil do
begin
write(p^.inf);
p:=p^.next;
end;
writeln('spisok nape4atan');
end;
procedure delete_otr(var t:link);
var n:link;
begin
if t<>nil then
begin
p:=t;
while p^.next<>nil do
begin
if p^.next^.inf<0 then
begin
n:=p^.next;
p^.next:=p^.next^.next;
dispose(n);
end
else p:=p^.next;
end;
end;
end;
procedure dva_odin;
var k,i,j,n:integer;

begin
k:=0;
for i:=1 to (n-1) do
for j:=2 to n do
begin
if a[i]=a[j] then k:=k+1;
if k=2 then
begin
write('da');
exit;
end;
end;
if k<2 then write('Net');
readln;
end;
begin
repeat
writeln('1 - sozdat spisok');
writeln('2 - dobavit element v na4alo');
writeln('3 - prosmotr spiska');
writeln('4 - udalit otricat elementy');
writeln('5 - proverit na nali4ie odinak elementov');
write('vash vibor:');
readln(ch);
case 'm' of
'1': begin sozd; end;
'2': begin dob; end;
'3': begin prosmotr; end;
'4': begin delete_otr; end;
'5': begin dva_odin; end;
end;
until ch='n';
tgig вне форума Ответить с цитированием
Старый 30.06.2009, 13:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
проверять есть ли в списке хотя бы два одинаковых элемента
Я бы действовал примерно так:
Сделал бы функцию типа
Код:
function aga(start:^rec;value:integer):boolean;
var q:^rec;
begin aga:=false; q:=start^.next;
 while q<>nil do begin
  if q^.inf=value then begin 
   aga:=true;
   exit;
  end;
  q:=q^.next;
 end; 
end;
И в цикле ее вызывал для проверки от текущего элемента.
т.е. если функция вернет TRUE значит есть такой же элемент со значением в Value
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2009, 13:47   #3
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Цитата:
как массив впихнуть не знаю
А какой массив? И зачем его впихивать и куда? Выбросте из кода всё, что касается масива.
Всякое безобразие должно быть единообразным. Тогда это называется порядком.

Последний раз редактировалось Anatole; 30.06.2009 в 14:12.
Anatole вне форума Ответить с цитированием
Старый 30.06.2009, 13:55   #4
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

здесь не совсем коррекктно было написано
Код:
procedure dob;
begin
{start:=nil; Это ошибочный оператор, при повторном вызове процедуры он уничтожит ранее введённые данные}
repeat
new(p);
write('vvedite zha4enie:');
readln(p^.inf);
p^.next:=start;
start:=p;
writeln('else?');
readln(ch);
until ch='n';
writeln ('spisok sozdan');
end;
Эту сточку исправте
Код:
case 'm' of
на
Код:
case ch of
Процедуру удаления отрицательных элементов со списка я бы написал так:
Код:
procedure delete_otr;
var n:link;
begin
while (start<>nil) and (start^.inf < 0) do
  begin
  n:= start;
  start:=start^.next;
  Dispose(n); 
  end;
p := start;
While p^.next <> nil do
  begin
   if p^.next^.inf < 0 then
     begin
      n:=p^.next;
      p^.next := p^.next^.next;
      Dispose(n);   
     end else p := p^.next;
  end;
end;
Всякое безобразие должно быть единообразным. Тогда это называется порядком.

Последний раз редактировалось Anatole; 30.06.2009 в 14:41.
Anatole вне форума Ответить с цитированием
Старый 30.06.2009, 14:36   #5
tgig
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 10
По умолчанию

Anatole, спасибо за поправки.

Stilet! А можно поподробней в каком цикле вызвать функцию???
tgig вне форума Ответить с цитированием
Старый 30.06.2009, 14:49   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
tgig
Приблизительно так:
У тебя есть процедура dva_odin
Вот я бы ее написал так, с учетом моей функции:
Код:
procedure dva_odin;
 strt:^rec;
begin
 strt:=<голова списка>
 while strs<>nil do begin
  if aga(strt,strt^.inf) then begin
    Write('Есть повторы');
    exit;
  end;
  strt:=strt^.next;
 end;
end;
p.S. не проверял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2009, 14:53   #7
tgig
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 10
По умолчанию

Большое спасибо, Виталий! ))) Идея ясна, щас будем пробовать)))
tgig вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические списки Ольчик Паскаль, Turbo Pascal, PascalABC.NET 4 15.01.2012 14:33
Динамические списки MyQwErTy Помощь студентам 3 14.04.2009 20:08
Динамические данные. Списки. pulsar Помощь студентам 6 23.02.2009 16:12
Динамические списки lubafffka Паскаль, Turbo Pascal, PascalABC.NET 6 17.12.2008 21:59