Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизОпять списки Найти похожие ветки
← →
wera (2003-05-28 13:03) [0]как грамотно начатаботать с линейным списком?
Что уже не пробывала..
Пишу
procedure TForm1.FormCreate(Sender: TObject);
begin
new(head);
new(teck);
new(pEnd);
head^.link:=teck;
teck^.link:=nil;
listbox1.Items.Add("
← →
Palladin (2003-05-28 13:04) [1]
> Что уже не пробывала..
а что пробовала?
← →
wera (2003-05-28 13:06) [2]не скажу - смеяться будешь :))!
Ну все же как?
← →
pasha_golub (2003-05-28 13:07) [3]УЕстетсвенно это все для BP7.
program List;
Uses CRT;
type
TData = string; {тип данных, содержащихся в списке}
PElement = ^TElement; {указатель на элемент списка}
TElement = record {элемент списка}
Data: string; {часть с данными}
Next: PElement; {указатель на следующий элемент в списке}
end;
var
Head,Current: PElement; {голова и текущий элемент списка}
procedure CreateList(var AHead, ACurrent: PElement; const AData: TData);
{создание списка, Голова списка и Данные}
begin
New(AHead); {резервируем память}
AHead^.Data := AData; {заносим данные}
AHead^.Next := nil; {следующего элемента пока нет}
ACurrent := AHead; {у нас один элемент, поэтому он текущий}
end;
procedure DestroyList(var AHead:PElement);
{уничтожить список}
var Elem: PElement;
begin
if AHead = nil then Exit; {если "голова" пуста, то выходим}
Elem := AHead^.Next; {запоминаем следующий элемент}
Dispose(AHead); {освобождаем "голову"}
while Elem <> nil do {пока элемент не пустой делать}
begin
AHead := Elem; {теперь голова у нас вот такая}
Elem := AHead^.Next; {опять находим следующий элемент}
Dispose(AHead); {освобождаем "голову"}
end;
AHead := nil;
end;
procedure AddElement(var ALast: PElement; const AData: TData);
{добавляем элемент в конец списка}
var Elem: PElement;
begin
New(Elem); {резервируем память}
Elem^.Data := AData; {заносим данные}
Elem^.Next := nil; {следующего элемента нет}
ALast^.Next := Elem; {последний элемент теперь указывает на новый}
ALast := Elem; {только что созданый теперь последний}
end;
procedure InsertFirst(var AHead: PElement; const AData: TData);
var Elem: PElement;
begin
New(Elem); {память}
Elem^.Data := AData; {данные}
Elem^.Next := AHead; {"старая голова" теперь будет следующим элементом}
AHead := Elem; {а теперь у нас новая голова}
end;
procedure InsertElement(var After: PElement; const AData: TData);
{вставляем элемент после элемента After}
var Elem: PElement;
begin
If After^.Next = nil then {если после него пусто, то }
AddElement(After,AData) {просто добавляем в конец}
else
begin { а если нет, то вставляем}
New(Elem); {память}
Elem^.Data := AData; {данные}
Elem^.Next := After^.Next; {следующим для созданного будет следующий за After}
After^.Next := Elem; {а следующий для After теперь новый вставленный}
After := Elem; {и пусть After теперь указывает на новый}
end;
end;
procedure DeleteFirst(var AHead: PElement);
{удалить "голову"}
var Elem: PElement;
begin
if AHead^.Next = nil then {если нет следующего}
DestroyList(AHead) {то просто уничтожаем}
else
begin
Elem := AHead^.Next; {запоминаем следующий после "головы" элемент}
Dispose(AHead); {освобождаем "голову"}
AHead := Elem; {теперь "голова" у нас новая}
end;
end;
procedure DeleteElement(var ABefore: PElement);
{удалить элемент после элемента Before}
var Elem: PElement;
begin
If ABefore^.Next = nil then Exit; {если нет что удалять, выходим}
Elem := ABefore^.Next; {находим элемент для удаления}
ABefore^.Next := Elem^.Next; {налаживаем связи}
Dispose(Elem); {удаляем}
end;
procedure SetCurrent(var AHead,ACurrent: PElement; const ANumber: integer);
{установить текущим элемент с номером ANumber}
var
i: integer;
begin
ACurrent := AHead; {начинаем с головы}
i := 1; {отсчет начинаем с 1}
while (ACurrent^.Next <> nil) and (i < ANumber) do {пока нет пустых элементов и i меньше нашего числа}
begin
ACurrent := ACurrent^.Next; {переходим к следующему элементу}
inc(i); {i:=i+1}
end;
end;
procedure ViewList(const AHead: PElement);
{просмотреть весь список с начала}
var Elem: PElement;
begin
Elem := AHead; {начинаем с головы}
while Elem <> nil do {пока не пустой элемент}
begin
writeln(Elem^.Data); {выводим на экран}
{Elem^.Data := "Hello" + Elem6.Data;} {!!! а можно вставить любые действия, например}
Elem := Elem^.Next; {берем следующий элемент}
end;
end;
{==============}
begin
clrscr;
CreateList(Head,Current,"1");
AddElement(Current,"3");
Current := Head;
InsertElement(Current,"2");
ViewList(Head);
readln;
{---------}
DeleteFirst(Head);
ViewList(Head);
readln;
{-----------}
InsertFirst(Head,"Первый");
ViewList(Head);
readln;
{-----------}
SetCurrent(Head,Current,4);
AddElement(Current,"Этот мы удалим");
AddElement(Current,"Последний");
ViewList(Head);
readln;
{----------}
SetCurrent(Head,Current,3);
DeleteElement(Current);
ViewList(Head);
readln;
{----------}
Destroylist(Head);
end.
← →
pasha_golub (2003-05-28 13:08) [4]Прошу прощения, на самом деле объявления типа выглядит таким образом:
TElement = record {элемент списка}
Data: TData; {часть с данными}
Next: PElement; {указатель на следующий элемент в списке}
end;
← →
Zelius (2003-05-28 13:15) [5]Почему бы не воспользоваться коллекциями? Очень удобно и практично!
← →
wera (2003-05-28 13:18) [6]что за коллекции?
← →
Skier (2003-05-28 13:22) [7]>wera © (28.05.03 13:18)
Милая барышня, расскажите нам подробно про то что же Вам нужно
сделать (получить) в конечном итоге, т.е. какое у Вас задание, требование и т.д. в противном случае, Вашим вопросам (видимо) не будет конца, а нам будет трудно Вам помочь...
(прошу прощения что говорю за всех...:) )
← →
Palladin (2003-05-28 13:25) [8]да обыкновенное задание на работу со связанными однонаправлеными списками...
я вот хочу узнать что же автор ожидал от этого кода
procedure TForm1.FormCreate(Sender: TObject);
begin
new(head);
new(teck);
new(pEnd);
head^.link:=teck;
teck^.link:=nil;
listbox1.Items.Add("
← →
Lord Warlock (2003-05-28 13:45) [9]А PEnd - очевидно указатель на конец списка..
изначально он должен равняться текущему элементу, и изменяться по мере добавления элементов в списке
> teck должен изначально быть равен head...
а тут как раз наоборот, head изначально должен равняться teck
(это я не придираюсь, а уточняю :)
← →
wera (2003-05-28 13:47) [10]>pasha_golub ©
огромное тебе спасибо , все теперь заработало как надо
← →
pasha_golub (2003-05-28 13:59) [11]>wera
Пожалста...
ЗЫ: А еще и на машинке могу, мр-р-р. (Кот Матроскин)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c