Смекни!
smekni.com

Создание и обработка динамического списка (стр. 2 из 3)

Динамическое распределение памяти осуществляется операциями new и delete. Это 2 особые унарные операции, появившиеся в языке СИ++ (в языке СИ этих операций не было). Операция new имя_типа или new имя_типа инициализатор позволяет выделить и сделать доступным свободный участок в основной памяти, размеры которого соответствуют типу данных, определяемому именем типа. В выделенный участок заносится значение, определяемое инициализатором, который не является обязательным элементом. В случае успешного выполнения операции new возвращает адрес начала выделенного участка памяти. Если участок нужных размеров не может быть выделен (нет памяти), то операция new возвращает нулевое значение адреса (NULL). Синтаксис применения операции: указатель=new имя_типа инициализатор.

Продолжительность существования выделенного с помощью операции new участка памяти – от точки создания до конца программы или до явного его освобождения.

Для явного освобождения выделенного операцией new участка памяти используется оператор delete указатель, где указатель адресует освобождаемый участок памяти, ранее выделенный с помощью операции new.

11

6. Разработка программы

6.1 Основная часть программы.

0 Начало. Описываем глобальные переменные и типы данных

1 Очищаем экран с помощью оператора clrscr()

2 Присваиваем переменной а, которая является параметром последующего цикла и оператора множественного выбора значение равное единицы: a=1

3 Открываем цикл с предусловием (условие: переменная а не равна 5); в цикле будут выполняться шаги с 4 по 11: while (a!=5)

4 Вводим переменную а: a=getch()

5 Выполняем оператор множественного выбора с параметром а; оператор включает шаги с 6 по 10: switch(a)

6 Если а=1, вызываем процедуру ввода данных: case '1':vvod(); break

7 Если а=2, вызываем процедуру вывода данных: case '2':vivod(); break

8 Если а=3, вызываем процедуру удаления первого элемента: case '3':dele(); break;

9 Если а=4, вызываем процедуру перемены мест элементов, которые заданы номерами: case '4':pomen(); break;

10 Если а не равно не одному из указанных раннее значений, то а присваиваем значение 5: default: a=5; break;

11 Закрываем оператор множественного выбора: }

12 Закрываем цикл с предусловием: }

13 Конец: }

6.2 Процедура ввода данных

0 Начало процедуры: void vvod(); Описываем локальные переменные

1 Резервируем область оперативной памяти размером равным размеру элемента и присваиваем указателю на последний элемент q адрес этой области: q=new(news)

2 Последовательно вводим данные внутренней структуры, на которую будет указывать указатель q. Ввод будем осуществлять с помощью последовательности операторов ввода scanf

12

3 Присваиваем указателю на первый элемент списка un и указателю на текущий элемент p значение указателя q. Присваиваем переменной i, которая содержит данные о числе элементов списка и переменной j, которая является параметром последующих циклов значение равное 1: un=q; p=q; j=1; i=1;

4 Открываем цикл с предусловием (условие: переменная j равна 1); в цикле будут выполняться шаги с 5 по 9: while (j==1)

5 Увеличиваем значение переменной i на единицу: i++

6 Резервируем область оперативной памяти размером равным размеру элемента и присваиваем указателю q адрес этой области: q=new(news);

7 Последовательно вводим данные внутренней структуры, на которую будет указывать указатель q. Ввод будем осуществлять с помощью последовательности операторов ввода scanf

8 Устанавливаем указатель введенного ранее элемента n на элемент, введенный шагом 7, а указателю p значение указателя q: p->n=q; p=q;

9 Вводим новое значение переменной j. Ввод будем осуществлять с помощью оператора ввода scanf

10 Закрываем цикл с предусловием: }

11 Устанавливаем указатель n текущего элемента на NULL: p->n=NULL;

12 Конец процедуры: }

6.3 Процедура вывода данных

0 Начало процедуры: void vivod(); Описываем локальные переменные

1 Устанавливаем указатель p на первый элемент списка, а переменную j, которая будет параметром следующего цикла, устанавливаем в 1: p=un; j=1;

2 Открываем цикл с предусловием (условие: переменная j меньше или равно i); в цикле будет выполняться шаги с 3 по 4: while (j<=i)

3 Последовательно выводим данные внутренней структуры, на которую будит указывать указатель p. Вывод осуществляем с помощью одного единственного оператора вывода printf

13

4 Указатель текущего элемента p устанавливаем на следующий элемент, а значение переменной j увеличиваем на 1: p=p->n; j++;

5 Закрываем цикл с предусловием: }

6 Конец процедуры: }

6.4 Процедура удаления элемента заданного по имени

0 Начало процедуры: void dele(); Описываем локальные переменные

1 Указатель текущего элемента p устанавливаем в начало, а указатель первого элемента в списке un устанавливаем на следующий элемент: p=un; un=un->n;

2 Освобождаем область памяти, на которую указывает указатель текущего элемента p: delete p;

3 Значение переменной i, которая содержит данные о числе элементов в списке, уменьшаем на 1: i=i-1;

4 Конец процедуры

6.5 Процедура перемены мест элементов, которые заданы номерами

0 Начало процедуры: void pomen();Описываем локальные переменные

1 Вводим переменную k1, которая указывает на название первого элемента в операции перемены мест. Ввод будем осуществлять с помощью оператора ввода scanf

2 Устанавливаем указатель p на первый элемент списка: p=un;

3 Открываем цикл с заданным числом повторений (j=0…k1); в цикле будет выполняться шаг 4: for(j=1;j<k1;j++)

4 Указатель на текущий элемент p устанавливаем на следующий элемент списка: p=p->n;

5 Закрываем цикл с заданным числом повторений: }

6 Вводим переменную k2, которая указывает на название второго элемента в операции перемены мест. Ввод будем осуществлять с помощью оператора ввода scanf

7 Устанавливаем указатель p2 на первый элемент списка: p2=un

8 Открываем цикл с заданным числом повторений (j=0…k2); в цикле будет выполняться шаг 4: for(j=1;j<k2;j++)

9 Указатель на текущий элемент p2 устанавливаем на следующий элемент списка: p2=p2->n;

14

10 Закрываем цикл с заданным числом повторений: }

11 Переменной с присваиваем данные внутренней структуры, на которые указывает указатель текущего элемента p: с=p->g;

12 Данные внутренней структуры, на которые указывает указатель текущего элемента p2, копируем в переменные внутренней структуры, на которые указывает указатель текущего элемента p: p->g=p2->g;

13 Значение переменной g1 присваиваем переменным внутренней структуры, на которые указывает указатель текущего элемента p2: p2->g=с;

14 Конец процедуры: }

15

7. Отладка и тестирование программы

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

Statement missing ; - отсутствие знака конца оператора.

16

Список используемой литературы

1 В. В. Подбельский. Язык СИ++. - М.: Финансы и статистика, 2003.

2 Б. И. Березин, С. Б. Березин. Начальный курс С и С++. – М.: Диалог-МИФИ, 1998.

17

ПРИЛОЖЕНИЕ 1

18

19

20

21

ПРИЛОЖЕНИЕ 2

# include<stdio.h>

# include<string.h>

# include<conio.h>

struct gaseta{

char n[30];

char s[30];

int st;};

struct news{

games g;

play *n;};

play *un,*p,*q;

int i;

void vvod()

{

int j;

q=new(news);

printf("Введите данные о 1 статье&bsol;n");

printf("Газета: ");

scanf("%s",&q->g.n);

printf("Статья: ");

scanf("%d",&q->g.s);

printf("Страница: ");

scanf("%d",&q->g.st);

un=q;

p=q;

j=1;

i=1;

while (j==1)

{

i++;

q=new(news);

printf("Введите данные о %d", i );

printf(" игре&bsol;n");

printf("Газета: ");

scanf("%s",&q->g.n);

printf("Статья: ");

scanf("%d",&q->g.s);

printf("Страница: ");

scanf("%d",&q->g.st);

p->n=q;

p=q;

printf("Хотите продолжить? 1-да, 2-нет&bsol;n");

22

scanf("%d",&j);

}

p->n=NULL;

}

void vivod()

{

int j;

p=un;

j=1;

printf("Данные о статье&bsol;n");

printf("╔═══════════════╦══════════════╦══════════════╗&bsol;n");