
- •О.Л. Викентьева, А.Н. Гусин, O.A. Полякова
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
- •1. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •10.1. Базовые конструкции структурного программирования
- •10.3. Составные операторы
- •10.4. Операторы выбора
- •10.5. Операторы циклов
- •10.6. Операторы перехода
- •11. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ С ИСПОЛЬЗОВАНИЕМ ОСНОВНЫХ ОПЕРАТОРОВ C++
- •11.2. Программирование арифметических циклов
- •11.3. Программирование итерационных циклов
- •11.4. Программирование вложенных циклов
- •12. МАССИВЫ
- •12.1. Определение массива в C/C++
- •12.2. Примеры решения задач с использованием массивов
- •13. УКАЗАТЕЛИ
- •13.1. Понятие указателя
- •13.2. Динамическая память
- •13.3. Операции с указателями
- •14. ССЫЛКИ
- •15.3. Динамические массивы
- •СИМВОЛЬНАЯ ИНФОРМАЦИЯ И СТРОКИ
- •16.1. Представление символьной информации
- •16.2. Библиотечные функции для работы со строками
- •16.3. Примеры решения задач с использованием строк
- •17. ФУНКЦИИ В C++
- •17.1. Объявление и определение функций
- •17.2. Прототип функции
- •17.3. Параметры функции
- •17.4. Локальные и глобальные переменные
- •17.5. Функции и массивы
- •17.5.1. Передача одномерных массивов как параметров функции
- •17.5.2. Передача строк в качестве параметров функций
- •17.5.3. Передача многомерных массивов в функцию
- •17.6. Функции с начальными значениями параметров (по умолчанию)
- •17.7. Подставляемые (inline) функции
- •17.8. Функции с переменным числом параметров
- •17.9. Рекурсия
- •17.11. Шаблоны функций
- •17.12. Указатель на функцию
- •17.13. Ссылки на функцию
- •18. ТИПЫ ДАННЫХ, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ
- •18.1. Переименование типов
- •18.2. Перечисления
- •18.3. Структуры
- •18.3.1. Работа со структурами
- •18.3.2. Битовые поля
- •18.3.3. Объединения
- •19. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
- •19.1. Создание элемента списка
- •19.2. Создание списка из п элементов
- •19.3. Перебор элементов списка
- •19.4. Удаление элемента с заданным номером
- •19.5. Добавление элемента с заданным номером
- •19.6. Двунаправленные списки
- •19.7. Очереди и стеки
- •19.8. Бинарные деревья
- •19.9. Обход дерева
- •19.10. Формирование дерева
- •19.11. Удаление элемента из дерева
- •19.12. Обработка деревьев с помощью рекурсивного обхода
- •20. ПРЕПРОЦЕССОРНЫЕ СРЕДСТВА
- •20.1. Стадии и команды препроцессорной обработки
- •20.2. Директива #define
- •20.3. Включение текстов из файлов
- •20.4. Условная компиляция
- •20.5. Макроподстановки средствами препроцессора
- •21.1. Проектирование программы
- •21.2. Кодирование и документирование программы
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
int key; |
//информационное |
поле |
point* next; |
//адресное |
поле |
};
//создание элемента point* make_point()
{
point*p=new(point);//выделить память под
//элемент списка cout«"\nEnter the key";
cin»p->key;//заполнить информационное поле p->next=0;//сформировать адресное поле
return р;//вернуть указатель на созданный элемент
}
19.2. Создание списка из п элементов
Для того чтобы создать список из п элементов, нужно создать первый элемент с помощью рассмотренной выше функции make_point (), а затем добавить в список оставшиеся (п - 1) эле менты. Добавление может осуществляться либо в начало списка, ли бо в конец списка. При добавлении элемента в начало списка элемен ты списка будут располагаться в порядке, обратном тому, в котором элементы вводились, так как тот элемент, который был введен пер вым, в списке окажется последним.
Сформирование списка из п элементов путем до
бавления элементов в начало списка*/ point* make_list(int n)
{
point* beg=make_point();//сформировать первый //элемент
point*r;//вспомогательная переменная для //добавления
for(int i=l;i<n;i++)
{ |
//сформировать следующий |
r=make_point(); |
|
//элемент |
|
//добавление в начало списка r->next=beg; //сформировать
//адресное поле
b e g = r; |
//и з м е н и т ь |
а д р е с п ер в о го |
//э л е м е н т а сп и ска |
|
|
} |
|
|
r e t u r n b e g ; |
//в е р н у т ь а д р е с |
н а ч а л а сп и ска |
}
Можно добавлять элементы не в начало, а в конец списка, тогда
порядок элементов не изменится. |
|
|
|
|
|
|||||||
/С ф ормирование |
сп и ска и з |
п эл ем ен то в |
п утем д о |
|||||||||
б авлен и я |
эл ем ен то в |
в |
конец с п и с к а * / |
|
|
|||||||
p o in t* m a k e _ l i s t ( i n t n) |
|
|
|
|
||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
lf(n = = 0 ) |
r e t u r n |
0 ; //с п и с о к |
п у сто й |
|
|
|||||||
p o in t* |
b e g = m a k e _ p o in t( ) ; //с ф о р м и р о в а т ь |
первый |
||||||||||
//э л е м е н т |
|
|
|
|
|
|
|
|
|
|
|
|
i f (n==l) |
r e t u r n |
b e g ; //с п и с о к |
и з одного |
элем ен та |
||||||||
p o i n t * r , |
|
//н о в ы й |
|
эл ем ен т |
сп и ска |
|
|
|||||
//у к а з а т е л ь |
д ля |
х р ан ен и я |
а д р е с а п о с л е д н е го |
|||||||||
//э л е м е н т а |
сп и ска |
|
|
|
|
|
|
|
|
|||
*q; |
|
|
|
|
|
|
|
|
|
|
|
|
q = b e g ;//п о с т а в и л и |
|
у к а з а т е л ь q |
на первый |
элем ент |
||||||||
f o r ( i n t |
|
i = l ; |
i< n ;i+ + ) |
|
|
|
|
|
||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
r= m a k e _ p o in t( ) ; |
|
|
|
//с ф о р м и р о в ал и следующий |
||||||||
//э л е м е н т |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//д о б а в л е н и е |
в кон ец |
сп и ск а |
|
|
|||||
//эл е м е н т о м |
|
q - > n e x t= r ; |
/ / с в я з а л и |
сп и со к |
с |
новым |
||||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
q = r; |
//и з м е н и т ь |
а д р е с п о сл ед н его |
|||||||
//э л е м е н т а |
сп и ска |
|
|
|
|
|
|
|
|
|||
} |
|
|
|
|
|
|
|
|
|
|
|
|
r e t u r n |
b e g ; |
//в е р н у т ь |
а д р е с н ач ал а |
сп и ска |
19.3. Перебор элементов списка
Чтобы перебрать элементы списка, нужно встать на первый эле мент p=beg и переходить от одного элемента к следующему, исполь зуя адресное поле next: p = p -> n e x t, до тех пор пока список не закон чится, т.е. р не приобретет нулевое значение. При обходе выполняется
обработка ключевого поля списка. Рассмотрим перебор элементов спи
ска на примере функции печати. |
|
|
|
|
||
v o id |
p r i n t _ l i s t ( p o i n t * b e g ) //п е ч а т ь |
сп и ска |
||||
{ |
|
|
|
|
|
|
p o in t* p = b e g ;//в с т а л и |
на н ач ал о |
сп и ска |
||||
//п р о в е р к а |
нали чи я эл ем ен то в |
в |
сп и ске |
|||
i f |
(!р ) |
{c o u t< < " \n T h e |
l i s t |
i s |
e m p ty !" ; |
|
r e t u r n ; } |
|
|
|
|
|
|
w h ile ( p ) //п о к а значение |
p не стан ет равно нулю |
|||||
{ |
|
|
|
|
|
|
co u t< < p -> k ey < < " " ; //в ы в о д |
клю чевого поля |
|||||
p = p - > n e x t;//п е р е х о д к |
следующему |
элем ен ту |
||||
//с п и с к а |
|
|
|
|
|
|
} |
|
|
|
|
|
|
19.4. Удаление элемента с заданным номером
Чтобы удалить элемент с заданным номером (например, с номе ром к), нужно поставить указатель на элемент с номером k - I и изменить его адресное поле, присвоив ему значение адреса элемен та с номером к + 1. Затем элемент с номером к удаляется с помощью функции d e l e t e (рис. 16).
Инф ормационное Адресное
Beg - начало списка
Рис. 16. Удаление элемента из списка
/ /У даление и з однонаправленного списка элемента / / с номером к
p o i n t * d e l _ p o i n t ( p o i n t * b e g , i n t к)
{
/^ п о с т а в и т ь всп о м о гательн у ю переменную на на ч ал о с п и с к а * /
p o in t* p = b e g ; |
|
|
|
|
|
|
|
|||
p o i n t |
* r ; |
|
//в с п о м о г а т е л ь н а я п ерем ен ная |
|||||||
// д л я |
у д ал ен и я |
|
|
|
|
|
|
|
|
|
i n t i= 0 ; |
|
//с ч е т ч и к |
элем ен то в в |
сп и ске |
||||||
|
if(k = = 0 ) |
|
//у д а л и т ь |
первый |
элем ен т |
|||||
|
|
{ |
|
b e g = p - > n e x t; |
|
|
|
|||
|
|
|
|
|
|
|
||||
|
|
|
|
d e l e t e |
р ; |
|
//у д а л и т ь |
элем ен т |
||
/ / и з |
сп и ска |
|
|
|
|
|
|
|
|
|
|
|
|
|
r e t u r n |
b e g ; |
//в е р н у т ь |
ад р ес |
|||
//п е р в о г о |
эл ем ен та |
|
|
|
|
|
|
|||
|
|
} |
|
|
|
|
|
|
|
|
|
w h i l e ( р ) //п о к а |
н ет |
конца |
сп и ска |
|
|||||
|
{ |
|
|
|
|
|
|
|
|
|
/ * дошли до |
эл ем ен та с |
номером |
к - 1 , |
чтобы поме |
||||||
н ять |
е го |
поле |
n e x t* / |
|
|
|
|
|
|
|
i f ( i = = k - l ) |
|
|
|
|
|
|
|
|
||
|
|
{ |
|
|
|
|
|
|
|
|
/^ п о с т а в и т ь |
г |
на |
удаляемы й |
эл е м ен т * / |
||||||
r = p - > n e x t; |
|
|
|
|
|
|
|
|
||
i f |
(г) |
/ / е с л и |
р |
не последний |
элем ен т |
|||||
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
p - > n e x t= r - > n e x t; |
//и ск л ю ч и ть г |
|||||
/ / и з |
сп и ска |
|
|
|
|
|
|
|
|
|
|
|
|
|
d e l e t e |
г ; |
|
//у д а л и т ь |
элем ен т |
||
/ / и з |
сп и ска |
|
|
|
|
|
|
|
|
}
/* е с л и р - последний эл ем ен т, то в поле n e x t п рисвои ть О*/
|
e l s e p -> n e x t= 0 ; |
|
} |
|
|
p = p - > n e x t; |
//п е р е х о д к следующему |
элем ен ту |
i+ + ; |
//у в е л и ч и т ь |
сч етч и к |
//э л е м е н т о в
}
r e t u r n b e g ; //в е р н у т ь а д р е с п ер в о го элем ен та
}