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

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

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

> Задача со списками
AlonZo
сообщение 17.11.2007 10:03
Сообщение #1


Новичок
*

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

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


Задача такова: создать список из действительных чисел. Потом сформировать из него два списка - один с положительными числами, другой с отрицательными(числа взяты с главного списка). Собственно как создать главный список я знаю, а как распределить числа на остальные два - нет.

Вот что собственно есть:
Код
uses crt;
type
    pnode=^node;
    node=record
            data:integer;
            next:pnode;
    end;
Procedure Init(var p,u:pnode); {создание главного списка}
          var
             i:integer;
          begin
               new(u);
               u^.next:=nil;
               p:=u;
               Write('Spisok:');
               for i:=1 to 15 do
                   begin
                        new(p^.next);
                        p:=p^.next;
                        p^.next:=nil;
                        p^.data:=random(30)-5;
                   end;
          end;
Procedure Out(p,u:pnode);              {Вывод}
          begin
               p:=u^.next;
               while p<>nil do
                      begin
                           write(p^.data:4);
                           p:=p^.next;
                      end;
               writeln;
          end;
var
   p,u:pnode;
begin
     clrscr;
     Init(p,u);
     Out(p,u);
     readkey;
end.


Сообщение отредактировано: AlonZo - 17.11.2007 10:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.11.2007 17:04
Сообщение #2


Гость






Смотри, что делаем:

uses crt;
type
pnode = ^node;
node = record
data: integer;
next: pnode;
end;

{ 1. добавляем элемент в конец списка }
procedure Add(var p: pnode; k: integer);
var pp, new_p: pnode;
begin
{ работаем с копией указателя, чтоб не испортить }
pp := p;
{ пробегаем по списку до тех пор, пока pp^.next ненулевое - т.о. ищем последний элемент }
while (pp <> nil) and (pp^.next <> nil) do begin
pp := pp^.next;
end;

{ новый элемент и его заполнение }
new(new_p);
new_p^.next := nil;
new_p^.data := k;

{
pp = nil может быть только, если p = nil. Тогда просто возвращаем новый элемент,
иначе - добавляем (поле next последнего элемента теперь указывает на новый)
}
if pp = nil then p := new_p
else pp^.next := new_p;
end;

{ 2. Инициализация исходного списка }
procedure Init(var p: pnode);
var
i: integer;
begin
{
без всяких выкрутасов - просто добавляем 15 новых значений.
Add сама разберется, какое первое, а какое- последующее
}
p := nil;
for i := 1 to 15 do
Add(p, integer(Random(30) - 10));
end;

{ 3. Печать списка - тут все просто }
Procedure Print(p: pnode);
begin
while p <> nil do begin
write(p^.data:4);
p:=p^.next;
end;
writeln;
end;

var
p, first, second: pnode;
pp: pnode;
begin
clrscr;
randomize;
Init(p);
Print(p);

{
Ну, а это - собственно - решение задачи:
раскидываем положительные и отрицательные по разным спискам
}
first := nil; second := nil;

pp := p;
while pp <> nil do begin
if pp^.data >= 0 then Add(first, pp^.data)
else Add(second, pp^.data);

pp := pp^.next;
end;
Print(first);
Print(second);

readkey;
end.

Не забывай по окончании работы удалить теперь уже все 3 списка...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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