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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2008, 20:42   #1
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию Динамические переменные, делфи, в чем ошибка

Задача такова: нужно создать односвязный список, и удалить из него последний элемент. Ну как я понял, мы вводим некоторое количество цифр, программа удаляет последний. То есть мы создаем список. Затем, созлаем новый элемент и присваиваем ему значение nil, а потом этот элемент dispos. Если что-то не так, а я почему то уверен что что-то не так то прошу напишите здесь. Словесный алгоритм решения мне бы очень помог. Строго не судите делфи занимаюсь не очень много.

вот то, что написал я:

Цитата:
implementation

{$R *.dfm}
type
link=^item;
item=record
g: integer;
v:link;
end;
var pyl,basis,p: link;
k: integer;
begin
basis:=nil;
for k:=0 to Form1.Memo1.Lines.Count-1 do begin
new(pyl);
pyl^.g:=StrToInt(Form1.Memo1.Lines[k]);
pyl^.v:=basis;
basis:=pyl;

procedure Udal(var r:link);
pyl,basis,p:link;
new(p);
if pyl^.v=nil then p:=pyl;
dispose(p);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Udal(r);
end;

end.
Agent[PNZ] вне форума Ответить с цитированием
Старый 04.05.2008, 21:03   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Код:

type
   link=^item;
   item=record
      g: integer;
      v:link;
    end;


var basis: link;
procedure TForm1.FormCreate(Sender: TObject);
var k : integer;
    pyl:link;
begin
   basis:=nil;
   for k:=0 to Form1.Memo1.Lines.Count-1 do begin
     new(pyl);
     pyl^.g:=StrToInt(Form1.Memo1.Lines[k]);
     pyl^.v:=basis;
     basis:=pyl;
   end;
end;

// Удалить последний - элемент не известен
// не нужно параметра
procedure UdalLast;
var p:link;
begin
   if basis = nil then exit;
   // Сначала нужно найти последний элемент
   p := basis;
   if p.v = nil then begin
      // Первый элемент = последнему
      dispose(p);
      basis := nil;
   end else begin
      // p.v <> nil - в списке > 1 элемента
      while p.v.v <> nil do begin
         p := p.v;
      end;
      // теперь p - предпоследний
      dispose(p.v);
      p.v := nil;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var k:integer;
begin
   // Сколько элементов добавили, столько и удаляем
   for k:=0 to Form1.Memo1.Lines.Count-1 do begin
      UdalLast;
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 04.05.2008, 21:04   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

удаление элемента из списка

найти удаляемый элемент (tek:=) и его предыдущий(prev:=)
исхлючить элемент из списка (заменить ссылку) prev.link:=tek.link;
освободить память dispose(tek)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.05.2008, 21:26   #4
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

А в форме это выглядит как?У нас МЕМО1 - это куда мы вводим числа, правильно?а выводится список без последнего элемента куда?
Agent[PNZ] вне форума Ответить с цитированием
Старый 04.05.2008, 21:32   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Agent[PNZ] Посмотреть сообщение
А в форме это выглядит как?У нас МЕМО1 - это куда мы вводим числа, правильно?а выводится список без последнего элемента куда?
Тогда не надо удалять все элементы. Сделайте как у Вас и было - один вызов. После него проход по всем элементам списка и добавление данных в другое memo или в то-же самое по желанию
alexBlack вне форума Ответить с цитированием
Старый 04.05.2008, 22:18   #6
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Тогда не надо удалять все элементы. Сделайте как у Вас и было - один вызов. После него проход по всем элементам списка и добавление данных в другое memo или в то-же самое по желанию
а как в таком случае будет выглядить программа?
Agent[PNZ] вне форума Ответить с цитированием
Старый 04.05.2008, 22:21   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вроде бы речь шла о словесном алгоритме

Код:
procedure TForm1.Button1Click(Sender: TObject);
var k:integer;
    p:link;
begin
   //for k:=0 to Form1.Memo1.Lines.Count-1 do begin
   UdalLast;
   p := basis;
   while p <> nil do begin
      memo1.Lines.add(intToStr(p.g));
      p := p.v
   end;
   //end;
end;
alexBlack вне форума Ответить с цитированием
Старый 04.05.2008, 22:28   #8
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Вроде бы речь шла о словесном алгоритме
спасибо большоещас наберу подредактирую напишу тогда работает ли
Agent[PNZ] вне форума Ответить с цитированием
Старый 04.05.2008, 22:36   #9
Agent[PNZ]
Пользователь
 
Регистрация: 20.11.2007
Сообщений: 37
По умолчанию

Вот что в итоге:
Код:
type
   link=^item;
   item=record
      g: integer;
      v: link;
    end;


var basis: link;
procedure TForm1.FormCreate(Sender: TObject);
var k : integer;
    pyl:link;
begin
   basis:=nil;
   for k:=0 to Form1.Memo1.Lines.Count-1 do begin
     new(pyl);
     pyl^.g:=StrToInt(Form1.Memo1.Lines[k]);
     pyl^.v:=basis;   
     basis:=pyl;
   end;
end;

// Удалить последний - элемент не известен   
// не нужно параметра   
procedure UdalLast;
var p:link;   
begin   
   if basis = nil then exit;
   // Сначала нужно найти последний элемент   
   p := basis;   
   if p.v = nil then begin
      // Первый элемент = последнему   
      dispose(p);   
      basis := nil;
   end else begin   
      // p.v <> nil - в списке > 1 элемента   
      while p.v.v <> nil do begin
         p := p.v;
      end;
      // теперь p - предпоследний
      dispose(p.v);
      p.v := nil;   
   end;   
end;
  
procedure TForm1.Button1Click(Sender: TObject);   
var k:integer;
    p:link;
begin
   //for k:=0 to Form1.Memo1.Lines.Count-1 do begin
   UdalLast;
   p := basis;   
   while p <> nil do begin
      memo1.Lines.add(intToStr(p.g));   
      p := p.v
   end;   
   //end;

end;
end.
на форме у меня МЕМО1 - куда вводим в столбик числа, МЕМО2 - куда должны они выводится, кнопка закрыть и кнопка выполнить. Почему-то когда нажимаю кнопку выполнить ничего не происходит вообще, но программа компелируется и запускается.
Agent[PNZ] вне форума Ответить с цитированием
Старый 04.05.2008, 22:45   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
МЕМО2 - куда должны они выводится
А в form1.ButtonClick - memo1

Что-то все-таки происходит - список выводится в memo1
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить косяк в задаче на динамические переменные списки Taisja Помощь студентам 2 31.05.2008 21:49
переменные FoxPro Vasya Свободное общение 0 27.01.2008 00:29
Помогите, ошибка в программе. делфи Absent Помощь студентам 5 18.12.2007 17:36
простая ошибка делфи Алёна Общие вопросы Delphi 5 07.11.2007 15:54
Переменные из БД Кронос БД в Delphi 2 06.06.2007 11:26