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

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

Форум «Всё о Паскале» _ Задачи _ динамическая структура данных

Автор: valeral 1.06.2006 16:45

Дано условие:
Описать процедуру, которая вставляет в непустой список L, элементы которого упорядочены по неубы-ванию, новый элемент E так, чтобы сохранилась упо-рядоченность.

не могу вьехать, что надо сделать. Подскажите пожалуйста

Автор: volvo 1.06.2006 17:04

Во-первых: поменять название темы...

А во-вторых: тебе дан упорядоченный список с такими, например, узлами:
L = <1, 4, 6, 6, 7, 8, 8, 10>
и элемент E равный, скажем, 5...

Вот и задача у тебя: добавить E к списку L так, чтобы не нарушить его упорядоченности. Кстати, каким будет список после добавления этого элемента?

Автор: valeral 1.06.2006 18:18

Певое условие выполнил
Второе.
Кстати, каким будет список после добавления этого элемента?
Это всё условие что дано, из сказанного Вами я понял что надо сделать список допустим от 1 до 10, в него надо вставить какое то число, которого нет в этом списке, и чтоб порядок не изменился. Так? Блин, всё равно не могу понять как это сделать.
Нужно создать сам список, потом ввести требование ввести число, и вывод на экран упорядоченного списка с новым чмслом. А если такое число уже есть в списке?

Автор: volvo 1.06.2006 18:31

Ход решения неверен... Я привел ВСЕ данные, которые необходимы для решения задачи... Не надо ничего придумывать. Тебе ДАН список. Понимаешь? Не элементы списка, чтоб тебе надо было что-то "составлять", а СПИСОК. С ним (кроме добавления одного элемента) вообще ничего не надо делать.

Повторяю вопрос немного в другой плоскости: если у тебя есть список
<1, 4, 6, 6, 7, 8, 8, 10, 5>
является ли он упорядоченным по неубыванию?

Автор: valeral 1.06.2006 19:07

этот список <1, 4, 6, 6, 7, 8, 8, 10, 5> нет, а этот <1, 4, 6, 6, 7, 8, 8, 10> получается да

Автор: valeral 1.06.2006 19:33

Volvo примерно так это должно быть

Program Example;
Uses Crt;
Type
PEl=^TEl;
TEl=Record
Inf:Integer;
Next:PEl;
end;
Var Spisok1,Spisok2:PEl;

Procedure CreateSpisok(var A:PEl);
Var B:PEl;
I:Integer;
begin
New(A);
Readln(A^.Inf);
B:=A;
Readln(I);
While not(I=0) do
begin
New(B^.Next);
B:=B^.Next;
B^.Inf:=I;
Readln(I);
end;
B^.Next:=Nil
end;

Procedure DelSpisok(var A:PEl);
var B:PEl;
begin
While not(A=nil) do
Begin
B:=A;
A:=A^.Next;
Dispose(B);
end;
end;

Procedure PrintSpisok(A:PEl);
var B:PEl;
begin
B:=A;
while not(B=nil) do
begin
Write(B^.Inf:1,' ');
B:=B^.Next;
end;
Writeln
end;

Function MinEl(Ab:PEl):Integer;
var B:PEl;
Min:Integer;
begin
Min:=Ab^.Inf;
B:=Ab^.Next;
While not(B=nil) do
begin
If B^.Inf<Min then Min:=B^.Inf;
B:=B^.Next;
end;
MinEl:=Min;
end;

Procedure SortSpisok(var A:PEl);
var B,C,D:PEl;
I:Integer;
begin
{Переносится первый элемент списка}
I:=MinEl(A);
If I=A^.Inf Then
begin
D:=A;
A:=A^.Next;
end
else
begin
B:=A;
While not(B^.Next^.Inf=I) do
B:=B^.Next;
D:=B^.Next;
B^.Next:=D^.Next;
end;
{Переносятся все остальные элементы списка}
C:=D;
While not(A=nil) do
begin
I:=MinEl(A);
if I=A^.Inf then
begin
C^.Next:=A;
A:=A^.Next
end
else
begin
B:=A;
While not(B^.Next^.Inf=I) do
B:=B^.Next;
C^.Next:=B^.Next;
B^.Next:=C^.Next^.Next;
end;
C:=C^.Next;
end;
C^.Next:=Nil;
A:=D;
end;

Procedure AddSpisok(var A,D:PEl);
Var B,C:PEl;
Begin
While not(D=nil) do
begin
C:=D;
D:=D^.Next;
If C^.Inf<A^.Inf then
begin
C^.Next:=A;
A:=C;
end
else
begin
B:=A;
While not(B^.Next^.Inf>C^.Inf) and not(B^.Next=Nil) do
B:=B^.Next;
C^.Next:=B^.Next;
B^.Next:=C;
end;
end;
end;

Begin
ClrScr;
Writeln('Введите первый список:');
CreateSpisok(Spisok1);
ClrScr;
Writeln('Введите второй список:');
CreateSpisok(Spisok2);
ClrScr;
Writeln('Первый список:');
PrintSpisok(Spisok1);
Writeln('Второй список:');
PrintSpisok(Spisok2);
Writeln;

SortSpisok(Spisok1);
Writeln('Остсортированный первый список:');
PrintSpisok(Spisok1);
AddSpisok(Spisok1,Spisok2);
Writeln('Результат объединения списков:');
PrintSpisok(Spisok1);
DelSpisok(Spisok1);
Readkey;
end.

Автор: volvo 2.06.2006 3:25

Цитата(valeral @ 1.06.2006 15:33)
примерно так это должно быть

Ты не хочешь понимать того, что тебе объясняют? КАК еще надо сказать, что приведенный тобой код НЕ ВЫПОЛНЯЕТ задачи, перед тобой поставленной??? Ты задание-то прочти!
Цитата
Описать процедуру, которая вставляет в непустой список L, элементы которого упорядочены по неубыванию, новый элемент E так, чтобы сохранилась упорядоченность.
А твой код что делает? Слияние списков? Зачем? Второго списка по условию нет, да и в первый надо добавить всего один элемент, НО не пересортировывать его (это просто), а добавить так, чтобы сохранить упорядоченность!!!

Вот все, что от тебя требовалось:
Program Example;
Uses Crt;
Type
PEl=^TEl;
TEl=Record
Inf:Integer;
Next:PEl;
end;
Var
spisok: PEl;
E: integer;

Procedure CreateSpisok(var A:PEl);
Var B:PEl;
I:Integer;
begin
New(A);
Readln(A^.Inf);
B:=A;
Readln(I);
While not(I=0) do
begin
New(B^.Next);
B:=B^.Next;
B^.Inf:=I;
Readln(I);
end;
B^.Next:=Nil
end;

Procedure DelSpisok(var A:PEl);
var B:PEl;
begin
While not(A=nil) do
Begin
B:=A;
A:=A^.Next;
Dispose(B);
end;
end;

Procedure PrintSpisok(A:PEl);
var B:PEl;
begin
B:=A;
while not(B=nil) do
begin
Write(B^.Inf:1,' ');
B:=B^.Next;
end;
Writeln
end;

procedure InsertElement(var a: PEl; E: integer);
var
p, T: PEl;
before_first: boolean;
begin
p := a;
before_first := (p^.inf > E);
while (p^.next <> nil) and (p^.next^.inf < E) do p := p^.next;

new(T); T^.inf := E;
if before_first then begin
T^.next := a; a := T;
end
else begin
t^.next := p^.next; p^.next := T;
end;
end;

Begin
ClrScr;
Writeln('List:');
spisok := nil;
CreateSpisok(Spisok);

PrintSpisok(spisok);
write('E = '); readln(E);
InsertElement(spisok, E);
PrintSpisok(spisok);

DelSpisok(spisok);
Readkey;
end.


И, пожалуйста, в следующий раз читай задание внимательно... Правильно прочтя задание ты делаешь бОльшую часть работы...

Автор: valeral 2.06.2006 11:01

Volvo я вчера задание на работе писал, и в рабочей суматохе действительно просто не разобрался в условии. После работы дома сел и всё оказалось намного проще чем я думал. У тебя код вышел немного проще, чем у меня, так что буду смотреть и упрощать свою версию. Спасибо!