Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Списки

Автор: *alt 26.11.2007 0:40

Задача
Подсчитать количество элементов списка, у которых равные соседи.

Посмотрите и исправьте, пожалуйста, мой код::

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 26.11.2007 1:38

Стоп!!!
Подскажите сначала как создать целый двусвязный список, только не так, как в ФАКе
Ну и функцию count проверьте))))

Автор: volvo 26.11.2007 2:48

Цитата
Подскажите сначала как создать целый двусвязный список
У тебя же было почти правильно... Вот так, скажем:
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 26.11.2007 2:57

Volvo, спасибо create, но у меня функция count не работает.....
не пойму почему......

Автор: volvo 26.11.2007 3:13

Потому, что не надо делать простое сложным:

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 26.11.2007 3:18

Да......
спасибо..... работает....
Почему тянет

Цитата
делать простое сложным
smile.gif ???? smile.gif