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

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

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

 
 Ответить  Открыть новую тему 
> Сложение элементов 2 списков
Tribunal
сообщение 9.05.2006 11:47
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


мне нужно произвести сложение
2 списков поэлементно...

вот то,что я делаю,но при выполнении собственно сложения выдается ошибка

read(n);
randomize;

new(first);{создание первого списка}
first^.next:=nil;
first^.inf:=random(10)-1;
for i:=1 to n-1 do
 begin
   new(p1);
   p1^.inf:=random(10)-1;
   p1^.next:=nil;
   p1^.next:=first;
   first:=p1;
 end;
t:=p1;
while t<>nil do
  begin
    writeln(t^.inf);
    t:=t^.next;
  end;

new(first);{создание второго списка}
first^.next:=nil;
first^.inf:=random(10)-1;
for i:=1 to n-1 do
 begin
   new(p2);
   p2^.inf:=random(10)-1;
   p2^.next:=nil;
   p2^.next:=first;
   first:=p2;
 end;
t:=p2;
while t<>nil do
  begin
    writeln(t^.inf);
    t:=t^.next;
  end;

new(first);{выполнение сложения}
first^.next:=nil;

first^.inf:=p1^.inf+p2^.inf;
p1:=p1^.next;
p2:=p2^.next;
while p1<>nil do
while p2<>nil do
 begin
  new(p3);
  p3^.inf:=p1^.inf+p2^.inf;
  p3^.next:=nil;
  p3^.next:=first;
  first:=p3;
  p1:=p1^.next;
  p2:=p2^.next;
 end;

t:=p3;
while t<>nil do
  begin
    writeln(t^.inf);
    t:=t^.next;
  end;


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

Сообщение отредактировано: volvo - 2.11.2006 19:05


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 11:59
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


всё)эту глупую ошибку нашла...
а почему получается только один элемент в результирующем списке?

Сообщение отредактировано: Tribunal - 9.05.2006 12:01


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.05.2006 12:02
Сообщение #3


Гость






Ну, поскольку у тебя списки P1 и P2 одинаковой длины, то достаточно будет сделать так:

if (p1<>nil) and (p2<>nil) then begin

  new(first); { выполнение сложения }
  first^.next:=nil;
  first^.inf := p1^.inf + p2^.inf; { Ошибка была тут: P3 еще не инициализирован... }
  p1:=p1^.next; p2:=p2^.next;
  while p1<>nil do begin { второе условие проверять необязательно }
    new(p3);
    p3^.inf:=p1^.inf+p2^.inf;
    p3^.next:=nil;
    p3^.next:=first;
    first:=p3;
    p1:=p1^.next; p2:=p2^.next;
  end;

end;
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 12:07
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


а результирующий список выводится в обратном порядке))
этого можно избежать?или мне список инвертировать?)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.05.2006 12:10
Сообщение #5


Гость






Цитата(Tribunal @ 9.05.2006 12:07)
а результирующий список выводится в обратном порядке))

Точно так же, как и исходные blum.gif

Можно список инвертировать, можно просто по-другому его создавать, чтобы он сразу создавался в "прямом" порядке... Что выбираешь?
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 12:22
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


но факт в том,что они создаются в разных порядках...)
а в прямом порядке это как?


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 12:35
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


так получается,что в тот момент,когда мы обращаемся к спискам p1 и p2 их куазатели стоят в конце после вывода их на экран.так?
тогда поэтому и происходит так,что результат выводится в обратном порядке.
а как тогда обратиться к началу тех двух списков?

хотя нет.такого быть не может.тогда бы ссылки на следующий элемент не было(

Сообщение отредактировано: Tribunal - 9.05.2006 12:38


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.05.2006 12:41
Сообщение #8


Гость






Цитата(Tribunal @ 9.05.2006 12:22)
а в прямом порядке это как?

Вот так:
type
  plist = ^list;
  list = record
    inf: integer;
    next: plist;
  end;

procedure create_list(var p: plist);
var
  first, last, curr: plist;
  i, X: integer;
begin
  first := nil; last := nil;
  for i := 1 to 5 do begin
    write('item #', i:2, ' = '); readln(X);

    new(curr);
    curr^.inf := X;
    curr^.next := nil;

    if first = nil then first := curr
    else last^.next := curr;

    last := curr;
  end;
  p := first;
end;

var
  p, p1: plist;

begin
  create_list(p1);
  p := p1; { <--- Это - чтобы не потерять начало списка, работаем через доп. переменную }
  while p <> nil do begin
    write(p^.inf:4);
    p := p^.next;
  end;
  writeln;
end.


Посмотри, что делается в процедуре (и зачем добавлена не только переменная First, а еще и переменная Last), и добавляй элементы в список по этому принципу...
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 13:27
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


и всё же мне непонятно,почему последний список получается в обратном порядке...

и с переменной last разобраться не могу...
впрочем,я попыталась впихать эту процедуру себе в программу и всё равно ничего не получилось((

if (p1<>nil) and (p2<>nil) then
begin

  first:=nil;
  last:=nil;

  while p1<>nil do
  begin

    new(t);
    t^.inf:=p1^.inf+p2^.inf;
    t^.next:=nil;
    if first=nil
    then first:=t
    else last^.next:=t;
    last:=t;

  end;
  p3:=first;
end;


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.05.2006 13:59
Сообщение #10


Гость






Нет... Ты не должна ЭТО делать ТОЛЬКО в последнем списке... Первые 2 тоже должны быть так сформированы... Иначе ничего не получится...

И еще одно. Я привел тебе процедуру, а ты ее зачем-то "растворила" в основной программе. Смысл мне объясни... Ты что, думаешь, что 3 раза сделать Copy+Paste лучше, чем одну процедуру вызвать 3 раза? Отнюдь... Так зачем?
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 14:00
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


у меня вот есть такая процедура создания списка с добавлением элементов в конец списка:

new(first);
first^.next:=nil;
read(first^.inf);

for i:=1 to n do
 begin
    new(p);
    read(p^.inf); 
    p^.next:=nil;
    t:=first;
    t^.next:=p;
    t:=t^.next;
 end;


только в ней что-то не так.только что?


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tribunal
сообщение 9.05.2006 14:39
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


кстати...
а покажите,пожалуйста,как инверитировать список)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.05.2006 14:58
Сообщение #13


Гость






var
  p, p1: plist;
  pt, prv, first, last: plist;

begin
  create_list(p1); { Создаем список }

  p := p1; { Печатаем "прямой" список }
  while p <> nil do begin
    write(p^.inf:4);
    p := p^.next;
  end;
  writeln;

  { Инвертируем список }
  first := p1;
  if (first <> nil) and (first^.next <> nil) then begin

    last := first;
    while last^.next <> nil do last := last^.next;

    pt := first; prv := nil;
    first := last; last := pt;
    while pt <> first do begin
      p := pt^.next;
      pt^.next := prv;
      prv := pt;

      pt := p;
    end;
    first^.next := prv
  end;

  p := first; { Печатаем инвертированный список }
  while p <> nil do begin
    write(p^.inf:4);
    p := p^.next;
  end;
  writeln;
end.


Процедура create_list - та же самая, что и в моем предыдущем примере...
 К началу страницы 
+ Ответить 
Tribunal
сообщение 10.05.2006 12:14
Сообщение #14


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


не могу понять многие моменты в инвертировании списка,
не получается прослеедить алгоритм...((
пожалуйста,если не трудно,не могли бы вы поподробнее объяснить?


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

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