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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2013, 16:41   #1
tgig
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 10
По умолчанию Удаление элемента в двусвязном списке (Delphi).

Добрый день! Найдите плиз ошибку((. С помощью процедуры нужно удалить элемент из начала двунаправленного списка.

Код:
unit Unit3;

interface

uses Spisok;
procedure delet(var spis1:dynspisok);forward;

implementation

procedure delet;
var
cur,spisR,spisL:dynspisok;
begin
    
    if spis1 = nil then exit;
        if spis1^.prev<>nil then spis1:=spis1^.prev;
        while (spis1 <> nil) do
        begin
        cur := spis1;
        spisR := cur^.next;
        spisL := nil;
        dispose(cur);
        spisR^.prev := spisL;
        spis1 := spis1^.next;
      end;
   end;
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.
tgig вне форума Ответить с цитированием
Старый 09.10.2013, 16:45   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

добрый день.

во-первых, где сам модуль spisok.pas ?!

во-вторых, а почему Вы не описываете процедуру удаления прямо в том модуле, где описан сам тип dynspisok и заданы процедуры/функции по его обработке?

в-третьих, Вы уверены, что в вашем коде ошибка? И в чём она выражается?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2013, 17:03   #3
tgig
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 10
По умолчанию

Все в разных модулях, так как таково задание.
Ниже модули описания класса, и основной программы.
При нажатии кнопки2 после вывода списка выдает ошибку и выделяет строчку помеченную
Код:
if spis1^.prev<>nil then spis1:=spis1^.prev;
в Unit3.
Код:

unit Spisok;

interface
type
dynspisok = ^spis;
spis = record
index:integer;
data:String[15];
prev,next:dynspisok;
end;

implementation

end.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, dynspiod,output,Spisok, Unit2,Unit3;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  spisok:dynspisok;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
  spisok:=sps;
  {outthat(form1.StringGrid1,spisok);}
     
end;



procedure TForm1.Button4Click(Sender: TObject);
begin
  outthat(form1.StringGrid1,spisok);
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  delet(spisok);
end;

end.

Последний раз редактировалось tgig; 09.10.2013 в 17:07.
tgig вне форума Ответить с цитированием
Старый 10.10.2013, 10:08   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от tgig Посмотреть сообщение
Все в разных модулях, так как таково задание.
Код:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, dynspiod,output,Spisok, Unit2,Unit3;

...
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
  spisok:=sps;
  {outthat(form1.StringGrid1,spisok);}
     
end;



procedure TForm1.Button4Click(Sender: TObject);
begin
  outthat(form1.StringGrid1,spisok);
end;
я, к сожалению, не смогу Вам помочь - мне для этого недостаточно данных (выделил отсутствующее). я же не знал, что Вы чуть ли не каждую строчку в отдельном модуле пишете..
Попробуйте выложить исходники проекта (запаковав их предварительно в архив, конечно), можно попытаться посмотреть.
Ну ли пройдитесь по процедуре удаления в отладке пошагово...


Цитата:
При нажатии кнопки2 после вывода списка выдает ошибку
Какую ошибку выдаёт, известно?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2013, 10:36   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
С помощью процедуры нужно удалить элемент из начала двунаправленного списка
подробнее сформулируйте задачу.

1. какой элемент мы указываем для удаления.
-- любой из входящих в список ( у вас в коде нет выхода на первый!)
-- именно тот который хотим удалить (а зачем тогда удаление в цикле!)

2 какой элемент будем удалять
-- именно тот который указали (зачем цикл!)
-- все предшествующие указанному (но!
Код:
        spisL := nil;
        dispose(cur);
        spisR^.prev := spisL; 
здесь мы теряем левую(prev) цепочку
и вообще движение в цикле идет вперед(next) от текущего -- именно тот который указан (см. выше про цикл)
-- только строго первый (см выше про цикл)
-- все последующие (становится более понятен цикл, но потеря prev остается!)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.10.2013 в 10:40.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с удалением элемента в списке JonnyFletcher Общие вопросы Delphi 1 26.05.2013 21:32
Сортировка char в двусвязном списке preanik Помощь студентам 0 12.05.2013 02:18
В двусвязном списке продублировать те элементы, которые меньше следующего, но больше больше предыдущего. gvenog Помощь студентам 0 13.12.2010 21:20
winapi выбор элемента в списке mapt34 Win Api 1 13.06.2010 19:41
Удаление элемента из массива (Delphi) Alyonka_v Помощь студентам 3 17.08.2009 20:04