Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
3-26357
dtm
2003-05-20 17:13
2003.06.09
TdxDBGrid - не изменяется в колонке dxDBGridCheckColumn состояние


3-26403
KIR
2003-05-21 17:45
2003.06.09
Можно ли программно создать резервную копию базы IB?


8-26609
Konstantin
2003-02-22 19:10
2003.06.09
Визир на Image?


3-26394
Patrick
2003-05-21 14:02
2003.06.09
UpdateSQL в ADO?


1-26596
Valeris
2003-05-28 16:25
2003.06.09
Как узнать какие функции экпортирует DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский