Автор: MagZzz 27.03.2005 15:05
Привет всем! Помогите с задачкой!! :p2:
Предлагается, что уже построен и задан указателем Р связанный односторонний список, элементами которого являются символы.
а) Подсчитать число элементов списка.
б) Проверить упорядочен ли список по возрастанию.
Автор: volvo 27.03.2005 15:24
Это как раз зависит от того, как именно задан список... Если список задан так:
Код
type pitem = ^item;
item = record
elem: char;
next: pitem;
end;
то подсчет числа элементов:
Код
function count(list: pitem): integer;
var x: integer;
begin
x := 0;
while list <> nil do begin
list := list^.next;
inc(x)
end;
count := x
end;
Упорядоченность списка попробуйте сделать сами, я бы для этого ввел дополнительную переменную типа char, и начинал обрабатывать список не с первого, а со второго элемента.
Автор: MagZzz 27.03.2005 19:14
Спасибо огромное за совет volvo!
Автор: MagZzz 3.04.2005 20:06
Вот я тут по левому наштряпал программку, но она список сортирует! Чё надо переделать чтоб она выдавала только ответ отсортирован список или нет!! Спасибо за внимание!!
Исходный код
program sortir;
uses crt;
type
p_stud=^student;
student=record
name:string[20];
next:p_stud;
end;
const
sum: longint = 0;
var
head:p_stud;
cur:p_stud;
p:p_stud;
name:string[20];
node: p_stud;
tekst:text;
begin
clrscr;
Writeln(' -- Ishodnyi spisok --');
writeln;
assign(tekst,'D:\income.txt');
reset(tekst);
while not EOF(tekst) do
begin
Readln(tekst,name);
Writeln('', name,' ');
end;
close(tekst);
assign(tekst,'D:\income.txt');
reset(tekst);
Readln(tekst,name);
reset(tekst);
while not EOF(tekst) do
begin
Readln(tekst,name);
inc(Sum, Length(name))
end;
close(tekst);
Writeln;
Writeln('— Kollichestvo elementov - ', Sum ,' ');
Writeln;
assign(tekst,'D:\income.txt');
reset(tekst);
repeat
readln(tekst,name);
if length (name)<>0 then begin
new(node);
node^.name:=name;
node^.next:=NIL;
cur:=head;
p:=NIL;
while(name>cur^.name) and (cur<>NIL) do begin
p:=cur;
cur:=cur^.next;
end;
if p = NIL then begin
node^.next:=head;
head:=node;
end
else begin
node^.next:=p^.next;
p^.next:=node;
end;
end;
until length(name)=0;
cur:=head;
writeln(' -- - --');
while cur<>NIL do begin
writeln(cur^.name);
cur:=cur^.next;
end;
writeln('----------------------------');
readln;
close(tekst);
end.
Код должен быть в тегах
Автор: volvo 3.04.2005 20:42
Код
var
is_good: boolean;
pred_str: string[20];
last: p_stud;
...
last := nil;
{ Заполняем список БЕЗ сортировки }
repeat
readln(tekst,name);
if name <> '' then begin
new(node);
node^.name := name;
node^.next := nil;
if head = nil then head := node
else last^.next := node;
last := node;
end;
until name='';
{ и проверяем на упорядоченность }
is_good := true;
pred_str := head^.name;
p := head^.next;
while (p <> nil) and (is_good) do begin
is_good := is_good and (p^.name > pred_str);
pred_str := p^.name; p := p^.next
end;
if is_good then Writeln('упорядочен')
else writeln('НЕупорядочен');
Кстати, что, обязательно писать ВСЮ программу в основном блоке? Что, ее нельзя было хоть как-то структурировать? Например, сделать вставку элемента в список отдельной процедурой... Ведь со структурированной программой
намного легче работать...
Автор: MagZzz 4.04.2005 5:42
Спасибо volvo огромное тебе ещё раз!!