Помощь - Поиск - Пользователи - Календарь
Полная версия: Списки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
*alt
Задача
Подсчитать количество элементов списка, у которых равные соседи.

Посмотрите и исправьте, пожалуйста, мой код::
type
Tinf = integer;
Tptr = ^Tlist;
Tlist = record
inf:Tinf;
next,prev:Tptr;
end;

var
A:Tptr;

procedure create_list (var L:Tptr );
var e:Tinf;
begin
L:=nil;
while not eoln do
begin
read (e);
L:=new(Tptr);
L^.next:=nil;
L^.prev:=nil;
L^.inf:=e;
end;
readln
end;

function count (L:Tptr):integer;
var pl_1, pl_2: tptr; k:integer;
begin
k:=0;
L:=L^.next;
while (L <> nil) do
begin
pl_2 := L;
pl_1 := L;
pl_1:=pl_1^.next;
pl_2:=pl_2^.prev;
if pl_1^.inf = pl_2^.inf then
k:=k+1
else
L:=L^.next;
end;

count := k;
end;

{удаление списка}
Procedure ListDestroy(var L:Tptr);
var
p:Tptr;
begin
While L^.next <> Nil Do L:=L^.Next;
While L <> Nil Do
Begin
P:=L;
L:=L^.Prev;
Dispose(P);
End;
end;


begin {main}

write ('Введите элементы списка: ');
create_list(A);

writeln ('количество элементов списка, у которых равные соседи: ', count (A));

ListDestroy (A);

readln;
end.
*alt
Стоп!!!
Подскажите сначала как создать целый двусвязный список, только не так, как в ФАКе
Ну и функцию count проверьте))))
volvo
Цитата
Подскажите сначала как создать целый двусвязный список
У тебя же было почти правильно... Вот так, скажем:
procedure create_list (var L:Tptr );
var
e: Tinf;
p, new_p: tptr;

begin
p := nil; L := nil;

while not eoln do begin
read (e);

new_p := new(Tptr);
new_p^.prev := p;
new_p^.next := nil;
new_p^.inf := e;

if p <> nil then p^.next := new_p;

p := new_p;
if L = nil then L := p;

end;
readln
end;

*alt
Volvo, спасибо create, но у меня функция count не работает.....
не пойму почему......
volvo
Потому, что не надо делать простое сложным:
function count(L: Tptr): integer;
var n: integer;
begin
n := 0;
while L <> nil do begin
if (L^.prev <> nil) and (L^.next <> nil) { <-- Проверяем есть ли оба соседа }
and
(L^.prev^.inf = L^.next^.inf) { <--- Если есть, то проверяем их равенство }
then inc(n);

L := L^.next;
end;
count := n;
end;

Вот и все...
*alt
Да......
спасибо..... работает....
Почему тянет
Цитата
делать простое сложным
smile.gif ???? smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.