Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
профорг поясняет.doc
Скачиваний:
4
Добавлен:
14.08.2019
Размер:
752.13 Кб
Скачать

11.3 Результат работы программы

Рис. 14. Результат работы программы 10

  1. Лабораторная работа №11 «Информационные динамические структуры»

    1. Постановка задачи

Записи в линейном списке содержат ключевое поле типа int. Сформировать двунаправленный список. Добавить в него элемент с заданным номером, удалить К элементов из конца списка.

Разработать следующие функции:

  1. Создание списка.

  2. Добавление элемента в список (в соответствии со своим вариантом).

  3. Удаление элемента из списка (в соответствии со своим вариантом).

  4. Печать списка.

  5. Запись списка в файл.

  6. Уничтожение списка.

  7. Восстановление списка из файла.

    1. Программа решения задачи

#include <time.h>

#include <iostream>

#include <windows.h>

#include <fstream>

#include <conio.h>

#pragma hdrstop

using namespace std;

/*

Записи в линейном списке содержат ключевое поле типа int.

* Сформировать двунаправленный список. Добавить в него элемент

* с заданным номером, удалить К элементов из конца списка.

*/

struct list //список

{

int num;

list* next;

list* prev;

};

class dlist //создаем класс

{

list *first,*last; //поля класса

public: //методы класса

dlist(int n); //конструктор

void push(int num);

int print();

int del(int k);

int add(int n);

int put_to_file();

void read_from_file();

void del_list();

};

char* ru(const char* text);

#pragma argsused

int main(int argc, char* argv[])

{

int kolel; //количество эл-в в списке

cout << ru("Введите количество элементов в списке: ") << endl;

cin >> kolel;

dlist clist(kolel); //создаем список (объект класса dlist)

clist.print(); //печатаем список

int n;

cout << ru("Введите количество элементов, которое нужно удалить из конца списка: ") << endl;

cin >> n;

clist.del(n); //удаляем n элементов

int k;

cout << ru("Введите позицию, на которую нужно добавить новый элемент: ") << endl;

cin >> k;

clist.add(k); //добавляем элемент

clist.print();

clist.put_to_file(); //записываем в файл

clist.del_list(); //удаляем список

clist.read_from_file(); //восстанавливаем

clist.del_list(); //удаляем список

getch();

return 0;

}

// Создает список

dlist::dlist(int n)

{

first = NULL;

last = NULL;

srand(time(NULL));

for(int i=0; i<n; i++) push(rand()%9); //заполняем случ. числами

}

// Удаляет элемент n элементов из конца списка

int dlist::del(int k)

{

list *current;

current = last; //идем к последнему элементу

for(int i = 0; i<k; i++) //удаляем нужное количество

{

if(current == first) //если текущий - первый

{

current = NULL;

print();

return 0;

}

current = current->prev;

current->next = first;

first->prev = current;

last = current;

}

print();

return 0;

}

//Вставляет элементы

void dlist::push(int num)

{

list *buf = new list;

buf->num = num; //записываем элемент в буфер

//пишем эдемент в список

if(first == NULL)

{

first = buf;

last = buf;

buf->prev = buf;

buf->next = buf;

}

else

{

last->next = buf;

first->prev = buf;

buf->next = first;

buf->prev = last;

last = buf;

}

}

// Добавляет элемент с заданным номером

int dlist::add(int n)

{

n-=2;

//srand(time(NULL));

list *current = new list;

current = first;

/*if(current == NULL)

if(n!=0)

{

cout << "error";

return -1;

}

else

return 666; */

for(int i=0; i<n; i++)

current = current->next;

cout << ru("Введите элемент: ") << endl;

int f; //новый элемент

cin >>f;

list *buf = new list; //создаем новый элемент

buf->num = f; //вводим в буфер новый элемент

if(current == last) last = buf; //если он последний - просто ставим

buf->next = current->next; //вставляем элемент

buf->prev = current;

buf->prev->next = buf;

buf->next->prev = buf;

return 0;

}

//Печатает список

int dlist::print()

{

list *current = new list;

current = first; //устанавливаем указатель на первый элемент списка

if(current == NULL) //если вдруг список пуст

{

cout << endl << ru("Список пуст!")<<endl;

return -1;

}

int i=1;

do //выводим каждый элемент

{

cout << ru("Элемент номер ") << i << ": ";

cout << current->num << endl;

current = current->next;

i++;

} while(current!= first); //пока не дойдем до последнего

cout << endl;

return 0;

}

//Печатает список в файл

int dlist::put_to_file()

{

ofstream out("data", ios::out|ios::binary); //открываем файл для записи, устанавливаем дв. режим

if(!out)

{

cout << ru("Не удаётся открыть файл!")<<endl;

return -1;

}

list *current = new list;

current = first;

if(current == NULL) //если вдруг список пуст

{

cout << endl << ru("Список пуст!")<<endl;

return -1;

}

do

{

out.write((char *)&current,sizeof(list)); //записываем данные

current = current->next;

} while(current!= first);

out.close(); //закрываем файл

}

//Читает список из файла

void dlist::read_from_file()

{

cout << ru("Считываем из файла...")<<endl;

first = NULL;

last = NULL;

ifstream in("data", ios::in|ios::binary); //открываем файл для чтения

while(true)

{

list *current = new list;

in.read((char *)&current,sizeof(list)); //читаем данные

if(in.eof()) break; //пока файл не кончится

if(first == NULL)

{

first = current;

last = current;

current->prev = current;

current->next = current;

}

else

{

last->next = current;

first->prev = current;

current->next = first;

current->prev = last;

last = current;

}

}

in.close(); //закрываем файл

print();

}

//Удаляет список

void dlist::del_list()

{

cout << endl << ru("Удаляем список...") << endl;

list *current = new list;

do{

current = first; //берем первый элемент

first = first->next;

current = NULL; //убираем его

} while(first!=last); //пока не дойдем до конца

first = NULL;

}

char bufrus[256];

char* ru(const char* text)

{

CharToOem(text,bufrus);

return bufrus;

}