Динамическая память. Помогите
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Oleg_Rus
- Сообщения: 335
- Зарегистрирован: 16 окт 2006, 09:56
- Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
- Контактная информация:
Надо написать лабораторку со списками. Я написал такой код:
uses Crt;
type TBook= ^TPBook;
TPBook= record
Title: String[40];
Author: String[40];
Year: String[4];
NBook: TBook;
end;
var First, Book: TBook;
Procedure InputBook(First: TBook);
var str: String;
Number: Integer;
begin
New(First);
Write('‚Введите название книги: ');
Readln(Str);
First^.Title:=Str;
Write('‚Введите автора книги: ');
Readln(Str);
First^.Author:=Str;
Write('‚Введите год издания: ');
Readln(Str);
First^.Year:=Str;
New(Book);
First^.NBook:=Book;
end;
Procedure OutputBook(First: TBook);
begin
Writeln('Название: ', First^.Title);
Writeln('Автор: ', First^.Author);
Writeln('Год издания: ', First^.Year);
end;
begin
InputBook(First);
InputBook(Book);
OutputBook(First);
OutputBook(Book);
end.
uses Crt;
type TBook= ^TPBook;
TPBook= record
Title: String[40];
Author: String[40];
Year: String[4];
NBook: TBook;
end;
var First, Book: TBook;
Procedure InputBook(First: TBook);
var str: String;
Number: Integer;
begin
New(First);
Write('‚Введите название книги: ');
Readln(Str);
First^.Title:=Str;
Write('‚Введите автора книги: ');
Readln(Str);
First^.Author:=Str;
Write('‚Введите год издания: ');
Readln(Str);
First^.Year:=Str;
New(Book);
First^.NBook:=Book;
end;
Procedure OutputBook(First: TBook);
begin
Writeln('Название: ', First^.Title);
Writeln('Автор: ', First^.Author);
Writeln('Год издания: ', First^.Year);
end;
begin
InputBook(First);
InputBook(Book);
OutputBook(First);
OutputBook(Book);
end.
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
и чё? запутались с объявлениями и типами? я тоже 


Вообще, структура элемента списка должна быть такой:
[syntax='Delphi']
Type
PBook=^TBook;
Type
TBook=Record;
Year:Integer;
Title:string[40];
Author:String[40];
{прочие данные}
Link:PBook;{Ссылка на следующий элемент, обратите внимание, PBook, а не TBook}
end;
[/syntax]
[syntax='Delphi']
Type
PBook=^TBook;
Type
TBook=Record;
Year:Integer;
Title:string[40];
Author:String[40];
{прочие данные}
Link:PBook;{Ссылка на следующий элемент, обратите внимание, PBook, а не TBook}
end;
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
- Oleg_Rus
- Сообщения: 335
- Зарегистрирован: 16 окт 2006, 09:56
- Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
- Контактная информация:
да ващще надо организовать двунаправленный список, а я даже однонаправленный построить не могу...
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
- Oleg_Rus
- Сообщения: 335
- Зарегистрирован: 16 окт 2006, 09:56
- Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
- Контактная информация:
если сможете, мужики, помогите с объяснениями. мне еще перед преподом откусаться надо....
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Вот откопал у себя пример работы со списком:
[syntax='Delphi']
program Lists;
type
PListItem=^TListItem;
TListItem=record
rData:real;
sData:string[20];
Link:PListItem;
end;
var
P:PListItem;
I:integer;
S:integer;
function ListSum(Root:PListItem):Real;
var
Item:PListItem;
sum:Real;
begin
Item:=Root;
Sum:=0;
while Item<>nil do
begin
Sum:=Sum+Item^.rData;
Item:=Item^.Link;
end;
ListSum:=Sum;
end;
function StoreData:PListItem;
var
X,Y,R:PListItem;
i:integer;
begin
New(X);
X^.rData:=1;
New(Y);
Y^.rData:=2;
X^.Link:=Y;
R:=X;
for I:=3 to 10 do
begin
New(X);
X^.rData:=I;
Y^.Link:=X;
Y:=X;
end;
StoreData:=R;
end;
begin
for i:=1 to 10 do
Inc(S,I);
writeln(S);
P:=StoreData;
writeln(ListSum(P):0:0);
readln;
end.
[/syntax]
Двунаправленый список, как я понимаю, должен содержать еще и ссылку на предыдущий элемент.
[syntax='Delphi']
program Lists;
type
PListItem=^TListItem;
TListItem=record
rData:real;
sData:string[20];
Link:PListItem;
end;
var
P:PListItem;
I:integer;
S:integer;
function ListSum(Root:PListItem):Real;
var
Item:PListItem;
sum:Real;
begin
Item:=Root;
Sum:=0;
while Item<>nil do
begin
Sum:=Sum+Item^.rData;
Item:=Item^.Link;
end;
ListSum:=Sum;
end;
function StoreData:PListItem;
var
X,Y,R:PListItem;
i:integer;
begin
New(X);
X^.rData:=1;
New(Y);
Y^.rData:=2;
X^.Link:=Y;
R:=X;
for I:=3 to 10 do
begin
New(X);
X^.rData:=I;
Y^.Link:=X;
Y:=X;
end;
StoreData:=R;
end;
begin
for i:=1 to 10 do
Inc(S,I);
writeln(S);
P:=StoreData;
writeln(ListSum(P):0:0);
readln;
end.
[/syntax]
Двунаправленый список, как я понимаю, должен содержать еще и ссылку на предыдущий элемент.
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
MOTOCoder, ну, Ваш вариант наименований получше, но это же НЕ ПРИНЦИПИАЛЬНО (я про организацию динамического списка).
у Вас:
у автора вопроса:
помоему - одно и то же... ;-)
Oleg_Rus, а ошибка (точнее ошибки) в другом:
1) путаемся что такое передаваемые параметры и глобальные переменные
в процедуру передаётся First и там же работа с глобальной Book (которая, кстати, передатся в процедуру в качестве параметра?!!!!
2) главное, непонимание зачем же в динамическом списке ссылка на следующую книгу (NBOOK)...
смотрите, логика работа со список такая - храним ссылку на головной элемент (на первую книгу), для удобства добавления можно хранить ссылку на последнюю добавленную книгу (но можно и не хранить, тогда ссылку на последнюю книгу всегда можно получить перебрав все записи, начиная с головы!)
Ну что, теперь сами исправите программу или помочь?...
у Вас:
Код: Выделить всё
PBook=^TBook;
TBook=Record;
Link:PBook
Код: Выделить всё
TBook= ^TPBook;
TPBook= record
NBook: TBook;
Oleg_Rus, а ошибка (точнее ошибки) в другом:
1) путаемся что такое передаваемые параметры и глобальные переменные
в процедуру передаётся First и там же работа с глобальной Book (которая, кстати, передатся в процедуру в качестве параметра?!!!!
2) главное, непонимание зачем же в динамическом списке ссылка на следующую книгу (NBOOK)...
смотрите, логика работа со список такая - храним ссылку на головной элемент (на первую книгу), для удобства добавления можно хранить ссылку на последнюю добавленную книгу (но можно и не хранить, тогда ссылку на последнюю книгу всегда можно получить перебрав все записи, начиная с головы!)
Ну что, теперь сами исправите программу или помочь?...
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
Да... пока писал ответ, тут уже почти всё решили и без меня...
Да, действительно никакой разницы, сам запутался. Просто привык, что в Delphi обычно P используется при описании указателей.
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
не знаю, насколько это Вам будет полезно, но вот, кстати, из чужой лабы кусочек..
Код: Выделить всё
Const
n_items=7;
l_name=30;
Type
tname=string[l_name];
pMan=^Man;
Man=record
name:tname;
birth:integer;
pay:real;
next :p Man;
prev :p Man;
end;
Var
DefaultMode,ActiveColor,InactiveColor:word;
key:char;
item:word;
prev:word;
beg :p Man;
fin :p Man;
p :p Man;
name:tname;
person:Man;
procedure Add(var beg,fin :p Man; const person:Man);
var p :p Man;
begin
new(p);
p^:=person;
p^.next:=nil;
p^.prev:=fin;
if beg=nil
then beg:=p
else fin^.next:=p;
fin:=p;
end;
........
procedure Del(var beg,fin,p :p Man);
begin
if (p=beg) and (p=fin) then
begin
beg:=nil;
fin:=nil;
end
else
if p=beg then
begin
beg:=beg^.next;
beg^.prev:=nil;
end
else
if p=fin then
begin
fin:=fin^.prev;
fin^.next:=nil;
end
else
begin
p^.prev^.next:=p^.next;
p^.next^.prev:=p^.prev;
end;
dispose(p);
end;
procedure ReadFile(var beg,fin :p Man);
var
f:text;
person:Man;
begin
{$I-}
assign(f,'dbase.txt');
reset(f);
if(IOResult<>0) then Error('Oaee dbase.txt ia iaeaai!');
{$I+}
while not eof(f) do
begin
with person do readln(f,name,birth,pay);
Add(beg,fin,person); {aiaaaeaiea yeaiaioa a nienie}
end;
close(f);
end;
Begin
beg:=nil;
fin:=nil;
ReadFile(beg,fin);
....
end.