Pascal ABC. Двунаправленный список. Удалить следующий элемент после нуля Создать...

0 голосов
45 просмотров

Pascal ABC. Двунаправленный список. Удалить следующий элемент после нуля
Создать двунаправленный связный список, содержащий 11 целых чисел из интервала [8, -5]. Вывести список на экран.
Описать процедуру, которая удаляет элемент после нуля. Вывести новый список на экран.
Преподаватель сказал, что проблема в том, что создается список как двунаправленный , но обрабатывается не как двунаправленный. Возникала так же проблема в том, что если ноль первый и последний элемент, то программа выдает ошибку. Прошу помогите


Информатика (54 баллов) | 45 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Program spiski;

type
    
    ListElement = ^TListElement;
    TListElement = record
        Data: integer;  
        Next, Previous: ListElement;   
    end;

var
    first, current, last: ListElement;
    i: integer;

procedure Delete(var element: ListElement);
var
    x: ListElement;
begin
    while element <> nil do
    begin
        if (element^.Data = 0) and (element^.Next <> nil) then begin
            x := element^.Next; {следующий элемент который надо удалить}
            {сшиваем дырку которая образуется после удаления х}
            element^.Next := x^.Next;
            if (x^.Next <> nil) then
                x^.Next^.Previous := element;
            Dispose(x);
        end;
        element := element^.Next;
    end;
end;


procedure Print(first: ListElement);
begin
    if first = nil then
    begin
        writeln('Список пуст.');
        exit;
    end;
    
    while first <> nil do
    begin
        Write(first^.Data, ' ');
        first := first^.Next
    end;
    writeln;
end;


begin
    for i := 1 to 11 do
    begin
        if first = nil then
        begin
            new(first);
            first^.Next := nil;
            first^.Previous := nil;
            last := first;
        end
        else
        begin
            new(last^.Next);
            last^.Next^.Previous := last;
            last := last^.Next;
            last^.Next := nil;
        end;
        last^.Data := random(8 + 5) - 5;
    end;
    
    current := first;
    
    Print(first);
    Delete(current);
    Print(first);
end.

(53.1k баллов)
0

Извини за небольшой рефакторинг, но так было легче разобраться в написаном.

0

Процедуру Delete переписывала полностью, потому что вообще не поняла что там делала написаная, она впринцепе не могла работать

0

И вообще я за обьектно ориентированное программирование а то в этих next previous запутаться только так

0

Спасибо вам огромное) вы мне очень помогли)