16.33. Пусть L обозначает кольцевой (циклический) двунаправленный список с заглавным звеном (рис. 15) при следующем описании такого списка;
type ТЭ2=...; {тип элементов списка}
список2=^звено2;
звено2=гecord элем:ТЭ2;
пред,след:список2 end;
и пусть Е обозначает величину типа ТЭ2.Описать функцию или процедуру, которая:
г) определяет, есть ли в списке L хотя бы один элемент, который равен следующему за ним (по кругу) элементу;
ж) из списка L, содержащего не менее двух элементов, удаляет все элементы, у которых одинаковые «соседи» (первый и последний элементы считать соседями);
Алгоритм розв’язку задачі
Текст програми
program wqetg;
uses Crt;
type Nodepoint=^node;
node=record
count:integer;
next:nodepoint;
before:nodepoint;
end;
type nod=^nodepoint;
function Vvodsp(n:integer):nodepoint;
var j:integer;firs,cur1,cur:nodepoint;
begin
new(cur1);
writeln('Vedit Spisok');
cur1^.count:=0;
firs:=cur1;
cur1^.before:=nil;
cur1^.next:=nil;
for j:=1 to n do begin
new(cur1^.next);
cur1^.next^.before:=cur1;
cur1:=cur1^.next;
cur1^.next:=nil;
readln(cur1^.count);
end;
cur:=firs^.next;
cur1^.next:=cur;
cur^.before:=cur1;
Vvodsp:=firs;
end;
procedure Vuvodsp(head:nodepoint);
var cur:nodepoint;
begin
cur:=head^.next;
head:=head^.next;
writeln(head^.count);
head:=head^.next;
while head<>cur do begin
writeln(head^.count);
head:=head^.next;
end;
end;
function Kilkist(head:nodepoint;var cur:nodepoint):integer;
begin
if head=nil then Kilkist:=0
else if cur^.next=head then Kilkist:=1
else kilkist:=kilkist(head,cur^.next)+1;
end;
procedure DelEl(var cur:nodepoint);
var tm1,tm2:nodepoint;
begin
tm1:=cur^.before;
tm2:=cur^.next;
dispose(cur);
tm1^.next:=tm2;
tm2^.before:=tm1;
end;
procedure Del_Alike_n(var head:nodepoint);
var cur,cur2:nodepoint;b:boolean;
begin
b:=true;
cur:=head^.next;
cur2:=head^.next^.next;
while (b) do begin
b:=false;
while not(cur^.next=head^.next) do
begin
if cur^.count=cur2^.count then
begin
b:=true;
DelEl(cur2);
cur2:=cur^.next;
end
else
begin
cur:=cur^.next;
cur2:=cur2^.next;
end;
end;
end;
end;
var first,cur:nodepoint;m:integer;
begin
ClrScr;
writeln('Vedit kilkist elementiv spusku');
readln(m);
first:=Vvodsp(m);
writeln;
readln;
Vuvodsp(first);
Writeln;
readln;
Vuvodsp(first);
writeln;
readln;
cur:=first;
writeln(kilkist(first^.next,first^.next));
readln;
Del_Alike_n(first);
writeln('Spusok bez odnakovux susidiv: ');
Vuvodsp(first);
readln;
{del(first);}
end.
Екран результату
Висновок
Динамічні структури даних дозволяють гнучкіше та ширше використовувати можливості програмування. Дуже зручним у використанні є тип даних Паскаля Pointer та його комбінація з типом Record, що дає змогу реалізовувати списки та будь-які деревовидні структури даних. Середовище Турбо Паскаль та Делфі дозволяє вільно працювати з цими структурами.
Список літературних джерел
1. Т. Рюттен, Г. Франкен. Турбо Паскаль 6.0. Торгово-издательськое бюро BHV. Грифон. - К.: 1992. - 235 с.
2. Т. П. Караванова. Основи алгоритмізації та програмування. Форум. - К.: 2002. - 286 с.
3. І.Скляр. Вивчаємо мову программування PASCAL. http://distance.edu.vn.ua/metodic/pascal/
4. Будникова Н.А. Обучающий комплекс по программированию на языке ПАСКАЛЬ http://petrsu.ru/Chairs/IMO/pascal/
... целое равно " << MidInt / double(NMax) << "n"; cout << "среднее вещественное равно: " << MidReal / n << "n"; fclose(t); } Списки Обсудим вопрос о том, как в динамической памяти можно создать структуру данных переменного размера. Разберем следующий пример. В процессе физического эксперимента многократно снимаются показания прибора (допустим, термометра) и ...
... : 1. Добавление элемента в начало дека. 2. Удаление элемента из начала дека. 3. Добавление элемента в конец дека. 4. Удаление элемента из конца дека. 5. Проверка дека на наличие в нем элементов. Динамические структуры данных: дек В языках программирования существует такой способ выделения памяти под данные, который называется динамическим. В этом случае ...
... элемента в стек; удаление элемента из стека; проверка, пуст ли стек; просмотр элемента в вершине стека без удаления; очистка стека. Реализуем эти операции, используя разработанный ранее модуль для однонаправленных списков (см. материал "Динамические структуры данных: списки"). { Turbo Pascal, файл STACK.PAS } Unit Stack; Interface Uses Spisok; Procedure V_Stack(Var Versh : U; X ...
0 комментариев