Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 7
1

Цепной список и обычный динамический массив

17.04.2016, 10:45. Показов 950. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Пишу цепной список, в программе есть еще односвязный список пустых ячеек. Дак вот, удалив элемент из середины цепного списка, когда я добавляю пустую ячейку в односвязный список, последний элемент цепного начинает ссылаться на удаленную позицию, это происходит в procedure TCList.AddFreeCell на 88 строке. У этих списков даже переменные для указателей разных типов, но почему-то происходит изменение в не нужном месте.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
unit Unit1;
 
interface
 
type
 
  Zveno = record
    Inf: byte;
    Next: Integer;
  end;
  PZv = ^Zv;
  Zv = record
    I: integer;
    N: PZv;
  end;
 
  TCList = class
  private
    FMass: array of Zveno;
    FFreeCell: PZv;
    First, FCount, Fblocksize, FCell: Integer;
    function NewZveno(a: byte): Zveno;
    function GetZveno(pos: integer): integer;
    function GetInf(pos: integer): byte;
    procedure SetInf(pos: integer; a: byte);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(a: byte);
    procedure AddFreeCell(a: integer);
    procedure Insert(pos: integer; a: byte);
    procedure Delete(pos: integer);
    procedure DeleteFreeCell;
    procedure Print;
    property Items[i: integer]: byte read GetInf write SetInf;
    property count: integer read FCount;
  end;
 
implementation
 
{ TCList }
 
procedure TCList.Add(a: byte);
var
  i: integer;
begin
  if FCount = 0 then
  begin
    FMass[FCount] := NewZveno(a);
    First := FCount;
    FCount := 1;
    FCell := 1;
    Exit;
  end;
  i := first;
  while FMass[i].Next <> -1 do
  begin
    i := FMass[i].Next;
  end;
  if FFreeCell = nil then
  begin
    FMass[FCell] := NewZveno(a);
    FMass[i].Next := FCell;
    FMass[FCell].Next := -1;
    Inc(FCount);
    Inc(FCell);
  end
  else
  begin
    FMass[FFreeCell.I] := NewZveno(a);
    FMass[i].Next := FFreeCell.I;
    FMass[FFreeCell.I].Next := -1;
    DeleteFreeCell;
    Inc(FCount);
  end;
 
end;
 
procedure TCList.AddFreeCell(a: integer);
var
  FreeCell: PZv;
begin
  New(FreeCell);
  FreeCell.I := a;
  FreeCell.N := FFreeCell;
  FFreeCell := FreeCell;
end;
 
constructor TCList.Create;
begin
  Fblocksize := 10000;
  SetLength(FMass, Fblocksize);
  FCount := 0;
  FFreeCell := nil;
end;
 
procedure TCList.Delete(pos: integer);
var
  a, b: integer;
begin
  if pos >= FCount then
    exit;
  a := GetZveno(pos - 1);
  b := GetZveno(pos + 1);
  pos := GetZveno(pos);
  if pos > first then
  begin
    writeln('a ', a, '    b ', b, '  pos ', pos);
    FMass[pos].Inf := 0;
    FMass[a].Next := b;
    FMass[pos].Next := -1;
    FCount := FCount - 1;
    AddFreeCell(pos);
    if pos = FCell - 1 then
      dec(FCell);
    Exit;
  end;
  if pos = first then
  begin
    FMass[first].Inf := 0;
    b := FMass[first].Next;
    FMass[first].Next := -1;
    first := b;
    FCount := FCount - 1;
    AddFreeCell(pos);
    exit;
  end;
end;
 
procedure TCList.DeleteFreeCell;
 
begin
  if FFreeCell <> nil then
    FFreeCell := FFreeCell.N;
end;
 
destructor TCList.Destroy;
begin
  Dispose(FFreeCell);
  FMass := nil;
  First := -1;
  inherited;
end;
 
function TCList.GetInf(pos: integer): byte;
begin
  result := FMass[pos].Inf;
end;
 
function TCList.GetZveno(pos: integer): integer;
var
  i, j: integer;
begin
  if pos >= FCount then
  begin
    result := -1;
    exit;
  end;
  i := First;
  j := 0;
  while j < pos do
  begin
 
    i := FMass[i].Next;
    inc(j);
  end;
  Result := i;
end;
 
procedure TCList.Insert(pos: integer; a: byte);
var
  b: integer;
 
begin
  b := GetZveno(pos - 1);
  pos := GetZveno(pos);
  if pos < FCount then
  begin
    if FFreeCell = nil then
    begin
      FMass[FCell] := NewZveno(a);
      FMass[FCell].Next := pos;
      if pos <> first then
        FMass[b].Next := FCell
      else
        first := FCell;
      Inc(FCount);
      Inc(FCell);
    end
    else
    begin
      FMass[FFreeCell.I] := NewZveno(a);
      FMass[FFreeCell.I].Next := pos;
      if pos <> first then
        FMass[b].Next := FFreeCell.I
      else
        first := FFreeCell.I;
      DeleteFreeCell;
      Inc(FCount);
    end;
  end
  else
  begin
    Add(a);
    exit;
  end;
end;
 
function TCList.NewZveno(a: byte): Zveno;
var
  P: Zveno;
begin
  P.Inf := a;
  P.Next := -1;
  Result := P;
end;
 
procedure TCList.Print;
var
  i: integer;
begin
  i := first;
  while i <> -1 do
  begin
    Writeln(FMass[i].inf: 3, i: 7);
    i := FMass[i].Next;
  end;
end;
 
procedure TCList.SetInf(pos: integer; a: byte);
begin
  FMass[GetZveno(pos)].Inf := a;
end;
 
///   Ï   Ð   Î   Â   Å   Ð   Ê   À                                                        ///   Ï   Ð   Î   Â   Å   Ð   Ê   À
 
var
  Clist: TCList;
  k, n: integer;
begin
  Clist := TCList.Create();
  for k := 0 to 10000 do
  begin
    n := random(Clist.Count);
    case random(1) of
      0: Clist.Add(Random(254) + 1);
      1:
        begin
          Clist.Delete(n);
          //CList.Insert(n,111);
        end;
    end;
  end;
  for k := 0 to 0 do
    CList.Delete(random(Clist.Count));
  Clist.Print;
  writeln;
  writeln('Count  ', Clist.Count, '  First ', Clist.first, '   Cell ',
    Clist.FCell);
  writeln;
 
  {while Clist.FFreeCell <> nil do
  begin
    writeln(Clist.Items[Clist.FFreeCell.i]: 5, '  Free   ', Clist.FFreeCell.i:
      5);
    Clist.FFreeCell := Clist.FFreeCell.n;
  end;                        }
  Clist.Destroy;
  readln;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2016, 10:45
Ответы с готовыми решениями:

Разработать алгоритм внесения элемента в цепной список
Задача такова: Необходимо Разработать алгоритм внесения элемента в цепной список.

Переделать обычный массив в динамический
Помогите пожайлуста переделать обычный масив в динамический #include &quot;stdafx.h&quot; #include...

Выгрузить массив в Динамический Список
М=НаСервере(); //М - Это Массив ...

Заменить массив структур на динамический список
Всем привет) Есть задание: описать структуру с именем TRAIN, содержащую следующие поля: • ...

3
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
17.04.2016, 11:56 2
чем цепной список отличается от односвязного?
и где он "есть" в приведенном куске?
и почему процедуры вывода (writeln) перемешаны с кодом класса?
у вас консольная программа?
и почему 10000 а не 100 000 000 ?
0
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 7
17.04.2016, 12:05  [ТС] 3
krapotkin, 1) цепной завязан на динамическом массиве, массив содержит данные FMass[i].Inf, и ссылку на следующий элемент массива FMass[i].Next, т.к. при хранении данных ячейки могут быть заполнены беспорядочно, и мы можем ссылаться, например, из 5 ячейки в 10 или 3, а из то к примеру в 11, но если ссылка будет на ячейку -1 это означает конец списка. Так же в First хранится ячейка первого элемента.
2) 20 строчка сам массив, 7-9 индексы для него
3) С writeln, да косяк, когда удалял их, некоторые пропустил, я их использовал, чтобы отследить где ошибки, почему возвращается не то, что нужно
4) да, консольное
5) Нас не просили делать 100кк, только 10-20к, чтобы прогнать быстрее программу
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
17.04.2016, 12:18 4
а как две разных сущности должны жить в одном классе ?
должно быть один предок описывающий абстрактные методы
и два потомка, которые эти методы конкретно реализуют
тогда и каши не будет

а такого рода константы (10000) проще задавать в параметре конструктора
сколько укажешь, столько и будет
1
17.04.2016, 12:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2016, 12:18
Помогаю со студенческими работами здесь

Добавление пункта в список. Динамический массив
Создан class Student. Он является составной частью(полем) class Group. В классе Group создаеться...

Реализовать кольцевой список. Как закольцевать список обычный?
Помогите пожалуйста реализовать кольцевой список. Я так понимаю, он может быть двусвязным и...

Как создать двумерный динамический массив или список?
как создать двумерный динамический массив или список?

Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru