- •Національний університет “Львівська політехніка”
- •Курсова робота з дисципліни "Програмування" Частина 2
- •1 Теоретична частина
- •2. Завдання3 Побудова атд
- •2.1 Постановка задачі
- •3. Завдання 4 Застосування атд список
- •3.1 Постановка задачі
- •3.2.1 Словесний опис алгоритму
- •Додаток а Конструювання атд – список
- •Список літератури
- •Додаток в Завдання 4
Додаток в Завдання 4
файл element.h
#include<iostream>
usingnamespace std;
class element //кожен вузол списку - це обєкт класу element
{
public:
int data; //інформаційне поле (містить значення елемента)
element *down; //вказівник на наступний вузол наступного рядка
element *next; //вказівник на наступний вузол (у тому ж рядку)
};
файл list.h
#include"element.h"
#include<iomanip>
class list
{
public:
list(int _m, int _n); //конструктор
virtual~list(); //деструктор
void push(int item); //додає новий елемент
void Show(); //виводить список на екран
void del_elem(int pos_m, int pos_n); //видаляє елемент із заданою позицією
void dodaty(list *result, list *A, list *B); //додає два списки(матриці)
element get_head(); //повертає голову
private:
int m, n; //для розмірності матриці
int k; //для номеру записаного елемента у певному рядку
element *head; //голова списку
};
файл list.cpp
#include "list.h"\
/*Конструктор, створює розмірність майбутньої матриці*/
list::list(int _m, int _n){
m = _m; //задається розмірність
n = _n; //матриці
k = 0; //поки що немає жодного елемента
head = 0;
}
/*Деструктор*/
list::~list(){
element *temp_right;
element *temp;
while(head){ //для просування по рядках
temp_right = head;
head = head->down;
while(temp_right){ //для просування по стовбцях поточного рядка
temp = temp_right; //для видалення усіх елементів із поточного рядка
temp_right = temp_right->next;
delete temp;
}
}
}
/*Додавання у відповідне за порядком місце*/
void list::push(int item){
element *temp = head;
if(!temp){ //якщо список пустий(матриця пуста)
head = new element; //виділення памяті під новий елемент
temp = head;
}
else{ //якщо голова вже заповнена(перший елемент матриці)
while(temp->down) //шукаємо поточний рядок
temp = temp->down;
if(k < n){ //якщо у рядку ще не всі елементи заповнені
while(temp->next) //пошук поточного елемента
temp = temp->next;
temp->next = new element; //виділення памяті під новий елемент
temp = temp->next;
}
else{ //якщо почався новий рядок
k = 0; //поточний номер елемента у новому рядку=0
temp->down = new element; //виділення памяті під новий елемент
temp = temp->down;
}
}
temp->data = item; //занесення даних
temp->down = 0;
temp->next = 0;
k++; //поточний стовбець збільшується
}
/*Видаляння елемента за розташуванням у матриці*/
void list::del_elem(int pos_m, int pos_n){
element *temp = head;
int i=0;
while(i != pos_m){
temp = temp->down;
i++;
}
i = 0;
while(i != pos_n-1){
temp = temp->next;
i++;
}
element *temp_del = temp->next;
temp->next = temp->next->next;
delete temp_del;
}
/*Виводить на екран вміст матриці*/
void list::Show(){
element *temp_head = head;
element *temp;
cout << "Matrix :\n";
while(temp_head){ //проходження по рядках
temp = temp_head;
while(temp){ //проходження по стовпцях
printf("%3d",temp->data);
temp = temp->next;
}
temp_head = temp_head->down;
cout << "\n";
}
}
/*Повертає голову списку (початок матриці)*/
element list::get_head(){
return *head;
}
//повертає матрицю на 90 градусів за год стрілкою
void list::perevorot_90_degree(){
/*оголошення змінних*/
element *temp_down = head->down;
element *temp = head;
element *temp_up = head;
element *temp_center = head;
/*Робить перший реальний рядок останнім транспонованим*/
while(temp){
temp->down = temp->next;//тепер елмент переглядатимуться вниз а не вбік з 1 рядка
temp->next = 0; //це будуть останні елементи із
temp = temp->down; //транспонованих рядків
}
head->next = 0;
/*Робить кожен рядок стовпцем, побудова стовбців*/
while(temp_down){
temp = temp_down;
temp_center = temp_down;
temp_down = temp->down;
while(temp){
temp->down = temp->next;
temp->next = 0;
temp = temp->down;
}
temp_center->next = temp_up;
temp_up = temp_center;
}
head = temp_center;
temp_down = head;
temp_up = temp_down->next;
/*Повязує елементи із транспонованих стовбців у рядки*/
while(temp_up){
temp = temp_up;
while(temp){
temp_down->next = temp;
temp_down = temp_down->down;
temp = temp->down;
}
temp_down = temp_up;
temp_up = temp_up->next;
}
}
//транспонує матрицю
void list::transpon(){
element *temp;
element *prew;
element *next_r = head;
element *next_r_down;
while(next_r){
temp = next_r;
next_r_down = next_r->down;
while(temp){
temp->down = temp->next;
prew = temp;
temp = temp->next;
prew->next = 0;
}
next_r->next = next_r_down;
next_r = next_r->next;
}
element *elem = head;
element *temp_next;
while(elem->next){
temp = elem;
temp_next = temp->next;
while(temp){
temp->next = temp_next;
temp = temp->down;
temp_next = temp_next->down;
}
elem = elem->next;
}
}
файл main.cpp
#include"list.h"
int main(void)
{
int m; //кількість рядків
int n; //кількість стовпців
int k;
cout <<"Vvedit kilkist matryts: ";
cin >> k;
for(int i=0;i<k;i++){
cout <<"Vvedit rozmirnist matrytsi mxn:\n";
cout <<"m = ";
cin >> m;
cout <<"n = ";
cin >> n;
int temp;
list *A = new list(m, n);
cout <<"\nVvedid matrytsu A:\n";
for(int i=0; i<m; i++){ //введення матриці
for(int j=0; j<n; j++){
cin >> temp;
A->push(temp);
}
}
A->Show();
A->transpon();
cout <<"Transponovana matrytsa:\n";
A->Show();
}
return 0;
}
