Стандартные процедуры для работы с динамической памятью



-

Имя и параметры Типы параметров Действие
New(p) p - типизированный указатель выделяет динамическую память равную размеру типа, на который указывает p, и возвращает указатель на нее в переменной p
Dispose(p) p - типизированный указатель освобождает динамическую память по указателю p, ранее выделенную процедурой New
GetMem(p,n) p - указатель любого типа, n - integer выделяет динамическую память размера n байт и возвращает указатель на нее в переменной p
FreeMem(p) p - указатель любого типа освобождает динамическую память по указателю p, ранее выделенную процедурой GetMem

 

Действия с указателями

 

Действие Результат
1. Объявление type   Plnt= ^ integer; Var  a, b: Plnt;  
?
?

  a                           ?

     

  b                             ?

2. Выделение памяти New (a);   New (b);    
адрес1
адрес2
 
 
a       

 

b

адрес1
адрес2
 
 
адрес1
адрес2
 
 
адрес1
адрес2
 
 
адрес1
адрес2
 
 

3. Занесение информации a^ :=1;                b^ :=2;  

адрес1
адрес2
1
2

a                                                    a^

                                                                                                                                                                              

b                                                     b^                     

4.  Копирование информации       a^ :=b^;  
 адрес1
адрес2                                                                                                                                  
2
2

a                                                    a^ a^=b^

 

b                                                  b^  a<>b

5.

2

2
адрес2
адрес2
Копирование адреса

     

а)      а := b;

 

 

    b) Dispose (a);

           a:= b;

 

 

 

a                                                 a^    a^=b^

 

b                                                    b^ a=b

 

 

адрес2
адрес2
2
адрес2
адрес2
2
адрес2
адрес2
2
адрес2
адрес2
2
адрес2
адрес2
2

a

                                                           a^

b                                                         b^                        

6. Присваивание пустого адреса nil              b := nil  

адрес2
nil
2

a                                                     a^

 

b                                   

                                          b^

 

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

Кольцевые списки -это такие же данные, как и линейные списки, но имеющие дополнительную связь между последним и первым элементами списка.

Стек -это частный случай линейного односвязного списка, для которого разрешено добавлять и удалять элементы только с одного конца списка, который называется вершиной (головой) стека.

Для организации связи между элементами динамической структуры данных требуется, чтобы каждый элемент содержал кроме информационных значений , как минимум один указатель. В качестве элементов таких структур необходимо использовать записи, которые могут объединять в единое целое разнородные элементы.

Схематично такую структуру данных можно показать следующим образом:

Inf
Link
Inf
Link
Inf
Link

 


Inf
Link
Inf
Link
Inf
Link
Type T = ^ Rec;

                   Rec = record

                   Inf : integer;

                   Link : T

                              End;

       Var P , Q : T ;

Создание прямого односвязного списка

В прямом односвязном линейном списке связь устанавливается от i-го элемента к i+1.

Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
             i                       i+1                         i+2

Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link
Inf
Link


 

 

Program spisok; Type tt=^elem; Elem=record Inf:char; //информационное поле Next:tt //указательное поле End; Var p,begl,endl:tt; //объявление указателей Value:char; I,n:integer;   Begin writeln('введите n') ; readln(n); Begl:=nil; //начальные установки Endl:=nil; // пустого адреса      For i:=1 to n do Begin     New(p); //выделение динамической памяти       Readln(value);     P^.inf:=value; //занесение данных в информационное поле P^.next:=nil; //занесение пустого адреса в указательное поле If endl=nil then begl:=p //если создается 1ый элемент списка Else endl^.next:=p; //если создается очередной элемент списка Endl:=p End;   P:=begl;    //установка р на начало списка While p<>nil do     // nil-конец списка Begin     Write(p^.inf, ' ');     P:=p^.next //перемещение указателя р на следующий элемент списка End; End.   Результат решения задачи:   введите n 4 п о л е п о л е

 

В список можно добавлять элементы и удалять из списка.

 

  Действие Последовательность операторов
1 Поиск элемента с заданным значением P:=begl; While ( p<>nil) and (p^.inf<>задан.значение) do p:=p^.next;
2 Добавление элемента в начало списка New(p); P^.inf:=значение; P^.next:= begl; Begl:=p;
3 Перемещение указателя на элемент с адресом k P:=begl; While p <>k do p:=p^.next;
4 Добавление элемента в середину списка после k-ого New(p); P^.inf:=значение; P^.next:=k^.next; k^.next:=p;
5 Вставка элемента в середину списка перед k-ым // вставка после k-го элемента New(p); P^.inf:=значение; P^.next:=k^.next; k^.next:=p;   // перестановка информационных полей k ßàp t:=k^.inf; k^.inf:= P^.inf; p^.inf:=t;
6 Удаление элемента из начала списка P:=begl; Begl:= P^.next; Dispose(p);
7 Удаление элемента из конца списка P:=begl; While p^.next<>endl do //перемещение р на    предпоследний элемент p:=p^.next; Dispose(endl); Endl:=p; Endl^.next:=nil;
8 Удаление элемента после k -го p:=k^.next; k^.next:= P^.next; Dispose(p);

9

a) Удаление k–го элемента p:=k^.next; k^.inf:= p^.inf; k^.next:= p^.next; Dispose(p);  
б) Удаление k–го элемента P:=begl; //установка p перед k While p^.next<>k do p:=p^.next; P^.next:= k^.next; Dispose(k);

 

Пример1: Создать односвязный линейный список, содержащий числа.

Сложить положительные элементы списка.

 

     

 

 

Program Spisok11;

{создать односвязный линейный список, содержащий числа.

Сложить положительные элементы списка.}

Uses Crt;

Type aa =^spisok;

spisok = record

zn:integer;

next:aa;

         end;

Var

s,p:aa;

i,zna,kol, sum:integer;

// процедура добавление элемента в список

Procedure AddSp;

var q:aa;

Begin

if s=nil then //создается первый элемент

Begin

New(p);

s:=p

End

Else begin

q:=p;

New(p);

q^.next:=p;

end;

p^.next:=nil;

Writeln('Введите значение',i,' элемента');

readln(zna);

p^.zn:=zna;

end;

// функция определения конца списка

Function GoNext:boolean;

Begin

if p^.next <> nil then

Begin

p:=p^.next;

GoNext:=true;

End

elseGoNext:=false

end;

//функция освобождения памяти и вывода элементов списка

Function DisposeAll:boolean;

var q:aa;

Begin

p:=s;

while p<>nil do

Begin

q:=p^.next;

write(p^.zn,' ');

Dispose(p);

p:=q;

end ;

writeln;

writeln('Освобождение памяти...');

DisposeAll:=true;

end;

 

begin  //операторы основной программы

 

s:=nil; // nil- признак конца списка

writeln('Введите количество элементов списка');

readln(kol);

for i:=1 to kol do//создание списка

Addsp;

 

p:=s; //установка р на начало списка

Repeat

if p^.zn>0 then

sum:=sum+p^.zn; //суммируем положительные элементы

until not gonext;

 

ifsum=0 then writeln('в списке нет полож. элементов')

else writeln('sum=',sum);

DisposeAll;

End.

 

Результаты решения задачи:

 

Введите количество элементов списка

4

Введите значение1 элемента

3

Введите значение2 элемента

5

Введите значение3 элемента

0

Введите значение4 элемента

-56

sum=8

3 5 0 -56

Освобождение памяти...

 


Дата добавления: 2018-06-01; просмотров: 391; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!