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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2013, 12:50   #1
maksimum
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 21
По умолчанию delphi двунаправленный циклический список (доработать)

Здравствуйте, уважаемые форумчане! Нужна помощь в доработке моей первой программы на Delphi.
Есть задача на работу с двунаправленным циклическим списком без головного элемента:
Описать класс Spisok, в который входят следующие методы:
Создание пустого списка.
Подсчет количества элементов списка.
Вывод на экран содержимого списка в виде таблицы.
Вставка элемента в начало или в конец списка (оба варианта).
Исключение элемента из начала или конца списка (оба варианта).
Сохранение списка в файле.
Восстановление списка из файла.
Уничтожение списка с освобождением памяти.
Описать класс Spis2 , потомок класса Spisok, в который добавить методы:
Включить новый элемент вместо i-го по номеру элемента;
Исключить элемент с соответствующим ключом;
Поменять местами элемент с максимальным нечетным значением ключа и первый элемент списка.
Есть код однонаправленного списка с нужными процедурами.

Помогите разобраться и переделать этот код для двунаправленного списка. Вот попытка переделать процедуру добавления элемента в конец. Ошибок никаких не выдало, но и пр нажатии на кнопку ничего не происходит
Код:
type
  link = ^element;
  element  = record
       key : integer;
       info : variant;
       prev,next : link
end;
------------------
procedure TfrmMain.InsertElementInEnd(var el : link;var first : link);


begin
  if first = nil then
  begin
    first := el;
    el^.next := el;
    el^.prev := el;
  end
    else
  begin
    el^.next := first;
    el^.prev := first^.prev;
    first^.prev^.next := el;
    first^.prev := el;
  end;
end;
Вложения
Тип файла: rar список.rar (194.4 Кб, 7 просмотров)
maksimum вне форума Ответить с цитированием
Старый 16.04.2013, 12:58   #2
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

А где извиняюсь форма uMain.pas

Код:
begin
  if first = nil then
  begin
    first := el;
    el^.next := el;
    el^.prev := el;
  end
    else
  begin
    el^.next := first;
    el^.prev := first^.prev;
    first^.prev^.next := el;
    first^.prev := el;
  end;
end;
Обычно на крайних элементах, ссылки на следующие/предыдущие элементы приравнивают nil, т.е.

Код:
begin
  if first = nil then
  begin
    first := el;
    el^.next := nil;
    el^.prev := nil;
  end
    else
  begin
    el^.next := nil;
    el^.prev := first^.prev;
    first^.prev^.next := el;
    first^.prev := el;
  end;
end;
Млин а дальше я уже запутался в ваших ссылках, перессылках... Для себя попробуйте нарисуйте данный массив на бумажке для себя, и проанализируйте поведение указателя/бегунка при разных действиях..

И потом что именно вы передаете в переменной first - указатель на начало списка?

Последний раз редактировалось netpolice; 16.04.2013 в 13:16.
netpolice вне форума Ответить с цитированием
Старый 16.04.2013, 15:27   #3
maksimum
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 21
По умолчанию

спасибо за поправку, сейчас попробую разобраться. архив перезалил
Вложения
Тип файла: rar список.rar (212.3 Кб, 8 просмотров)
maksimum вне форума Ответить с цитированием
Старый 16.04.2013, 15:54   #4
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

У Вас в rar-е все практически готово нужно, только добавить одну строчку el^.prev:=temp; Сами догадаетесь куда? Про хвостовые нилы не забывайте.


Да и еще: в двунаправленных списках, помимо начала обычно известно и конец списка. Если у вас так то задача проще решается...


А я знаете че заметил: Список то циклический, тогда Вы правы, что при нулевом списке, первый элемент добавляется со ссылками на себя, но в таком случае у нас нет ни начала ни конца списка. И как мы добавим в конец элемент?

Последний раз редактировалось netpolice; 16.04.2013 в 16:17.
netpolice вне форума Ответить с цитированием
Старый 17.04.2013, 04:49   #5
maksimum
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от netpolice Посмотреть сообщение
Список то циклический, тогда Вы правы, что при нулевом списке, первый элемент добавляется со ссылками на себя, но в таком случае у нас нет ни начала ни конца списка. И как мы добавим в конец элемент?
я вот тоже на этом моменте запутался, уже перечитал много литературы, но ещё больше не понял. может код для добавление в конец и в начало списка один и тот же?
На другом форуме видел такой пример
ссылка
вроде там используется двунаправленный циклический список, но сделав так на своей программе вообще не работает.
maksimum вне форума Ответить с цитированием
Старый 17.04.2013, 09:24   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

любой список предполагает добавление до/после определенного элемента.

Добавление в конец = найти последний + добавить после.
У нас нет понятия последний. => нельзя добавить в конец.
Но мы всегда можем вставить до(или после) некоторого.
Если мы знаем (можем узнать) после которого вставлять то вставляем именно туда.
Если мы не может сказать после которого (или до которого) вставлять, значим нам БЕЗРАЗЛИЧНО это самое место вставки. Значит можно вставлять в любое удобное место.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.04.2013, 09:38   #7
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
любой список предполагает добавление до/после определенного элемента.

Добавление в конец = найти последний + добавить после.
У нас нет понятия последний. => нельзя добавить в конец.
Но мы всегда можем вставить до(или после) некоторого.
Если мы знаем (можем узнать) после которого вставлять то вставляем именно туда.
Если мы не может сказать после которого (или до которого) вставлять, значим нам БЕЗРАЗЛИЧНО это самое место вставки. Значит можно вставлять в любое удобное место.
Вот об этом я и говорю... Но если мы что то вставим в любое удобное место, то как мы потом это искать будем? Единственный выход я вижу, что у нас будет начало и конец в одном месте. Ну как у окружности есть 0 градусов и 360 в одном месте

Цитата:
я вот тоже на этом моменте запутался, уже перечитал много литературы, но ещё больше не понял. может код для добавление в конец и в начало списка один и тот же?
Видимо да
netpolice вне форума Ответить с цитированием
Старый 17.04.2013, 09:55   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Но если мы что то вставим в любое удобное место, то как мы потом это искать будем?
как обычно простым перебором всех (от точки входа до точки выхода =точке входа).
Цитата:
Единственный выход я вижу, что у нас будет начало и конец в одном месте.
Начало и конец для поиска (но не для вставки).
Хотя для вставки оно тоже годится.
Если мы можем искать не перебором, а каким-то другим способом основанном на УПОРЯДОЧЕННОСТИ списка, то тем самым мы всегда можем сказать в какое именно место (до/после вполне определенного) мы должны вставлять. Место определяется из требования сохранить упорядоченность.
Если упорядоченности нет, то место вставки абсолютно безразлично и выбирается она обычно наиболее простым способом (берется первый попавшийся элемент который является точкой входа и вставка идет до/после оного).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.04.2013 в 09:58.
evg_m вне форума Ответить с цитированием
Старый 18.04.2013, 08:55   #9
maksimum
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 21
По умолчанию

Ребята, легче не стало! Уже устал пробовать. Может кто подскажет пример кода или возьмётся доделать работу за вознаграждение, работу нужно сдать к концу следующей недели.
maksimum вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Двунаправленный список M_Asja Помощь студентам 4 15.01.2013 18:47
Двунаправленный список Вельвет Помощь студентам 1 10.01.2012 14:14
двунаправленный список Максикок Помощь студентам 3 02.05.2011 10:34
Двунаправленный список grave123 Общие вопросы C/C++ 1 08.03.2010 10:44
Двунаправленный список F_A_N_Alex Помощь студентам 0 01.10.2009 00:35