Приветствую Вас Гость | RSS

Меню сайта

Реклама

Категории раздела
ADO [17]
ASCII и CSV [12]
Access [20]
Alias [24]
BDE [37]
BLOB поля [19]
Clipper [2]
DB2 [2]
DBASE и DBF [26]
Fox Pro [1]
Interbase [21]
MSSQL [0]
ODBC [10]
Oracle [0]
Paradox [0]
SQL [29]
Sybase [1]
База данных [0]
Закладки [2]
Записи [0]
Индексы [10]
Компоненты и Базы данных [0]
Модуль данных [3]
Отчеты [2]
Ошибки БД [17]
Поиск [16]
Поля [0]
Сортировка и Фильтр [6]
Таблицы [0]

Наш опрос
Оцените мой сайт
Всего ответов: 30

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Базы данных » Сортировка и Фильтр

Сортировка связанного списка
program noname;

type
PData = ^TData;
TData = record
next: PData;
Name: string[40];
{ ...другие поля данных }
end;

var
root: PData;
{ это указатель на первую запись в связанном списке }

procedure InsertRecord(var root: PData; pItem: PData);
(* вставляем запись, на которую указывает pItem в список начиная
с root и с требуемым порядком сортировки *)

var
pWalk, pLast: PData;
begin
if root = nil then
begin
(* новый список все еще пуст, просто делаем запись,
чтобы добавить root к новому списку *)

root := pItem;
root^.next := nil
end
{ If }
else
begin
(* проходимся по списку и сравниваем каждую запись с одной
включаемой. Нам необходимо помнить последнюю запись,
которую мы проверили, причина этого станет ясна немного позже. *)

pWalk := root;
pLast := nil;

(* условие в следующем цикле While определяет порядок сортировки!
Это идеальное место для передачи вызова функции сравнения,
которой вы передаете дополнительный параметр InsertRecord для
осуществления общей сортировки, например:

While CompareItems( pWalk, pItem ) < 0 Do Begin
where
Procedure InsertRecord( Var list: PData; CompareItems: TCompareItems );
and
Type TCompareItems = Function( p1,p2:PData ): Integer;
and a sample compare function:
Function CompareName( p1,p2:PData ): Integer;
Begin
If p1^.Name < p2^.Name Then
CompareName := -1
Else
If p1^.Name > p2^.Name Then
CompareName := 1
Else
CompareName := 0;
End;
*)

while pWalk^.Name < pItem^.Name do
if pWalk^.next = nil then
begin
(* мы обнаружили конец списка, поэтому добавляем
новую запись и выходим из процедуры *)

pWalk^.next := pItem;
pItem^.next := nil;
Exit;
end
{ If }
else
begin
(* следующая запись, пожалуйста, но помните,
что одну мы только что проверили! *)

pLast := pWalk;

(* если мы заканчиваем в этом месте, то значит мы нашли
в списке запись, которая >= одной включенной. Поэтому
вставьте ее перед записью, на которую в настоящий момент
указывает pWalk, которая расположена после pLast. *)

if pLast = nil then
begin
(* Упс, мы вывалились из цикла While на самой первой итерации!
Новая запись должна располагаться в верхней части списка,
поэтому она становится новым корнем (root)! *)

pItem^.next := root;
root := pItem;
end
{ If }
else
begin
(* вставляем pItem между pLast и pWalk *)
pItem^.next := pWalk;
pLast^.next := pItem;
end;
{ Else }
(* мы сделали это! *)
end; { Else }
end; { InsertRecord }

procedure SortbyName(var list: PData);
var

newtree, temp, stump: PData;
begin
{ SortByName }

(* немедленно выходим, если сортировать нечего *)
if list = nil then
Exit;
(* в
newtree := Nil;

(********
Сортируем, просто беря записи из оригинального списка и вставляя их
в новый, по пути "перехватывая" для определения правильной позиции в
новом дереве. Stump используется для компенсации различий списков.
temp используется для указания на запись, перемещаемую из одного
списка в другой.
********)

stump := list;
while stump <> nil do
begin
(* временная ссылка на перемещаемую запись *)
temp := stump;
(* "отключаем" ее от списка *)
stump := stump^.next;
(* вставляем ее в новый список *)
InsertRecord(newtree, temp);
end;
{ While }

(* теперь помещаем начало нового, сортированного
дерева в начало старого списка *)

list := newtree;
end;
{ SortByName }
begin

New(root);
root^.Name := 'BETA';
New(root^.next);
root^.next^.Name := 'ALPHA';
New(root^.next^.next);
root^.next^.next^.Name := 'Torture';

WriteLn(root^.name);
WriteLn(root^.next^.name);
WriteLn(root^.next^.next^.name);
end.
Категория: Сортировка и Фильтр | Добавил: Skinner (07.07.2008)
Просмотров: 519 | Рейтинг: 0.0/0
  Delphi Lab   Главная   Регистрация   Вход  
Интересная Цитата

Поиск

Магазин


Copyright MyCorp © 2024 Хостинг от uCoz