Помощь - Поиск - Пользователи - Календарь
Полная версия: Упорядочен ли список?!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
MagZzz
Привет всем! Помогите с задачкой!! :p2:

Предлагается, что уже построен и задан указателем Р связанный односторонний список, элементами которого являются символы.
а) Подсчитать число элементов списка.
б) Проверить упорядочен ли список по возрастанию.
volvo
Это как раз зависит от того, как именно задан список... Если список задан так:
Код
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
Спасибо огромное за совет volvo! smile.gif
MagZzz
Вот я тут по левому наштряпал программку, но она список сортирует! 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
Код
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
Спасибо volvo огромное тебе ещё раз!! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.