Показать сообщение отдельно
  #5  
Старый 13.11.2011, 18:21
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

И опять неясно. Ты пишешь что удаляешь первый элемент но насамом деле-третий.
И теперь уже непонятно в чем разница между доступными и недоступными злементами.
Сделал как понял.
При удалении ставится метка об удалении
При добавлении длина массива увеличивается на 1 и
новый элемент добавляется в конец
Уплотнение происходит так
Все элементы ниже индекса поднимаются вверх на 1 позицию
тем самым закрывая дырку. Длина массива уменьшается на 1
Код:
type
TArr=array of record
                Enabled,Deleted:boolean;
                Data:integer;
                end;


{-------------------------------------------
    процедура ставит метку удаления
    на строке Index
    Возвращает индекс удаленного элемента
    Если удаление запрещено- то -1
---------------------------------------------}
function DeleteRec(var Arr:TArr;Index:integer):integer;
begin
if Arr[Index].Enabled then
    begin
    Arr[Index].Deleted:=true;
    Result:=Index
    end
else Result:=-1;
end;

{------------------------------------------------
    процедура сдвигает хвост массива на строку Index
    уменьшает длину массива на 1
--------------------------------------------------}
procedure ShiftRec(var Arr:TArr;Index:integer);
var
i:integer;
begin
if Index <0 then Exit
else
    begin
    for i:=Index+1 to High(Arr) do
        Arr[i]:=Arr[i+1];
    SetLength(Arr,Length(Arr)-1);
    end;
end;

{----------------------------------------------------
    процедура добавляет запись в конец массива
    увеличивает длину массива на 1
-----------------------------------------------------}
procedure AddRec(var Arr:TArr;Dat:integer;Enabl:boolean);
begin
SetLength(Arr,Length(Arr)+1);
Arr[High(Arr)].Data:=Dat;
Arr[High(Arr)].Enabled:=Enabl;
end;
Ответить с цитированием