Удалить подряд идущие элементы в списке - Free Pascal
Формулировка задачи:
Пишу программу, создаю односвязный список, вывожу его на экран. Далее нужно удалить подряд-идущие одинаковые элементы все кроме одного, застопорился на процедуре удаления дубликатов. Заранее спасибо.
Листинг программы
- Program lab5;
- Uses crt;
- Type
- sllptr = ^slltype;
- slltype = record
- info: integer;
- next : sllptr;
- end;
- Var
- Head, list, r, d: sllptr;
- Procedure Creating (var Head, list:sllptr);
- var
- n,m,i: integer;
- begin
- ClrScr;
- repeat
- write('Введите количество элементов списка: ');
- readln(n);
- Until (n>0);
- WriteLn ('Введите ',n,'элементов списка, после каждого элемента нажмите <<ENTER>>');
- for i := 1 to n do
- begin
- read(m);
- if head = nil then
- begin
- new(head);
- list:=head;
- list^.Next:= nil;
- head^.info:= m;
- end
- else
- begin
- new(list^.Next);
- list:=list^.Next;
- list^.Info:= m;
- list^.Next:= nil;
- end;
- end;
- list:=head;
- end;
- Procedure Printone (list: sllptr);
- var
- p: sllptr;
- begin
- p:=list;
- ClrScr;
- WriteLn ('Вы ввели список: ');
- While p <> nil do
- begin
- Write (p^.info:3);
- p:=p^.next;
- end;
- end;
- Procedure del_dublicate (list:sllptr; var r,d:sllptr);
- var
- p: sllptr;
- begin
- p:=list;
- While p <> nil do
- begin
- r:=p^.next;
- While r <> nil do
- If (r^.info = p^.info) then
- begin
- d:=r;
- r:=r^.next;
- end;
- r:=r^.next;
- p:=p^.next;
- end;
- r:=head;
- end;
- Procedure Printtwo (r: sllptr);
- var
- p: sllptr;
- begin
- p:=r;
- WriteLn;
- WriteLn ('Редактированный список: ');
- While p <> nil do
- begin
- Write (p^.info:3);
- p:=p^.next;
- end;
- end;
- begin
- Creating (head, list);
- Printone (list);
- del_dublicate (list, r, d);
- Printtwo (r);
- ReadLn;
- ReadLn;
- end.
Решение задачи: «Удалить подряд идущие элементы в списке»
textual
Листинг программы
- procedure DelDub(list: sllptr);
- var t: sllptr;
- begin
- if list<>nil then
- while list^.next<>nil do with list^ do
- if info<>next^.info then list:=next
- else begin
- t:=next; next:=next^.next; Dispose(t);
- end;
- end;
Объяснение кода листинга программы
В данном коде реализована процедура удаления дублирующихся элементов из связанного списка.
- Передается указатель на голову списка в качестве входного параметра.
- В начале процедуры проверяется, что список не пустой.
- Затем выполняется цикл, который будет проходить по всем элементам списка, пока не будет достигнуто последнее ребро.
- Внутри цикла проверяется, является ли текущий элемент дубликатом следующего элемента. Если это не так, то управление возвращается в начало цикла.
- Если текущий элемент является дубликатом следующего элемента, то переменная
t
инициализируется какnext
текущего элемента. - Значение
next
текущего элемента обновляется на значениеnext
следующего элемента. - Затем переменная
t
освобождается динамической памятью с помощью функции Dispose. - Цикл продолжается до тех пор, пока все элементы списка не будут проверены.
- По завершении процедуры возвращается управление.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д