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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.05.2010, 17:32
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
Сообщение Динамические структуры (Очередь)

Запутался с синтаксисом не могу осилить, может кто подсказать?
Код:
type link=^elem;
  elem=record
  val:integer;
  val1:string;
  next:link
  end;
var
  L:link;
  Form1: TForm1;

implementation

{$R *.dfm}

-------------------------
procedure TForm1.Button10Click(Sender: TObject);
var p,q:link;
    f:textfile;
begin
assignfile(f,'File2.txt');
reset(f);
new(L);
readln(f,L.val1);
p:=L;

  While not EOF(f) do
    begin
      new(q);
      readln(f,q.val1);
      p.next:=q;
      p:=q;
    end;
  p.next:=nil;
  CloseFile(f);
  ShowMessage('Очередь создана');
end;

procedure TForm1.Button11Click(Sender: TObject);
var p:link;
begin
Label8.Caption:='';
p:=L;

  While p<>nil do
    begin
      Label8.Caption:=Label8.Caption+p.val1+' '+#13;
      p:=p.next;
    end;
end;
---Вся проблема здесь---
procedure TForm1.Button12Click(Sender: TObject);
var z,q:link;
    n,i:integer;
begin
z:=L.next;   L.next:=z.next;   dispose(z)
end;
end.
Есть файл, есть кнопки, одна считывает из файла и записывает в динамическую очередь, вторая показывает этот самы список, нужно что бы удаляла.
Удаление сделал, но только следующего элемента в очереди, а надо что бы удаляла запращиваемый, например в LabeledEdit ввёл 4 он удалил 4-й элемент из очереди...
Пробовал по разному в итоге либо прога висла, либо не шагала до N-го элемента, либо в ошибку вылетала...запутался уже с ними...
Может кто с этим знаком подскажите куда копать и как синтаксис представить. Пробовал с While - очень всё плохо, c For - что-то етсь, но ошибко-ошибко!

Последний раз редактировалось Admin, 09.05.2010 в 17:28.
Ответить с цитированием
  #2  
Старый 08.05.2010, 17:58
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

ну работать не будет, изначально ошибка ибо запись(record) при сохранение и чтении файл должны быть статической длины, а у тебя string, в следствии чего сохраняется и загружается указатель, а не текст. да и тип textfile не подходит для записей.
__________________
Arrrgh
Ответить с цитированием
  #3  
Старый 08.05.2010, 18:03
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Эм!О_о
если сделать эту кнопку:
---Вся проблема здесь---
Код:
procedure TForm1.Button12Click(Sender: TObject);
var z,q:link;
n,i:integer;
begin
z:=L.next; L.next:=z.next; dispose(z)
end;
то по тому условию, которое в ней описано, она работает, т.е. удаляет 2-ой элемент записи.
Не получается организовать это с вводом номера элемента, пример:
вот список:
--------
wer
sdf
sdg
asdf
xcv
---------
5-ть элементов, вводим 3, удаляется "sdg"
Не получается сделать цикл и заставить правильно прошагать...(
Ответить с цитированием
  #4  
Старый 08.05.2010, 18:08
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

да и next:link - это в принципе не имеет постоянный адрес так как является указателем.
__________________
Arrrgh
Ответить с цитированием
  #5  
Старый 08.05.2010, 18:14
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от urahara
да и next:link - это в принципе не имеет постоянный адрес так как является указателем.
Теперь понятно почему при каждом нажатии на кнопку он разноые элементы мне выводил, т.е. была кнопка в ней цикл
Код:
z:=L.next;
For i:=1 to n-1 do
begin
L.next:=z.next;
end;
ShowMessage(z.val1);
Вот для примера сделал и нажимал на кнопку и каждый раз при нажатии в месаге новый элемент, а не постоянный, а потом ошибка, т.к. элементы заканчивались и обращаться куда прога не сзнала...обка как раз про обращение к памяти!
И как мне сделать то с этим удалением...требуют по учёбе...
Ответить с цитированием
  #6  
Старый 08.05.2010, 18:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что ты хочешь-то сделать? словами напиши...
Ответить с цитированием
  #7  
Старый 08.05.2010, 18:44
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

ну так я что то тормознул, забудь что выше писал

сохрани указатель на первый элемент и от него считай
__________________
Arrrgh
Ответить с цитированием
  #8  
Старый 08.05.2010, 18:45
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Хочу из создаваемой очереди удалить элемент, который я укажываю методм ввода, т.е. ввожу 6 удаляется из созданого списка 6-ой элемент, ввожу 4 удаляется 4-й элемент в списке:
Для этого у меня есть файл в нём забиты уже 10 элементов, он считывается и отображается, затем ввожу номер элемента, который желаю удалить он удаляется.
Простейший способ это по указателю: z:=L.next; L.next:=z.next; dispose(z) - здемь кдалится следующий элемент в списке, т.е. 2-ой
Таким образом: "z:=L.next.next.next; L.next.next.next:=z.next;" удалится 3-ий элемент в списке...
Ответить с цитированием
  #9  
Старый 08.05.2010, 18:47
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от urahara
ну так я что то тормознул, забудь что выше писал

сохрани указатель на первый элемент и от него считай
Подскажи пжлст кодом как это сделать! Хотя бы примером-намёком, я не проф.программист, но сделать надо и не привык в ящик откладывать! Второй день мозг разношу, в данной работе это последнее задание, предидущие я выполнил, а с этим бьюсь и бьюсь...(
Ответить с цитированием
  #10  
Старый 08.05.2010, 18:58
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

вроде так, без проверка на nil:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var z,q:link;
n,i:integer;
begin
  n := 4; //уделяем 4 элимент
  if n = 1 then
    begin
      q := l;
      l := l.next;
      dispose(q);
    end
      else
    begin
      z := l;
      for i := 1 to n - 2 do
        z := z.next;
      q := z.next;
      z.next := q.next;
      dispose(q);
    end;
end;
__________________
Arrrgh
Ответить с цитированием
  #11  
Старый 08.05.2010, 19:06
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

urahara. Благодарю! Адаптировал под свои условия робит! То что надо!
Ещё раз благодарю! Сейчас сяду вникать в код! Потом надо будет его переделать, а то преподы ведь любят с подковыряться к условию и спросить что-нить эдакое))!
Не зря прошёл на ваш форум.
Рад буду сотрудничать в дальнейшем...)))))
Ответить с цитированием
  #12  
Старый 08.05.2010, 19:22
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

-------------------------------
z := L;
n:=StrToInt(LabeledEdit4.Text);
for i := 1 to n-2 do
begin
z := z.next;
q := z.next;
end;
z.next := q.next;
dispose(q);
--------------------------------
Вот, упростил до этого действия и работает именно так ак задано у меня условие в задании...теперь вижу что не атк использовал переменную "q"
Благодарю!
Сейчас попробую с проверкой на nil пошаманить)
Ответить с цитированием
  #13  
Старый 08.05.2010, 19:25
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

не правильно, ты так не сможешь удалить первый элемент.
__________________
Arrrgh
Ответить с цитированием
  #14  
Старый 08.05.2010, 19:27
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Уже увидел! Сейчас переделываю)))! Ошибко повесила даже Delphi!))
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter