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

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

Форум «Всё о Паскале» _ Задачи _ Упорядочен ли список?!

Автор: 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! smile.gif

Автор: MagZzz 3.04.2005 20:06

Вот я тут по левому наштряпал программку, но она список сортирует! blink.gif Чё надо переделать чтоб она выдавала только ответ отсортирован список или нет!! Спасибо за внимание!! unsure.gif

Исходный код
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 огромное тебе ещё раз!! smile.gif