IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Двунаправленный список(Delphi), задание сделал, но двунаправленостью не пахнет
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Задание следующее...

Элементы двунаправленного списка имеют следующую структуру:
Шифр детали
Наименование
Цена
Вес
Указатель предыдущего
Указатель последующего
Удалить элемент с заданным номером К от начала списка.

задание выполнил используя пример однонаправленого списка...
помогите/объясните как сделать задание с двунаправлеными списками...

вот код
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
GroupBox2: TGroupBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Label4: TLabel;
Edit3: TEdit;
Edit4: TEdit;
GroupBox3: TGroupBox;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
GroupBox4: TGroupBox;
Label13: TLabel;
Edit5: TEdit;
Edit6: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type PElem=^TElem; //Описание указателя на элемент
TElem= record //Описание элемента
shifr: string[5];
naim: string[10];
cena:string[2];
ves:string[3];
st:integer;
sled: PElem;
pred: PElem;
end;

var
Form1: TForm1;
p, head,zad, last, nex: PElem;
t,i:integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

head:=Nil;
last:=Nil;
nex:=Nil;
t:=0;
end;
//добавление
procedure TForm1.Button1Click(Sender: TObject);
begin
New(p);
p^.shifr:=Edit1.Text;
p^.naim:=Edit2.text;
p^.cena:=Edit3.Text;
p^.ves:=Edit4.Text;
t:=t+1;
Edit6.Clear;
Edit6.Text:=inttostr(t);
P^.st:=strtoint(Edit6.Text);
If head=Nil Then head:=p
Else
last^.sled:=p;
P^.sled:=Nil;
Last:=p;
end;
//просмотр
procedure TForm1.Button3Click(Sender: TObject);
begin
P:=Head;
Label9.Caption:=''; Label10.Caption:='';
Label11.Caption:=''; Label12.Caption:='';
While P <> Nil Do
Begin
Label9.Caption:=Label9.Caption+chr(13)+P^.shifr;
Label10.Caption:=Label10.Caption+chr(13)+P^.naim;
Label11.Caption:=Label11.Caption+chr(13)+P^.cena;
Label12.Caption:=Label12.Caption+chr(13)+P^.ves;
P:=P^.sled;
End;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;
//удаление элемента с заданным номером
procedure TForm1.Button2Click(Sender: TObject);
begin
i:=0;
P:=Head;
While P<>Nil Do
Begin
If StrToInt(Edit5.Text)-1=i Then
Begin
If P=Head Then
Begin
Head:=P^.sled;
Dispose(P);
P:=Head;
End
Else
Begin
If P^.sled=Nil Then
begin
Last^.sled:=Nil;
end
Else
Begin
Last^.sled:=P^.sled;
End;
dispose(P);
P:=Last;
End;
End;
Last:=P;
P:=P^.sled;
inc(i);
End;
end;

end.

в этом коде однонаправленый список... нужен двунаправленый по заданию...

в прикреплёном архиве все файлы проекта...


Прикрепленные файлы
Прикрепленный файл  ____2.rar ( 9.56 килобайт ) Кол-во скачиваний: 285
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
очень глЮпый вопрос, а где тут двунаправленость?)
Точно там же, где и предложенное мной выше разделение на данные/указатели... Ты ж этого не сделал?

Если б ты все-таки отделил данные от указателей pred/sled, то можно было бы элементарно отсортировать список без рекурсии, например так:
procedure TForm1.Button7Click(Sender: TObject);
var
i, j: pelem;
T: myRecord;
begin
i := head;
while i <> nil do begin
T := i^.data.shifr;
j := i^.pred;
while (j <> nil) and (T < j^.data.shifr) do begin
j^.sled^.data := j^.data;
j := j^.pred;
end;

if j = nil then first^.data := T
else j^.sled^.data := T;

i := i^.sled;
end;
, но поскольку ты пошел "другим путем" (С) - этот номер не пройдет...

Кстати, проверь работу сортировки как следует... По-моему для двунаправленного списка она отрабатывает не совсем корректно: если ты захочешь после сортировки пробежать по списку в обратном направлении, тебя может ждать сюрприз...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


я немного не врубился... если используем рекурсию в коде, то при сортировке двунаправленого списка разве не нужна ссылка на предыдущий элемент в этом коде?

procedure TForm1.Button7Click(Sender: TObject);
function insert_sort(l: pelem): pelem;

function insert(p: pelem; l: pelem): pelem;
begin
p^.sled := nil;
if l = nil then insert := p
else
if p^.shifr < l^.shifr then begin
p^.sled := l; insert := p;
end
else begin
l^.sled := insert(p, l^.sled);
insert := l;
end;
end;

begin
if l = nil then insert_sort := nil
else insert_sort := insert(l, insert_sort(l^.sled));
end;

begin
if head <> nil then begin
head := insert_sort(head);
end
else begin
ShowMessage('Нечего сортировать');
end;


у нас не спрашива.т разделение на данные и указатели, точнее, так не надо делать... препод ничего насчёт этого не говорил...

в коде выше как двунаправленость засунуть?)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
krox   Двунаправленный список(Delphi)   12.10.2008 16:41
volvo   Во-первых, у тебя Дельфи, а для Дельфи есть соотве…   12.10.2008 17:04
krox   хм... получается, что вначале надо изменить проце…   12.10.2008 19:33
volvo   Ну, как знаешь... А я подсказывать тебе, как некор…   12.10.2008 20:28
krox   вся проблема в том, что ООП ещё не проходили.... и…   12.10.2008 20:30
volvo   Записи и процедуры/функции знаешь, как использоват…   13.10.2008 17:26
krox   спасибо тебе, volvo... сёдня был на паре... показа…   13.10.2008 19:06
мисс_граффити   Нас так же учили... Программирование на языках вы…   14.10.2008 5:33
krox   Препод сказал ещё сортировку по любому ключу приле…   25.10.2008 18:42
volvo   По-моему, ты недооцениваешь преимущества Паскаля/Д…   25.10.2008 19:11
krox   спасибо) работает) очень грамотный и тонкий наёп с…   25.10.2008 21:06
volvo   Точно там же, где и предложенное мной выше разделе…   25.10.2008 21:29
krox   я немного не врубился... если используем рекурсию …   26.10.2008 16:19
volvo   Как хочешь так и засовывай... Заодно засунь трехна…   26.10.2008 16:52
krox   попытаюсь объяснить преподу эту точку зрения... х…   26.10.2008 17:07
krox   можешь ещё с выводом элементов в обратном порядке …   26.10.2008 17:31
krox   наконец-то нашёл двунаправленое удаление элементов…   30.11.2008 16:16


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 2:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name