490 likes | 716 Views
Программирование на языке высокого уровня. Для студентов очно-заочной формы обучения. Лекцию читает. Шумова Елена Олеговна доцент кафедры автоматизированных систем обработки информации и управления (АСОИ и У) shumovaeo@list.ru. Лекция № 3. Динамические структуры данных.
E N D
Программирование на языке высокого уровня Для студентов очно-заочной формы обучения
Лекцию читает Шумова Елена Олеговна доцент кафедры автоматизированных систем обработки информации и управления (АСОИ и У) shumovaeo@list.ru
Лекция № 3 Динамические структуры данных
Операция распределения динамической памяти new int a,b; float c, *d; int *p; p = &a; a = 10; *p += 5; cout << “ a = “ << a << “ *p = “ << *p;
Формат операции: указатель = new имя_типа [инициализ-р]; где: имя_типа - имя базового типа или имя типа, определенного пользователем; инициализатор - значение, которое заносится в выделенную память; указатель - содержит возвращаемое значение адреса.
Для выделения памяти под массив используется форма: указатель = new тип_массива; где: тип_массива- тип элементов массива с указанием его размера; указатель - содержит возвращаемое значение адреса первого элемента массива при успешном завершении.
Пример: int *i; // переменная i типа указатель на целое i = new int(0); // операция new выделяет в динамической // памяти участок длиной sizeof (int), заносит в // него значение 0 (ноль);адрес, выделенного // участка, заносит в i.
Пример выделения памяти под массив, заполнения его данными и вывода на экран. #include <iostream.h> #define n 5 void main(void) {int *p, i; if (p = new int[n]) { cout<<"\nВведите данные в массив" for (i=0; i<n; i++) { cout<<"\n p["<<i<<"]="; cin>>*(p+i); }
cout<<"\nВывод значений массива“; for (i=0; i<n; i++) cout<<" p["<<i<<"]="<<*(p+i); } else cout<<"\nПамять не выделена"; }
Операция освобождения динамической памяти delete Операция delete освобождает память в динами-ческой области, распределенную ранее операцией new. Формат операции: delete указатель; для массивов delete [] указатель;
Список Список – это совокупность объектов, называемых далее элементами списка, в которой каждый объект содержит информацию о местоположении связанного с ним объекта.
Например: struct STUD { char fio[25]; char shifr[10]; int matem; int prog; STUD *adr; };
Односвязный (однонаправленный) список Указатель на начало Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные
Кольцевой список Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные
Двусвязный (двунаправленный) список Указ-ль на начало Указ-ль на след.эл-т Данные Указ-ль на пред.эл-т Указ-ль на след.эл-т Данные Указ-ль на пред.эл-т Указ-ль на след.эл-т Данные Указ-ль на пред.эл-т Ука Указ-ль на конец
Пример программы работы со списком #include <iostream.h> #include <stdlib.h> #include <iomanip.h> struct CH { int k; CH *ptr; };
// прототипы функций CH * aadd_sp( CH *); void output ( CH *); CH * del_sp ( CH *); void main() { CH *beg=NULL; char c; while(1) { cout << "\n\n1. Добавление эл-та в список\n"; cout << "2. Вывод списка на экран\n";
cout << "3. Удаление элемента из списка\n"; cout << "4. Выход из программы\n"; cout << "Ваш выбор:"; cin >> c; switch(c) { case '1': beg=aadd_sp(beg); break; case '2': output(beg); break;
case '3': beg=del_sp(beg); break; case '4': return; } } }
// определение ф-ции добавл. эл-та в список CH * aadd_sp( CH *first) { CH *r, *r1; int m; cout << "Введите целое число="; cin >> m; // выделяем динамическую память r = new (CH); if ( r == NULL) { cerr << "Ошибка выделения дин.памяти\n"; exit(1); }
// заносим в дин. память введенное число r->k = m; r->ptr = NULL; if (first == NULL)// список пустой first = r; else { r1 = first; while ( r1->ptr != NULL) r1 = r1->ptr; r1->ptr = r; } return first; }
1-е обращение к функции r 5 NULL 5 NULL r 5 NULL first
2-е обращение к функции r first 5 NULL NULL 3 r first NULL 5 3 r1
3-е обращение к функции first 5 NULL 3 7 NULL r first 7 NULL 5 3
// определение ф-ции вывода сод. списка void output ( CH * first) { CH * r; r = first; if ( r == NULL) cout << "Список пуст\n"; else { cout << "Элементы списка:\n"; while (r != NULL) { cout << setw(5) << r->k; r = r->ptr; } }}
first 7 NULL 5 3 r
// определение функции удаления // последнего элемента в списке CH * del_sp ( CH *first) { CH *p, *p1; p = p1= first; if (p == NULL) cout << "Список пуст. Удалять нечего.\n"; else { while (p->ptr != NULL) // ищем последний эл-т { p1 = p; p = p->ptr; }
// теперь p содержит последний эл-т, // p1 - предпоследний delete p; // удалили последний элемент p1->ptr = NULL; } return first; }
first 5 3 7 NULL p, p1 first 5 3 7 NULL p1 p 5 3 7 NULL first p1 p first 5 3 NULL p1
Стек #include <iostream.h> #include <stdlib.h> #include <iomanip.h> struct CH { int k; CH *ptr; }; CH * aadd_stek( CH *); CH * del_stek ( CH *);
void main() { CH *beg=NULL; char c; while(1) { cout << "\n1. Добавление элемента вcтек\n"; cout << "2. Выборка элемента из стека\n"; cout << "3. Выход из программы\n"; cout << "Ваш выбор:"; cin >> c;
switch(c) { case '1': beg=aadd_stek(beg); break; case '2': beg=del_stek(beg); break; case '3': return; } } }
// определение ф-ции добавления эл-та в стек CH * aadd_stek( CH *first) { CH *r; int m; cout << "Введите целое число="; cin >> m; r = new (CH); if ( r == NULL) {cerr << "Ошибка выделения дин. памяти"; exit(1); } r->k = m; r->ptr = first; return r; }
r 3 r first 2 2 r first 1 1 1 NULL NULL NULL
// определение ф-ции выборки эл-та из стека CH * del_stek ( CH *first) { CH *r; if (first == NULL) cout << "Стек пуст. Выбирать нечего.\n"; else { r=first; first = first->ptr; cout << "Из стека выбран эл-т = " << r->k << endl; delete r; } return first; }
first r 3 3 first first 2 2 2 1 1 1 NULL NULL NULL
Очередь #include <iostream.h> #include <stdlib.h> #include <iomanip.h> struct CH { int k; CH *ptr; }; void aadd_och( CH **, CH **); void del_och ( CH **, CH **);
void main() { CH *pbeg=NULL, *pend=NULL; char c; while(1) { cout << "1. Добавление эл-та в очередь\n"; cout << "2. Выборка эл-та из очереди\n"; cout << "3. Выход из программы\n"; cout << "Ваш выбор:"; cin >> c;
switch(c) { case '1': aadd_och(&pbeg, &pend); break; case '2': del_och(&pbeg, &pend); break; case '3': return; } } }
// определение ф-ции добавления эл-та // в очередь void aadd_och ( CH **pn, CH **pk) { CH *r; int m; cout << "Введите целое число="; cin >> m; r = new (CH); if ( r == NULL) { cerr << "Ошибка выделения дин.памяти\n"; exit(1); }
r->k = m; r->ptr = NULL; if (*pn == NULL) { *pn = r; *pk = r; } else { (*pk)->ptr = r; *pk = r; } }
r NULL 1 *pn *pk *pn r 2 1 NULL NULL *pk r *pn 1 2 NULL *pk r *pn 1 NULL 2 3 *pk
// определение ф-ции выборки эл-та из очереди void del_och ( CH **pn, CH **pk) { CH *p; if (*pn == NULL) cout << "Очередь пуста. Выбирать нечего.\n"; else { p = *pn; cout << "Из очереди выбран эл-т = " << p->k << endl; *pn = p->ptr; // 2-ой эл-т стал 1-ым delete p; // удалили первый эл-т }}
*pn 1 2 NULL 3 *pk *pn 1 2 3 NULL p *pk *pn 2 3 NULL *pk
Тестовые задания Определите результаты работы программ. Пусть в файле prim.txt записаны такие данные: ****1****2****3****4****5 #include <fstream.h> // Задание 1 void main() {char c;int i; ifstream fl("prim.txt"); for (i=1; i <=5; i++) { fl.seekg(4L,ios::cur); fl.get(c); cout << c; } fl.close(); }
Пусть в файле prim.txt записаны такие данные 12345*12345*12345*12345*12345* #include <fstream.h> // Задание 2 void main() {char c;int i; ifstream fl("prim.txt"); while(fl) {fl.seekg(5L,ios::cur); fl.get(c); cout << c; } fl.close(); }
Пусть в файле prim.txt записан такой текст Разработка программного обеспечения #include <fstream.h> // Задание 3 void main() {char st[50]; ifstream fl("prim.txt"); fl.get(st,12,'\n'); cout << st << endl; fl.seekg(0L,ios::beg); fl.getline(st,50,'\n'); cout << st << " "; fl.close(); }
Пусть в файле prim.txt записан такой текст Изучаем программирование #include <fstream.h> // Задание 4 void main() { char st[50]; ifstream fl("prim.txt"); fl.seekg(8L,ios::beg); fl.get(st,30,'\n'); cout << st << endl; fl.clear(!ios::end); fl.seekg(0L,ios::beg); fl.getline(st,50,'\n'); cout << st << " "; fl.close(); }
Пусть в файле prim.txt записаны такие данные *********1*********2*********3 #include <fstream.h> // Задание 5 void main() {char st[10]; ifstream fl("prim.txt"); while(fl) { fl.seekg(6L,ios::cur); fl.get(st,5,'\n'); cout << st << endl; } fl.close(); }