IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> динамическая структура данных, Линейные списки
valeral
сообщение 1.06.2006 12:45
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской
Реальное имя: valera

Репутация: -  0  +


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

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

Сообщение отредактировано: valeral - 1.06.2006 13:17
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.06.2006 13:04
Сообщение #2


Гость






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

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

Вот и задача у тебя: добавить E к списку L так, чтобы не нарушить его упорядоченности. Кстати, каким будет список после добавления этого элемента?
 К началу страницы 
+ Ответить 
valeral
сообщение 1.06.2006 14:18
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской
Реальное имя: valera

Репутация: -  0  +


Певое условие выполнил
Второе.
Кстати, каким будет список после добавления этого элемента?
Это всё условие что дано, из сказанного Вами я понял что надо сделать список допустим от 1 до 10, в него надо вставить какое то число, которого нет в этом списке, и чтоб порядок не изменился. Так? Блин, всё равно не могу понять как это сделать.
Нужно создать сам список, потом ввести требование ввести число, и вывод на экран упорядоченного списка с новым чмслом. А если такое число уже есть в списке?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.06.2006 14:31
Сообщение #4


Гость






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

Повторяю вопрос немного в другой плоскости: если у тебя есть список
<1, 4, 6, 6, 7, 8, 8, 10, 5>
является ли он упорядоченным по неубыванию?
 К началу страницы 
+ Ответить 
valeral
сообщение 1.06.2006 15:07
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской
Реальное имя: valera

Репутация: -  0  +


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

Сообщение отредактировано: valeral - 1.06.2006 15:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
valeral
сообщение 1.06.2006 15:33
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской
Реальное имя: valera

Репутация: -  0  +


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.06.2006 23:25
Сообщение #7


Гость






Цитата(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 7:01
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской
Реальное имя: valera

Репутация: -  0  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 26.08.2025 1:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"