Помощь - Поиск - Пользователи - Календарь
Полная версия: Динамические структуры данных (список)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Kaygour
Помогите решить задачу по теме «Динамические структуры данных» в паскале.

Задача звучит так:
Составить программу которая переносит в конец непустого списка L его первый элемент.

Я сделал чтобы первый элемент становился последним, а вот как проверить список на наличие того, пустой он или нет, не знаю.
Код

uses crt;
type
ap=^sp;
sp=record
  f,o:string[20];
   i:string[15];
    ss:ap;
end;
var
fio1,fio2,fio3,fio4:ap;
a,f,b:string;
begin
clrscr;
new(fio1);
write('Введите фамилию: ');
  readln(fio1^.f);
   write('Введите имя: ');
    readln(fio2^.i);
     write('Введите отчество: ');
      readln(fio3^.o);
a:=fio3^.o;
begin
fio3^.o:=fio1^.f;
  fio1^.f:=fio2^.i;
   fio2^.i:=a;
writeln('Поле1: ',fio1^.f);
  writeln('Поле2: ',fio2^.i);
   writeln('Поле3: ',fio3^.o);
  readkey;
end.
volvo
Kaygour, эта программа не будет работать:
new(fio1); { Допустим, для Fio1 ты выделил память }
write('Введите фамилию: '); readln(fio1^.f); { <-- Все в порядке }

write('Введите имя: '); readln(fio2^.i); { <-- А вот тут - нет... Куда указывает fio2^ ... }
write('Введите отчество: '); readln(fio3^.o); { <-- ... и fio3 тоже ? }


В поиске смотрел? На списки решено достаточно много заданий, посмотри как организуется работа со списком...
Kaygour
Цитата("volvo")
В поиске смотрел?

Cмотрел. И здесь тоже смотрел.
Мне плохо понятно как списки связываются, эта тема новая для меня. Ну вот на примере этой задачи я хочу объяснить как я понял эту тему и заодно выяснятся мои ошибки. Иначе мне с мертвой точки не сдвинутся. Начну с описания, если где ошибусь поправьте меня.
Да и еще я задачу решил переделать заново.
Код

type
ap=^sp;
sp=record
  dan:string[20];
    ss:ap; {<- я так понял, это поле является указателем на другой список?}
   end;
var
fio1,fio2,fio3:ap;
begin
new(fio1);

Я думаю этот кусок выше правильный.
А дальше для меня самое сложное место для понимания, не понимаю я как эти списки связать. Их наверное надо связывать по полю ss:ap?
Чето типа такого:
Код

fio1^ss:=fio2;
fio2^.ss:=fio3;
fio3^.ss:=nil;

Ну я думаю пока я не пойму этот кусок, продолжать дальше бессмысленно.
Я над этой задачей уже неделю бьюсь и никаких положительных результатов. mega_chok.gif
volvo
Стоп...
Объясни мне одну вещь: у тебя fio1, fio2, fio3 это 3 разных списка, или это те данные, которые ты хочешь чтобы они содержались в одном списке?

Если список один, то для его поддержки достаточно одного указателя (на первый элемент)...
Kaygour
Вообщето мне нужен один список и несколько элементов, чтобы было что переставлять.
А fio1, fio2, fio3, это данные которые вносятся
fio1-Фамилия;
fio2-Имя;
fio3-Отчество;
Я понял что нужно так делать, хотя могу и ошибаться.
volvo
Нет, так как раз делать не нужно... Вот простая программка, иллюстрирующая создание списка и добавление элементов в конец списка:
type
{ Это - просто для удобства, легко изменить тип при надобности на любой другой }
ttype = string;

plist = ^tlist;
tlist = object
info: ttype;
next: plist;
end;

var
p, { Это - "рабочий" указатель на элемент списка }

{ И указатели на его начало и конец }
first, last: plist;
s: string;

begin
{ В начале обнуляем начало и конец списка }
first := nil; last := nil;

{ и нацинаем цикл добавления элементов: }
repeat

{ Читаем, что надо добавить (для выхода из цикла - ввод пустой строки) }
write('s = '); readln(s);
if s <> '' then begin
{ и если не введена пустая строка, то: }

{ берем память под очередной элемент списка... }
new(p);
{ в поле данных пишем сами данные }
p^.info := s;
{ этот 'лемент добавляется в конец, так что следующего ПОКА нет, заносим Nil }
p^.next := nil;

{ если это вообще первый элемент, то на него должен указывать First }
if first = nil then first := p
{
если в список уже что-то было внесено, то исправляем
поле next _бывшего_ последним элемента так,
чтобы оно указывало на добавляемый
}
else last^.next := p;

{
и переменная Last всегда должна содержать адрес
последнего внесенного в список элемента
}
last := p
end;

until s = ''; { если была введена пустая строка - выходим из цикла }

{
Вот тут список из любого количества элементов уже создан...
Можешь, например, его распечатать:
}
p := first;
while p <> nil do begin
writeln(p^.info);
p := p^.next;
end;
end.
Kaygour
volvo спасибо тебе огромное!!! Очень хорошо расписал пояснялки к программе .
Прошу прощения за свою тупость, но у меня возникли некоторые вопросы.
Что такое object? Во всех книжках которые смотрел, писалось запись record.
volvo
Насчет Object - тебе сначала вот тут бы прочесть:
ООП. Объектно-ориентированное программирование -> Объекты
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.