- •О.Л. Викентьева, А.Н. Гусин, 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++
Удаление элемента с заданным ключом осуществляется анало гично, но вместо условия
if(i==k-l) //проверка номера
нужно использовать условие:
if (p->next->key==KEY)//проверка ключа,
где KEY - заданный ключ. Ключ KEY передается как параметр функ ции удаления.
19.5. Добавление элемента с заданным номером
Для добавления в список элемента с номером к нужно поставить указатель на элемент с номером k - 1. Затем нужно создать новый элемент и поменять значения адресных полей таким образом, чтобы адресное поле нового элемента содержало адрес элемента с номером к, а адресное поле к - 1 элемента - адрес нового элемента (рис. 17).
Информационное Адресное |
, „ |
пппо |
к-и элемент списка |
Новый элемент
Рис. 17. Добавление элемента с номером к
point* add_elem(point*beg, int NOM)
{
point*p=make_point() ;//создание нового //элемента
if (NOM==0)//добавление первого
//элемента
{
p->next=beg;//связываем новый элемент //со списком
beg=p;//меняем адрес beg return beg;
}
point*r=beg;//указатель для перехода //на нужный номер
/*проходим по списку до элемента с номером N0M-1
или до конца списка, если такого элемента нет*/ for(int i=0; i<NOM-l&& r!=0;i++)
r=r->next;
//если элемента с указанным номером в списке нет if (1г)
{
cout«"\nNot such NOM!"; //сообщение об ошибке return beg;
}
p->next=r->next;//связываем новый элемент со //списком
//связываем элемент с номером N0M-1 с новым //элементом
r->next=p; return beg;
19.6. Двунаправленные списки
Двунаправленный список имеет два адресных поля, которые указывают на следующий элемент списка и на предыдущий, поэтому двигаться по такому списку можно как слева направо, так и справа налево (рис. 18).
pred key next
Рис. 18. Двунаправленный список
//пример описания двунаправленного списка struct point //описание структуры
{
int |
key; |
//ключевое поле |
//адресные |
поля |
|
point* pred,//адрес предыдущего элемента |
||
*next; |
// |
адрес следующего элемента |
}; |
|
|
Ниже рассматривается программа, которая создает двуна правленный список, выполняет удаление элемента с заданным номером, добавление элемента с заданным номером и печать по
лученных списков |
|
|
|
|
|
|
|
|
|
|
|
||
#in c lu d e c io s tr e a m .h > |
|
|
|
|
|
|
|
|
|||||
s t r u c t |
p o i n t |
//о п и с а н и е |
стр у к ту р ы |
|
|
|
|||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
i n t |
k ey ; |
|
//к л ю ч е в о е |
поле |
|
|
|
|
|
||||
p o in t* |
p r e d ,* n e x t ; |
|
|
|
//а д р е с н ы е |
поля |
|
||||||
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
//ф о р м и р о в а н и е |
сп и ск а |
|
|
|
|
|
|
|
|
||||
p o i n t * m a k e _ l i s t () |
|
|
|
|
|
|
|
|
|
||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
i n t |
п ; |
|
|
//к о л и ч е с т в о |
эл ем ен то в |
списка |
|||||||
c o u t « " n - ? " ; |
|
|
|
|
|
|
|
|
|
|
|||
c i n » n ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
p o in t* p , * r , * b eg ; |
|
|
|
|
|
|
|
|
|||||
p=new |
( p o i n t ) ; |
/ / с о з д а т ь |
первый |
элемент |
|||||||||
/* за п о м н и т ь |
а д р е с в |
перем енную |
b e g , |
в |
которой |
||||||||
х р а н и т с я н ач ал о с п и с к а * / |
|
|
|
|
|
|
|
|
|||||
b eg = p ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
c o u t « " k e y - ? ,f; |
|
|
|
|
|
|
|
|
|
||||
c in > > p - > k e y ; |
//з а п о л н и т ь |
клю чевое |
поле |
|
|||||||||
p - > p r e d = 0 ;p - > n e x t= 0 ;//за п о м н и т ь |
адресные |
поля |
|||||||||||
//д о б а в и т ь |
элем ен ты |
в кон ец сп и ска |
|
|
|
||||||||
f o r ( i n t i = l ; i < n ; i + + ) |
|
|
|
|
|
|
|
|
|||||
|
|
r = n e w ( p o in t) ; |
|
|
//н о в ы й |
элем ент |
|
||||||
|
|
c o u t< < " k e y - ? " ; |
|
|
|
|
|
|
|
|
|||
c i n » r - > k e y ; |
//а д р е с н о е |
поле |
|
|
|
|
|
||||||
p - > n e x t= r ; |
/ / с в я з а т ь |
н ач ал о |
сп и ска |
с г |
|
||||||||
r - > p r e d = p ; |
/ / с в я з а т ь |
г |
с началом |
списка |
|
||||||||
r-> n e x t= 0 ; |
//о б н у л и ть |
последнее |
адресное |
поле |
|||||||||
р = г ; //п е р е д в и н у т ь |
р |
на |
последний |
элемент |
|||||||||
//с п и с к а |
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
r e t u r n |
b e g ; //в е р н у т ь |
первый |
элем ен т |
списка |
//п е ч а т ь |
сп и ска |
|
|
|
|
|
|
||||
v o id |
p r i n t _ l i s t ( p o i n t |
*beg) |
|
|
|
|
|||||
{ |
|
|
|
|
|
|
|
|
|
|
|
i f |
(beg==0) |
/ /е с л и |
сп и сок |
п устой |
|
||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
c o u t « " T h e l i s t i s e m p ty \n " ; |
|
|
|
|
|||||||
r e t u r n ; |
|
|
|
|
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
|
p o in t* p = b e g ; |
|
|
|
|
|
|
|
||||
w h ile (p ) |
|
//п о к а |
не конец |
сп и ска |
|
||||||
{ |
|
|
c o u t « p - > k e y < < " \ t " ; |
|
|
|
|
||||
|
|
|
|
|
|
|
|||||
|
|
|
p = p -> n e x t; |
//п е р е й т и |
на |
следующий |
|||||
//э л е м е н т |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
c o u t< < " \n " ; |
|
|
|
|
|
|
|
||||
} |
|
|
|
|
|
|
|
|
|
|
|
//у д а л е н и е |
эл ем ен та |
с номером |
к |
|
|
||||||
p o in t* d e l _ p o i n t ( p o i n t * b e g , i n t к) |
|
||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
p o i n t |
*p= beg; |
|
|
|
|
|
|
||||
i f ( k = = 0 ) //у д а л и т ь |
первый элем ен т |
|
|||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
//п е р е с т а в и т ь |
н а ч а л о |
с п и с к а |
н а |
следующий |
|||||||
//э л е м е н т |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b e g = b e g - > n e x t; |
|
|
|
|
||||
/ /е с л и |
в |
сп и ске то л ьк о один |
элем ен т |
|
|||||||
|
|
|
if ( b e g = = 0 ) r e t u r n 0; |
|
|
|
|
||||
|
|
|
/ /е с л и |
в сп и ске б о лее |
одного |
элем ен та |
|||||
|
|
|
b e g -> p re d = 0 ;//о б н у л и ть |
адрес предыдущего |
|||||||
//э л е м е н т а |
|
|
|
|
|
|
|
|
|
||
|
|
|
d e l e t e |
р ; |
|
//у д а л и т ь |
первый |
||||
|
|
|
r e t u r n |
b e g ; |
//в е р н у т ь |
н ач ал о |
сп и ска |
||||
} |
|
|
|
|
|
|
|
|
|
|
|
/* е с л и |
у д а л я е т с я элем ен т и з |
середины |
сп и ск а, |
||||||||
пройти |
по |
сп и ску либо |
до |
эл ем ен та |
с |
предыдущим но |
|||||
мером, |
либо |
до |
конца с п и с к а * / |
|
|
|
|
f o r ( i n t |
i= 0 ;i< k - l& & p ! = 0 ;i+ + ,p = p - > n e x t) ; |
|
|
||||||||||||||
/ / е с л и |
в с п и ск е |
|
н ет |
|
э л е м ен т а |
с |
|
номером |
к |
|
|||||||
i f ( р = = 0 ||p - > n e x t= = 0 ) r e tu r n |
b e g ; |
|
|
|
|
|
|||||||||||
/ / е с л и |
в с п и ск е |
|
е с т ь эл ем ен т |
с |
|
номером |
к |
|
|||||||||
p o i n t e r |
р _ ^ n e x tf |
|
/ /в с т а т ь |
на |
удаляемый |
элемент |
|||||||||||
p - > n e x t= r - > n e x t; |
|
|
|
//и з м е н и т ь |
ссылку |
|
|
|
|||||||||
d e l e t e |
г ; |
|
|
|
|
|
|
|
|
//у д а л и т ь |
г |
|
|
||||
r = p - > n e x t ; |
|
|
|
|
|
/ / в с т а т ь |
на |
следующий |
|||||||||
/ / е с л и |
г |
с у щ е с т в у е т , |
то |
с в я з а т ь |
элементы |
|
|||||||||||
i f (г != 0 )r - > p r e d = p ; |
|
|
|
|
|
|
|
|
|
|
|
||||||
r e t u r n |
b e g ; |
|
|
|
|
|
//в е р н у т ь |
начало |
|
списка |
|||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//д о б а в и т ь |
эл е м ен т |
с |
номером |
к |
|
|
|
|
|
|
|||||||
p o i n t * a d d _ p o i n t ( p o i n t * b e g ,i n t к) |
|
|
|
|
|||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p o i n t |
* p ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
/ / с о зд а т ь |
новый |
|
элем ент и |
заполнить ключевое поле |
|||||||||||||
p = n e w ( p o in t) ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
c o u t « " k e y - ? " ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
c in > > p - > k e y ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
i f ( k = = 0 ) / / е с л и |
д о б а в л я е т с я |
первый |
|
элемент |
|||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p - > n e x t= b e g ; |
|
|
|
|
//д о б а в и т ь |
|
перед |
beg |
|
||||||||
p - > p r e d = 0 ; |
//о б н у л и т ь |
|
ад р ес |
|
предыдущего |
||||||||||||
/ / с в я з а т ь |
сп и со к |
с |
добавленны м |
|
элементом |
|
|||||||||||
|
|
b e g - > p re d = p ; |
|
|
|
|
|
|
|
|
|
||||||
|
|
b e g = p ;//з а п о м н и т ь |
первый элемент |
в beg |
|||||||||||||
|
|
r e t u r n |
|
b e g ; //в е р н у т ь |
н ачало |
списка |
|||||||||||
} |
|
/ / е с л и |
|
д о б а в л я е т с я элем ент |
в |
середину |
|||||||||||
|
|
|
|||||||||||||||
/ / и л и ко н ец с п и ск а |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
p o i n t* r = b e g ; |
|
|
|
|
/ / в с т а т ь |
на |
начало |
списка |
|||||||||
/* п р о й т и |
по |
сп и ск у |
либо |
до конца сп и ска, |
либо |
||||||||||||
до э л е м е н т а |
с |
номером |
к - 1 * / |
|
|
|
|
|
|
|
|
|
|||||
f o r (i n t |
i = 0 ; i< k - l& & r - > n e x t! =0; i+ + , r = r - > n e x t); |
||||||||||||||||
p - > n e x t = r - > n e x t ; / / с в я з а т ь |
p с |
концом |
списка |
||||||||||||||
/ / е с л и |
эл е м ен т |
не |
п о сл ед н и й , |
то |
с в я з а т ь |
|
конец |
||||||||||
// с п и с к а с |
р |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i f ( r - > n e x t != 0 )r - > n e x t- > p r e d = p ; |
|
||||
p - > p r e d = r; |
/ / с в я з а т ь р и г |
|
|||
r - > n e x t= p ; |
|
|
|
|
|
r e t u r n b e g ; |
//в е р н у т ь |
н ач ал о |
сп и ска |
||
} |
|
|
|
|
|
v o id |
m a in () |
|
|
|
|
{ |
|
|
|
|
|
p o in t* b e g ; |
|
|
|
|
|
i n t |
i , k ; |
|
|
|
|
do |
|
|
|
|
|
{ |
//п е ч а т ь |
меню |
|
|
|
|
|
|
|||
|
c o u t « " 1 .Make l i s t \ n M; |
|
|||
|
c o u t « " 2 . P r i n t l i s t \ n M; |
||||
|
c o u t « f,3 .A dd p o i n t \ n " ; |
|
|||
|
c o u t « " 4 . D e le te p o i n t \ n " ; |
||||
|
c o u t< < " 5 . E x i t \ n " ; |
|
|||
|
c in > > i; |
//в в о д |
вы бранного п ункта меню |
||
|
s w i t c h ( i ) |
|
|
||
|
{ |
|
|
|
|
|
c a s e |
1 : //ф о р м и р о ван и е |
сп и ска |
||
|
{ |
|
|
|
|
b e g = m a k e _ lis t( ) ; |
|
|
|
||
b re a k ; |
|
|
|
|
|
} |
c a s e |
2 : //п е ч а т ь |
сп и ска |
|
|
|
|
||||
|
{ |
|
|
|
|
p r i n t _ l i s t ( b e g ) ; |
|
|
|
||
b r e a k ; |
|
|
|
|
|
} |
c a s e |
3 : //д о б а в л е н и е эл ем ен та |
|||
|
|||||
|
{ |
c o u t « ,,\ n k - ? ” ; |
|
||
|
|
|
|||
c i n » k ; |
|
|
|
|
|
|
|
b e g = a d d _ p o in t( b e g ,k ) ; |
|||
|
|
b r e a k ; |
|
|
|
|
} |
|
|
|
|
|
c a s e |
4 : //у д а л е н и е эл ем ен та |