Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.06.2014, 23:26
Abikutin Abikutin вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 6
Версия Delphi: Delphi 7 ,
Репутация: 10
По умолчанию Очередь. Не получается добавлять в конец

Очередь через односвязные списки.
Код:
type
Tinfo=record
FamIO, Nazv: string[20];
Year: integer;
end;

PElem=^TElem;
  TElem=record
          Info: TInfo;
          Next: PElem;
  End;

TOcher = record
First, Last : PElem; //Указатели на первый и на последний элемент очереди.
end;

Процедура добавления в конец.
Код:
procedure AddLast(var Ocher: TOcher; var Data : TInfo);
var NewElem:PElem;
begin
new(NewElem);
NewElem^.Info := Data;
NewElem^.Next := Ocher.First;
Ocher.first := NewElem;
end;

Проверка на пустоту очереди
Код:
function IsEmpty(var Ocher: TOcher): Boolean;
begin
if (Ocher.First = nil) then
Result := true
else
Result := false;
End;

Процедура удаления с начала.
Код:
procedure DelFirst(var Ocher: TOcher); //удаление(первого)
begin
if IsEmpty(Ocher) then Ocher.Last:=nil
else
Ocher.First:=Ocher.First.Next;
end;

Процедура перебора элементов
Код:
Procedure Pereklad(var Ocher1, Ocher2:TOcher);
var Info:TInfo;
begin
  Info:=Ocher1.first.Info;
  AddLast(Ocher2,Info);
  DelFirst(Ocher1);
end;


Кнопка добавления в очередь
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
r:TInfo;
begin
r.FamIO:=Edit1.Text;
r.Nazv:=Edit2.Text;
r.Year:=StrToInt(Edit3.Text);
if (Edit1.text<>'') and (Edit2.text<>'') and (Edit3.text<>'') then
AddLast(Ocher,r);

end;

Кнопка вывода в список(в Лист Бокс)
Код:
procedure TForm1.Button4Click(Sender: TObject);
var DopOcher:TOcher;
begin
OcherInit(DopOcher);
List.Items.Clear;
If IsEmpty(Ocher) then List.Items.Add('(пусто)');

while not IsEmpty(Ocher) do
begin;
List.Items.Add(Ocher.First.Info.FamIO +'       '+ Ocher.First.Info.Nazv +'             '+ IntToStr(Ocher.First.Info.Year));
  Pereklad(Ocher,DopOcher);
end;
while not IsEmpty(DopOcher) do
begin;
  Pereklad(DopOcher,Ocher);
end;

end;


в итоге добавляет , но в начало. Как изменить так, чтобы добавлял в конец?
Ответить с цитированием
  #2  
Старый 23.06.2014, 00:01
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Abikutin
...Процедура добавления в конец.
Код:
procedure AddLast(var Ocher: TOcher; var Data : TInfo);
var NewElem:PElem;
begin
new(NewElem);
NewElem^.Info := Data;
NewElem^.Next := Ocher.First;
Ocher.first := NewElem;
end;
...
First - это первый, Last последний, не тот указатель используется, скорее всего из-за этого
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Abikutin (23.06.2014)
  #3  
Старый 23.06.2014, 00:12
Abikutin Abikutin вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 6
Версия Delphi: Delphi 7 ,
Репутация: 10
По умолчанию

К сожалению, нет.
Если я меня 7ую строчку на Ocher.Last , то вылетает ошибка

Access violation at adress 004533E8 in module 'Project1.exe'. Write of address 00429F48

При прохождении процедуры перекладывания очереди.
Ответить с цитированием
  #4  
Старый 23.06.2014, 00:47
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Пытаюсь повторить, OcherInit() - что за процедура, без неё добавляется дубль записей, и затем вылетает с ошибкой в перекладе на инициализации переменной Info
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Abikutin (23.06.2014)
  #5  
Старый 23.06.2014, 00:52
Abikutin Abikutin вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 6
Версия Delphi: Delphi 7 ,
Репутация: 10
По умолчанию

А, забыл её выложить.
Код:
procedure OcherInit(var Ocher : TOcher);
begin
  Ocher.First := nil;
  Ocher.Last := nil;
end;

используется ещё вот здесь


Код:
var Ocher: TOcher;
procedure TForm1.FormCreate(Sender: TObject);
begin
OcherInit(Ocher);
end;

Последний раз редактировалось Abikutin, 23.06.2014 в 00:57.
Ответить с цитированием
  #6  
Старый 23.06.2014, 01:10
Abikutin Abikutin вне форума
Прохожий
 
Регистрация: 22.06.2014
Сообщения: 6
Версия Delphi: Delphi 7 ,
Репутация: 10
По умолчанию

Вот вся программа, но там ещё несколько пока что не доделанных процедур есть...
Вложения
Тип файла: rar tr2.rar (174.7 Кбайт, 0 просмотров)
Ответить с цитированием
  #7  
Старый 23.06.2014, 06:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Только сейчас дошло - вы объявили тип записи (рекорда) элементом односвязного списка по принципу sll, а предпологаете от него функционал двухсвязного dll, для реализации такого требуется небольшая переделка. Подробности здесь
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Abikutin (23.06.2014)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter