Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2007, 23:13   #1
Lexakazanskij
Пользователь
 
Аватар для Lexakazanskij
 
Регистрация: 10.09.2007
Сообщений: 15
Печаль Сортированные списки

Пожалуйста помогите, нет времени разбираться в алгоритме

Разработать программу, которая строит список, сортированный по возрастанию элементов, из целых чисел, вводимых с клавиатуры. Количество чисел неизвестно, но отлично от нуля. Конец ввода – по комбинации CTRL-Z . Обеспечить просмотр элементов списка.

Задача состоит из нескольких этапов:

1. Вставка первого элемента
2. Вставка последующих в зависимости от их величины:

а) перед первым (в начало), который больше чем добавляемый;
б) в середину (перед заданным);
в) в конец;


Выполните задание по приведённому ниже алгоритму:
Изображения
Тип файла: jpg алгоритм.JPG (63.8 Кб, 150 просмотров)
Lexakazanskij вне форума Ответить с цитированием
Старый 21.12.2007, 11:56   #2
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
По умолчанию

Посмотри эту тему там найдеш то что тебе нужноhttp://www.programmersforum.ru/showthread.php?t=11398
I like WPF
kommunist вне форума Ответить с цитированием
Старый 21.12.2007, 12:05   #3
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
По умолчанию

А вот сортировка списка
Код:
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.
I like WPF
kommunist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки Вилен Общие вопросы C/C++ 3 22.05.2008 00:40
списки Влдислаав3911 Паскаль, Turbo Pascal, PascalABC.NET 5 10.05.2008 17:35
Списки... Arkuz Компоненты Delphi 2 19.04.2008 22:58
Списки AVer Паскаль, Turbo Pascal, PascalABC.NET 6 06.12.2006 23:05