Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР11.doc
Скачиваний:
1
Добавлен:
13.07.2019
Размер:
151.04 Кб
Скачать
  1. Использование массива указателей на структуру

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

#include "stdafx.h"

#include <stdlib.h>

#include <conio.h>

int main(void)

{

struct myStruct{

char field1;

char field2;

char field3;

};

struct myStruct *pointer;

pointer = (struct myStruct *) malloc(sizeof(myStruct));

printf("Размер памяти выделенной под структуру равен %d байт", sizeof(*pointer));

getch();

return 0;

}

Выведет строку:

Размер памяти выделенной под структуру равен 3 байта

Очень часто в С используется массив указателей на структуру.

Перед использованием под каждый элемент массива нужно выделить память функцией malloc().

Если элементами массива являются элементы пользовательского типа (struct), то обращение к полям структуры осуществляется с помощью оператора ->. Оператор -> используется только для объектов созданных динамически.

struct myStruct *pointer[20];

for(int i=0; i<20; i++){

pointer[i] = (struct myStruct *) malloc(sizeof(myStruct));

pointer[i]->field1 = ‘a’;

pointer[i]->field2 = ‘b’;

pointer[i]->field3 = ‘c’;

}

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

  1. Создание сложных структур данных

В языке С, как и во многих других языках высокого уровня имеется возможность работы со списками. Для работы со списком сначала создается структура, содержащая указатель на саму себя:

struct myStruct{

struct myStruct *p;

int *someField;

};

Затем объявляются два указателя того же типа: один используется для хранения «головы» списка – указателя на его первый элемент, другой для перемещения по элементам списка.

myStruct *head = (struct myStruct *) malloc(sizeof(myStruct));

myStruct *pointer = head;

После того, как первый элемент создан, указатель pointer используется для перемещения по новым элементам списка. Для того чтобы создаваемые объекты добавлялись в список, нужно для каждого нового элемента инициализировать указатель myStruct->pointer предыдущим элементом этого объекта.

pointer->p = (struct myStruct *) malloc(sizeof(myStruct));

pointer = pointer->p;

pointer->p = NULL;

В представленном выше листинге создается новый элемент типа myStruct, адрес которого сохраняется в указателе предыдущего элемента. Таким образом, образуется «цепочка» из элементов myStruct, которая и является списком.

Указатель на голову списка с именем head нужен для того, чтобы можно было пройти по списку повторно (извлечь значения полей, перезаписать поля структуры). Для этого указатель на голову присваивается указателю на текущий элемент, после чего происходит перебор всех элементов списка, пока не встретится указатель со значением NULL.

pointer = head;

while (pointer->p!=NULL){

printf(“Значение текущего элемента равно %d”, pointer->someField);

pointer = pointer->p;

};

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]