Сортировка данных в массиве. Оценка эффективности метода
Содержание:
Задание
Написать программу, строящую следующую списочную структуру. Каждый элемент списка состоит из трех полей: первое поле – для связи элементов в одном списке, второе – информационное (заполняется вводимой последовательностью целых чисел , в которой 0 отмечает конец каждого списка; числа и не вводятся, а подсчитываются при вводе последовательности), третье поле – для связи двух линейных списков. Если , то второй список должен быть дополнен элементами с нулевыми информационными полями; при первый список должен оказаться короче второго. Ссылочным полям, которые никуда не ведут, должно быть присвоено значение NIL. Ссылочная переменная используется для доступа к списочной структуре.
Линейные списки и работа с ними
Линейный список – это способ организации элементов некоторого множества путём указания для каждого из элементов ссылки на следующий или/и предыдущий элемент.
Если для каждого элемента множества указать ссылку на следующий, то получим однонаправленный (односвязный) список.
Если добавить в каждый элемент вторую ссылку – на предыдущий элемент, то получится двунаправленный список (двусвязный).
Если последний элемент связать с первым с помощью указателя, получим кольцевой список.
Каждый элемент списка содержит ключ, идентифицирующий этот элемент. Ключ обычно бывает либо целым числом, либо строкой и является частью поля данных. В качестве ключа в процессе работы со списком могут выступать разные части поля данных. Ключи разных элементов списка могут совпадать.
Над списками можно выполнять следующие операции:
• начальное формирование списка (создание первого элемента);
• добавление элемента в конец списка;
• чтение элемента с заданным ключом;
• вставка элемента в заданное место списка (до или после элемента с заданным ключом);
• удаление элемента с заданным ключом;
• упорядочивание списка по ключу.
Рассмотрим однонаправленный список.
Каждый элемент списка может быть описан следующей структурой:
struct List {
int inf; //информационное поле
List *next; //ссылочное поле для связи элементов в списке
};
Для создания списка и работы с ним необходимо иметь два основных указателя (на начало списка - pBeg, на конец списка - pEnd) и один вспомогательный временный указатель (tmp).
Создание списка
- определение нулевого адреса для начала и конца списка
pBeg=0;
pEnd=0;
pBeg
* nil
pEnd
* nil
Добавление элемента в список
а) добавление первого элемента
- исходное состояние
pBeg
* nil
pEnd
* nil
tmp
?
* ?
- выделение памяти под первый элемент списка
pBeg
* nil
pEnd
* nil
next
inf
tmp
?
*
* ?
?
- занесение информации в первый элемент
tmp->inf=d;
tmp->next=0;
pBeg
* nil
pEnd
* nil
next
inf
tmp
?
*
d
* nil
- установка указателей начала и конца списка на первый элемент
pBeg=tmp;
pEnd=tmp;
pEnd
pBeg
*
next
inf
tmp
?
*
d
* nil
*
б) добавление второго и последующих элементов в конец списка
- исходное состояние
*
pEnd
pBeg
*
d3
* nil
d2
* nil
d1
* nil
tmp
?
* ?
- выделение памяти под новый элемент списка
next
inf
tmp
?
*
* ?
?
*
pEnd
pBeg
*
d3
* nil
d2
* nil
d1
* nil
- занесение информации в новый элемент списка
tmp->inf=d;
tmp->next=0;
next
inf
tmp
?
*
d
* nil
pEnd
pBeg
*
*
d3
* nil
d2
* nil
d1
* nil
- установка связи между последним элементом списка и новым элементом
pEnd->next=tmp;
d
*
tmp
* nil
*
pEnd
pBeg
*
d3
* nil
d2
* nil
d1
* nil
- перемещение указателя конца списка на новый элемент
pEnd=tmp;
tmp
pEnd
pBeg
*
*
*
d3
* nil
d2
* nil
d1
* nil
d
* nil
Удаление элемента из списка
- исходное состояние
*
pEnd
pBeg
*
d3
* nil
d2
* nil
d1
* nil
tmp
?
*
- установка вспомогательного указателя на удаляемый элемент
tmp=pBeg;
*
pEnd
pBeg
*
d3
* nil
d2
* nil
d1
* nil
tmp
*
- перемещение указателя начала списка на следующий элемент
pBeg=tmp->next;
tmp
*
*
pEnd
pBeg
*
d3
* nil
d2
* nil
d1
* nil
- занесение пустого адреса в удаляемый элемент списка
tmp->next=0;
tmp
*
d1
* nil
pEnd
pBeg
*
*
d3
* nil
d2
* nil
- освобождение памяти, где находится удаляемый элемент
Аналогично можно реализовать и другие операции со списком.
Блок-схема алгоритма решения задачи
Программная реализация
Для реализации алгоритма формирования списочной структуры на языке C++ в среде программирования Visual Studio 2008 выполним следующие действия:
- подключаем заголовочные файлы с помощью директивы #include и указываем, что будем использовать пространство имен std
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
- описываем структуру List2 с тремя полями:
- целочисленное поле inf – информационное;
- ссылочное поле next – для связи элементов в одном списке;
- ссылочное поле nextL – для связи двух линейных списков.
struct List2 {
int inf; //информационное поле
List2 *next; //ссылочное поле для связи элементов в списке
List2 *nextL; //ссылочное поле для связи двух линейных списков
};
- Объявляем функции
void create_List2(List2**,int,int);
void add_to_List2(List2**,int);
void print_List2(List2*);
void print_List2_to_file(List2*);
- Описываем функцию, с которой начинается выполнение программы:
int _tmain(int argc, _TCHAR* argv[]){
setlocale(LC_ALL, "Russian");//использование кириллицы в консоли
List2 *S=0; //ссылочная переменная для доступа к списочной структуре
int *a=new int[100]; //вводимая последовательность целых чисел
int n=0,k=0; //количество элементов в списке 1 и списке 2 списочной структуре
int i=0, p=0, x; //вспомогательные переменные
bool done = false;
cout<<"Введите последовательность {a} целых чисел:"<<endl;
while (p!=2)
{
do
{
cin>>x;
if (x!=0) {
*(a+i)=x;
i++;
}
}while (x!=0);
p++;
if (p==1) n=i;
}
k=i-n;
//cout<<"Последовательность чисел {a}:"<<endl;
//for (i=0; i<n+k; i++)
// cout<<*(a+i)<<' ';
if ((n==0) && (k==0)) cout<<"Списочная структура пуста."<<endl;
else{
//Формирование списочной структуры
if (n>k){
for (i=0; i<n-k; i++)
create_List2(&S,a[i],0);
int j=0;
for (i=n-k; i<n; i++){
create_List2(&S,a[i],a[n+j]);
j++;
}
}
else{ //Формирование списочной структуры при N<=K
for (i=0; i<n; i++)
create_List2(&S,a[i],a[n+i]);
if (n<k){
for (i=2*n; i<n+k; i++)
add_to_List2(&S,a[i]);
}
}
//Вывод списков на экран
cout<<"\nСписочная структура:"<<endl;
print_List2(S);
//Вывод списочной структуры в файл
print_List2_to_file(S);
}
//навигация по списочной структуре
char y,c;
bool end; //определяет возможность навигации
List2 *tmp,*t;
tmp=S;
n=2; //до навигации находимся во 2-м списке
y='y';
t=0;
while (y=='y'){
end=true;
cout<<"\nТекущий элемент:"<<endl;
cout<<tmp->inf;
cout<<"\nНажмите клавишу управления:"<<endl;
c=getchar();
while(c!='0'){
switch (c){
case '4':
{ //нажата клавиша влево
if (n==1) cout<<"Находимся в списке 1. Нажмите вправо(6)."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"влево\n";
cout<<" < "<<t->inf<<endl;
tmp=t;
}
}
else cout<<"Достигнут конец списка 2. Слева пусто."<<endl;
}
break;
}
case '2':
{ //нажата клавиша вниз
if (n==1) {
cout<<"Находимся в списке 1. Внизу пусто."<<endl;
}
else{
if (tmp->nextL!=0){
t=tmp->nextL;
if (t!=0){
cout<<"вниз\n";
cout<<t->inf<<endl;
tmp=t;
n=1;//переход к списку 1
cout<<"Перешли в список 1. Нажмите вправо(6) или 0."<<endl;
}
}
else cout<<"Внизу пусто."<<endl;
}
break;
}
case '6':
{ //нажата клавиша вправо
if (n==2) cout<<"Находимся в списке 2. Нажмите влево(4), вниз(2) или 0."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"вправо\n"<<endl;
cout<<" > "<<t->inf<<endl;
tmp=t;
}
}
else{
cout<<"Достигнут конец списка 1. Справа пусто."<<endl;
end=false;
}
}
break;
}
}
if (end==false) c='0';
else c=getchar();
}
y=getchar();
cout<<"\nПовторить навигацию? (y/n)"<<endl;
y=getchar();
if (y=='y') {
tmp=S;
n=2;
}
else break;
}
delete[] a;//освобождение памяти, занятой массивом a
system("pause");
return 0;
}
- Определяем функции, необходимые для решения поставленной задачи формирования и вывода списочной структуры:
- функция create_List2 для добавления элементов в списочную структуру
Параметры функции
tmpS – указатель на списочную структуру
d1 – информационное поле элемента списка 1
d2 – информационное поле элемента списка 2
void create_List2(List2 **tmpS, int d1, int d2) {
List2 *tmp1, *tmp2;
tmp1 = new List2;
tmp2 = new List2;
tmp1->inf = d1;
tmp2->inf = d2;
tmp1->next=0;
tmp1->nextL=0;
if (*tmpS==0) { //если добавляем 1-й элемент в каждый из списков
tmp2->next=0;
tmp2->nextL=tmp1;
}
else{
tmp2->next=*tmpS;
tmp2->nextL=tmp1;
((tmp2->next)->nextL)->next=tmp1;
}
*tmpS=tmp2;
}
- функция add_to_List2 для формирования списка 2 списочной структуры при N<K
Параметры функции
tmpS – указатель на списочную структуру
d – информационное поле элемента списка 2
void add_to_List2(List2 **tmpS, int d) {
List2 *tmp = new List2;
tmp->inf = d;
tmp->next=*tmpS;
tmp->nextL=0;
*tmpS=tmp;
}
- функция print_List2 для вывода списочной структуры на экран
Параметры функции
tmpS – указатель на списочную структуру
void print_List2(List2 *tmpS) {
List2 *tmp;
tmp=tmpS;
cout<<"Список 2"<<endl;
while (tmp) {
cout <<tmp->inf<< " ";
tmp = tmp->next;
}
cout << endl;
tmp=tmpS;
cout<<"Список 1"<<endl;
while (tmp) {
if (tmp->nextL!=0)
cout << (tmp->nextL)->inf << " ";
tmp = tmp->next;
}
cout << endl;
}
- функция print_List2_to_file для вывода списочной структуры в файл
Параметры функции
tmpS – указатель на списочную структуру
void print_List2_to_file(List2 *tmpS){
List2 *tmp;
tmp=tmpS;
ofstream txtFile; //создание объекта для записи в файл
txtFile.open("fileout.txt",ios::out); // открытие файла в режиме записи данных,
//при этом информация в существующем файле уничтожается (режим по умолчанию для потоков ofstream)
txtFile<<"Списочная структура:"; //запись строки в файл fileout.txt
txtFile << "\nСписок 2\n"; //запись значения переменной ch в файл fileout.txt
while (tmp) {
txtFile << tmp->inf;
txtFile << " ";
tmp = tmp->next;
}
tmp=tmpS;
txtFile << "\nСписок 1\n";
while (tmp) {
if (tmp->nextL!=0){
txtFile << (tmp->nextL)->inf;
txtFile << " ";
}
tmp = tmp->next;
}
txtFile.close(); // закрытие файла fileout.txt
}
Результаты работы программы
а) Количество элементов в каждом из двух линейных списков списочной структуры одинаково () (рис. 1-2):
Рис. 1. Вид консоли после выполнения программы при
Рис. 2. Списочная структура при
б) Количество элементов в первом списке больше, чем во втором списке () (рис. 3-4):
Рис. 3. Вид консоли после выполнения программы при ,
Рис. 4. Списочная структура при ,
(добавлено три нуля во второй список)
в) Количество элементов во втором списке больше, чем в первом списке () (рис. 5-6):
Рис. 5. Вид консоли после выполнения программы при ,
Рис. 6. Списочная структура при ,
Навигация по списочной структуре
а) Последовательная навигация по всем элементам структуры (рис. 7):
Рис. 7. Последовательная навигация по всем элементам структуры
б) Повторная навигация с указанием неверных направлений и завершение навигации путем введения символа «0» (рис. 8):
Рис. 8. Повторная навигация
Инструкция пользователя
Разработанная в ходе написания курсовой работы программа позволяет организовать списочную структуру, состоящую из двух линейных однонаправленных списков.
После запуска программы необходимо ввести последовательность целых чисел, которая определит значения, хранящиеся в информационном поле каждого элемента создаваемой списочной структуры. В последовательности должно быть два нулевых значения: после ввода чисел для занесения в первый список и в конце всей вводимой последовательности.
Если ввести два нуля, то программа выдаст сообщение «Списочная структура пуста».
После завершения ввода последовательности целых чисел программа выполняет формирование списочной структуры и её вывод на экран и текстовый файл fileout.txt, расположенный в папке проекта (…/List/List/ fileout.txt).
Вывод построенной списочной структуры на экран осуществляется в следующем виде:
а) при одинаковом количестве элементов в каждом из линейных списков и в случае, если во втором списке больше элементов, чем в первом
Списочная структура:
Список 2
Список 1
б) в случае, если в первом списке больше элементов, чем во втором
Списочная структура:
Список 2
Список 1
(количество нулей во втором списке определяется разницей между количеством элементов в списках)
После вывода списочной структуры осуществляем навигацию по ней с помощью клавиш (влево – 4, вниз – 2, вправо – 6, завершение – 0).
По первому списку можно перемещаться только вправо, а по второму – влево и вниз. При навигации вниз происходит переход от второго списка к первому. При выборе неверного направления выводится соответствующее сообщение. Навигацию можно завершить в любой момент, введя число 0 с клавиатуры. Кроме того в программе предусмотрена возможность повторить навигацию.
Выводы
В ходе выполнения курсовой работы была разработана программа, позволяющая строить списочную структуру, каждый элемент которой состоит из трех полей: первое поле – для связи элементов в одном списке, второе – информационное, третье поле – для связи двух линейных списков.
Приложение
Листинг (файл List.cpp)
// List.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <fstream>
using namespace std;
//Списочная структура
struct List2 {
int inf; //информационное поле
List2 *next; //ссылочное поле для связи элементов в списке
List2 *nextL; //ссылочное поле для связи двух линейных списков
};
//Объявление функций
void create_List2(List2**,int,int); //начальное формирование списка
void add_to_List2(List2**,int);
void print_List2(List2*);
void print_List2_to_file(List2*);
void navigate_element(int,List2*);
int _tmain(int argc, _TCHAR* argv[]){
setlocale(LC_ALL, "Russian");//использование кириллицы в консоли
//********************************************
cout<<"Курсовая работа по информатике."<<endl;
cout<<"Выполнил студент группы АП-84"<<endl;
cout<<"Брумм Евгений"<<endl;
//********************************************
List2 *S=0; //ссылочная переменная для доступа к списочной структуре
int *a=new int[100]; //вводимая последовательность целых чисел
int n=0,k=0;
int i=0,p=0,x;
bool done = false;
cout<<"Введите последовательность {a} целых чисел:"<<endl;
while (p!=2)
{
do
{
cin>>x;
if (x!=0) {
*(a+i)=x;
i++;
}
}while (x!=0);
p++;
if (p==1) n=i;
}
k=i-n;
//cout<<"Последовательность чисел {a}:"<<endl;
//for (i=0; i<n+k; i++)
// cout<<*(a+i)<<' ';
if ((n==0) && (k==0)) cout<<"Списочная структура пуста."<<endl;
else{
//Формирование списочной структуры
if (n>k){
for (i=0; i<n-k; i++)
create_List2(&S,a[i],0);
int j=0;
for (i=n-k; i<n; i++){
create_List2(&S,a[i],a[n+j]);
j++;
}
}
else{ //Формирование списочной структуры при N<=K
for (i=0; i<n; i++)
create_List2(&S,a[i],a[n+i]);
if (n<k){
for (i=2*n; i<n+k; i++)
add_to_List2(&S,a[i]);
}
}
//Вывод списков на экран
cout<<"\nСписочная структура:"<<endl;
print_List2(S);
//Вывод списочной структуры в файл
print_List2_to_file(S);
}
//навигация по списочной структуре
char y,c;
bool end; //определяет возможность навигации
List2 *tmp,*t;
tmp=S;
n=2; //до навигации находимся во 2-м списке
y='y';
t=0;
while (y=='y'){
end=true;
cout<<"\nТекущий элемент:"<<endl;
cout<<tmp->inf;
cout<<"\nНажмите клавишу управления:"<<endl;
c=getchar();
while(c!='0'){
switch (c){
case '4':
{ //нажата клавиша влево
if (n==1) cout<<"Находимся в списке 1. Нажмите вправо(6)."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"влево\n";
cout<<" < "<<t->inf<<endl;
tmp=t;
}
}
else cout<<"Достигнут конец списка 2. Слева пусто."<<endl;
}
break;
}
case '2':
{ //нажата клавиша вниз
if (n==1) {
cout<<"Находимся в списке 1. Внизу пусто."<<endl;
}
else{
if (tmp->nextL!=0){
t=tmp->nextL;
if (t!=0){
cout<<"вниз\n";
cout<<t->inf<<endl;
tmp=t;
n=1;//переход к списку 1
cout<<"Перешли в список 1. Нажмите вправо(6) или 0."<<endl;
}
}
else cout<<"Внизу пусто."<<endl;
}
break;
}
case '6':
{ //нажата клавиша вправо
if (n==2) cout<<"Находимся в списке 2. Нажмите влево(4), вниз(2) или 0."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"вправо\n"<<endl;
cout<<" > "<<t->inf<<endl;
tmp=t;
}
}
else{
cout<<"Достигнут конец списка 1. Справа пусто."<<endl;
end=false;
}
}
break;
}
}
if (end==false) c='0';
else c=getchar();
}
y=getchar();
cout<<"\nПовторить навигацию? (y/n)"<<endl;
y=getchar();
if (y=='y') {
tmp=S;
n=2;
}
else break;
}
delete[] a;//освобождение памяти, занятой массивом a
system("pause");
return 0;
}
//начальное формирование списка
void create_List2(List2 **tmpS, int d1, int d2) {
List2 *tmp1, *tmp2;
tmp1 = new List2;
tmp2 = new List2;
tmp1->inf = d1;
tmp2->inf = d2;
tmp1->next=0;
tmp1->nextL=0;
if (*tmpS==0) { //если добавляем 1-й элемент в каждый из списков
tmp2->next=0;
tmp2->nextL=tmp1;
}
else{
tmp2->next=*tmpS;
tmp2->nextL=tmp1;
((tmp2->next)->nextL)->next=tmp1;
}
*tmpS=tmp2;
}
//формирование списка 2 при N<K
void add_to_List2(List2 **tmpS, int d) {
List2 *tmp = new List2;
tmp->inf = d;
tmp->next=*tmpS;
tmp->nextL=0;
*tmpS=tmp;
}
//вывод списочной структуры на экран
void print_List2(List2 *tmpS) {
List2 *tmp;
tmp=tmpS;
cout<<"Список 2"<<endl;
while (tmp) {
cout <<tmp->inf<< " ";
tmp = tmp->next;
}
cout << endl;
tmp=tmpS;
cout<<"Список 1"<<endl;
while (tmp) {
if (tmp->nextL!=0)
cout << (tmp->nextL)->inf << " ";
tmp = tmp->next;
}
cout << endl;
}
//вывод списочной структуры в файл
void print_List2_to_file(List2 *tmpS){
List2 *tmp;
tmp=tmpS;
ofstream txtFile; //создание объекта для записи в файл
txtFile.open("fileout.txt",ios::out); // открытие файла в режиме записи данных,
//при этом информация в существующем файле уничтожается (режим по умолчанию для потоков ofstream)
txtFile<<"Списочная структура:"; //запись строки в файл fileout.txt
txtFile << "\nСписок 2\n"; //запись значения переменной ch в файл fileout.txt
while (tmp) {
txtFile << tmp->inf;
txtFile << " ";
tmp = tmp->next;
}
tmp=tmpS;
txtFile << "\nСписок 1\n";
while (tmp) {
if (tmp->nextL!=0){
txtFile << (tmp->nextL)->inf;
txtFile << " ";
}
tmp = tmp->next;
}
txtFile.close(); // закрытие файла fileout.txt
}
Приложение
Листинг (файл List.cpp)
// List.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <fstream>
using namespace std;
//Списочная структура
struct List2 {
int inf; //информационное поле
List2 *next; //ссылочное поле для связи элементов в списке
List2 *nextL; //ссылочное поле для связи двух линейных списков
};
//Объявление функций
void create_List2(List2**,int,int); //начальное формирование списка
void add_to_List2(List2**,int);
void print_List2(List2*);
void print_List2_to_file(List2*);
void navigate_element(int,List2*);
int _tmain(int argc, _TCHAR* argv[]){
setlocale(LC_ALL, "Russian");//использование кириллицы в консоли
//********************************************
cout<<"Курсовая работа по информатике."<<endl;
cout<<"Выполнил студент группы АП-84"<<endl;
cout<<"Брумм Евгений"<<endl;
//********************************************
List2 *S=0; //ссылочная переменная для доступа к списочной структуре
int *a=new int[100]; //вводимая последовательность целых чисел
int n=0,k=0;
int i=0,p=0,x;
bool done = false;
cout<<"Введите последовательность {a} целых чисел:"<<endl;
while (p!=2)
{
do
{
cin>>x;
if (x!=0) {
*(a+i)=x;
i++;
}
}while (x!=0);
p++;
if (p==1) n=i;
}
k=i-n;
//cout<<"Последовательность чисел {a}:"<<endl;
//for (i=0; i<n+k; i++)
// cout<<*(a+i)<<' ';
if ((n==0) && (k==0)) cout<<"Списочная структура пуста."<<endl;
else{
//Формирование списочной структуры
if (n>k){
for (i=0; i<n-k; i++)
create_List2(&S,a[i],0);
int j=0;
for (i=n-k; i<n; i++){
create_List2(&S,a[i],a[n+j]);
j++;
}
}
else{ //Формирование списочной структуры при N<=K
for (i=0; i<n; i++)
create_List2(&S,a[i],a[n+i]);
if (n<k){
for (i=2*n; i<n+k; i++)
add_to_List2(&S,a[i]);
}
}
//Вывод списков на экран
cout<<"\nСписочная структура:"<<endl;
print_List2(S);
//Вывод списочной структуры в файл
print_List2_to_file(S);
}
//навигация по списочной структуре
char y,c;
bool end; //определяет возможность навигации
List2 *tmp,*t;
tmp=S;
n=2; //до навигации находимся во 2-м списке
y='y';
t=0;
while (y=='y'){
end=true;
cout<<"\nТекущий элемент:"<<endl;
cout<<tmp->inf;
cout<<"\nНажмите клавишу управления:"<<endl;
c=getchar();
while(c!='0'){
switch (c){
case '4':
{ //нажата клавиша влево
if (n==1) cout<<"Находимся в списке 1. Нажмите вправо(6)."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"влево\n";
cout<<" < "<<t->inf<<endl;
tmp=t;
}
}
else cout<<"Достигнут конец списка 2. Слева пусто."<<endl;
}
break;
}
case '2':
{ //нажата клавиша вниз
if (n==1) {
cout<<"Находимся в списке 1. Внизу пусто."<<endl;
}
else{
if (tmp->nextL!=0){
t=tmp->nextL;
if (t!=0){
cout<<"вниз\n";
cout<<t->inf<<endl;
tmp=t;
n=1;//переход к списку 1
cout<<"Перешли в список 1. Нажмите вправо(6) или 0."<<endl;
}
}
else cout<<"Внизу пусто."<<endl;
}
break;
}
case '6':
{ //нажата клавиша вправо
if (n==2) cout<<"Находимся в списке 2. Нажмите влево(4), вниз(2) или 0."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"вправо\n"<<endl;
cout<<" > "<<t->inf<<endl;
tmp=t;
}
}
else{
cout<<"Достигнут конец списка 1. Справа пусто."<<endl;
end=false;
}
}
break;
}
}
if (end==false) c='0';
else c=getchar();
}
y=getchar();
cout<<"\nПовторить навигацию? (y/n)"<<endl;
y=getchar();
if (y=='y') {
tmp=S;
n=2;
}
else break;
}
delete[] a;//освобождение памяти, занятой массивом a
system("pause");
return 0;
}
//начальное формирование списка
void create_List2(List2 **tmpS, int d1, int d2) {
List2 *tmp1, *tmp2;
tmp1 = new List2;
tmp2 = new List2;
tmp1->inf = d1;
tmp2->inf = d2;
tmp1->next=0;
tmp1->nextL=0;
if (*tmpS==0) { //если добавляем 1-й элемент в каждый из списков
tmp2->next=0;
tmp2->nextL=tmp1;
}
else{
tmp2->next=*tmpS;
tmp2->nextL=tmp1;
((tmp2->next)->nextL)->next=tmp1;
}
*tmpS=tmp2;
}
//формирование списка 2 при N<K
void add_to_List2(List2 **tmpS, int d) {
List2 *tmp = new List2;
tmp->inf = d;
tmp->next=*tmpS;
tmp->nextL=0;
*tmpS=tmp;
}
//вывод списочной структуры на экран
void print_List2(List2 *tmpS) {
List2 *tmp;
tmp=tmpS;
cout<<"Список 2"<<endl;
while (tmp) {
cout <<tmp->inf<< " ";
tmp = tmp->next;
}
cout << endl;
tmp=tmpS;
cout<<"Список 1"<<endl;
while (tmp) {
if (tmp->nextL!=0)
cout << (tmp->nextL)->inf << " ";
tmp = tmp->next;
}
cout << endl;
}
//вывод списочной структуры в файл
void print_List2_to_file(List2 *tmpS){
List2 *tmp;
tmp=tmpS;
ofstream txtFile; //создание объекта для записи в файл
txtFile.open("fileout.txt",ios::out); // открытие файла в режиме записи данных,
//при этом информация в существующем файле уничтожается (режим по умолчанию для потоков ofstream)
txtFile<<"Списочная структура:"; //запись строки в файл fileout.txt
txtFile << "\nСписок 2\n"; //запись значения переменной ch в файл fileout.txt
while (tmp) {
txtFile << tmp->inf;
txtFile << " ";
tmp = tmp->next;
}
tmp=tmpS;
txtFile << "\nСписок 1\n";
while (tmp) {
if (tmp->nextL!=0){
txtFile << (tmp->nextL)->inf;
txtFile << " ";
}
tmp = tmp->next;
}
txtFile.close(); // закрытие файла fileout.txt
}
Приложение
Листинг (файл List.cpp)
// List.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <fstream>
using namespace std;
//Списочная структура
struct List2 {
int inf; //информационное поле
List2 *next; //ссылочное поле для связи элементов в списке
List2 *nextL; //ссылочное поле для связи двух линейных списков
};
//Объявление функций
void create_List2(List2**,int,int); //начальное формирование списка
void add_to_List2(List2**,int);
void print_List2(List2*);
void print_List2_to_file(List2*);
void navigate_element(int,List2*);
int _tmain(int argc, _TCHAR* argv[]){
setlocale(LC_ALL, "Russian");//использование кириллицы в консоли
//********************************************
cout<<"Курсовая работа по информатике."<<endl;
cout<<"Выполнил студент группы АП-84"<<endl;
cout<<"Брумм Евгений"<<endl;
//********************************************
List2 *S=0; //ссылочная переменная для доступа к списочной структуре
int *a=new int[100]; //вводимая последовательность целых чисел
int n=0,k=0;
int i=0,p=0,x;
bool done = false;
cout<<"Введите последовательность {a} целых чисел:"<<endl;
while (p!=2)
{
do
{
cin>>x;
if (x!=0) {
*(a+i)=x;
i++;
}
}while (x!=0);
p++;
if (p==1) n=i;
}
k=i-n;
//cout<<"Последовательность чисел {a}:"<<endl;
//for (i=0; i<n+k; i++)
// cout<<*(a+i)<<' ';
if ((n==0) && (k==0)) cout<<"Списочная структура пуста."<<endl;
else{
//Формирование списочной структуры
if (n>k){
for (i=0; i<n-k; i++)
create_List2(&S,a[i],0);
int j=0;
for (i=n-k; i<n; i++){
create_List2(&S,a[i],a[n+j]);
j++;
}
}
else{ //Формирование списочной структуры при N<=K
for (i=0; i<n; i++)
create_List2(&S,a[i],a[n+i]);
if (n<k){
for (i=2*n; i<n+k; i++)
add_to_List2(&S,a[i]);
}
}
//Вывод списков на экран
cout<<"\nСписочная структура:"<<endl;
print_List2(S);
//Вывод списочной структуры в файл
print_List2_to_file(S);
}
//навигация по списочной структуре
char y,c;
bool end; //определяет возможность навигации
List2 *tmp,*t;
tmp=S;
n=2; //до навигации находимся во 2-м списке
y='y';
t=0;
while (y=='y'){
end=true;
cout<<"\nТекущий элемент:"<<endl;
cout<<tmp->inf;
cout<<"\nНажмите клавишу управления:"<<endl;
c=getchar();
while(c!='0'){
switch (c){
case '4':
{ //нажата клавиша влево
if (n==1) cout<<"Находимся в списке 1. Нажмите вправо(6)."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"влево\n";
cout<<" < "<<t->inf<<endl;
tmp=t;
}
}
else cout<<"Достигнут конец списка 2. Слева пусто."<<endl;
}
break;
}
case '2':
{ //нажата клавиша вниз
if (n==1) {
cout<<"Находимся в списке 1. Внизу пусто."<<endl;
}
else{
if (tmp->nextL!=0){
t=tmp->nextL;
if (t!=0){
cout<<"вниз\n";
cout<<t->inf<<endl;
tmp=t;
n=1;//переход к списку 1
cout<<"Перешли в список 1. Нажмите вправо(6) или 0."<<endl;
}
}
else cout<<"Внизу пусто."<<endl;
}
break;
}
case '6':
{ //нажата клавиша вправо
if (n==2) cout<<"Находимся в списке 2. Нажмите влево(4), вниз(2) или 0."<<endl;
else{
if (tmp->next!=0){
t=tmp->next;
if (t!=0){
cout<<"вправо\n"<<endl;
cout<<" > "<<t->inf<<endl;
tmp=t;
}
}
else{
cout<<"Достигнут конец списка 1. Справа пусто."<<endl;
end=false;
}
}
break;
}
}
if (end==false) c='0';
else c=getchar();
}
y=getchar();
cout<<"\nПовторить навигацию? (y/n)"<<endl;
y=getchar();
if (y=='y') {
tmp=S;
n=2;
}
else break;
}
delete[] a;//освобождение памяти, занятой массивом a
system("pause");
return 0;
}
//начальное формирование списка
void create_List2(List2 **tmpS, int d1, int d2) {
List2 *tmp1, *tmp2;
tmp1 = new List2;
tmp2 = new List2;
tmp1->inf = d1;
tmp2->inf = d2;
tmp1->next=0;
tmp1->nextL=0;
if (*tmpS==0) { //если добавляем 1-й элемент в каждый из списков
tmp2->next=0;
tmp2->nextL=tmp1;
}
else{
tmp2->next=*tmpS;
tmp2->nextL=tmp1;
((tmp2->next)->nextL)->next=tmp1;
}
*tmpS=tmp2;
}
//формирование списка 2 при N<K
void add_to_List2(List2 **tmpS, int d) {
List2 *tmp = new List2;
tmp->inf = d;
tmp->next=*tmpS;
tmp->nextL=0;
*tmpS=tmp;
}
//вывод списочной структуры на экран
void print_List2(List2 *tmpS) {
List2 *tmp;
tmp=tmpS;
cout<<"Список 2"<<endl;
while (tmp) {
cout <<tmp->inf<< " ";
tmp = tmp->next;
}
cout << endl;
tmp=tmpS;
cout<<"Список 1"<<endl;
while (tmp) {
if (tmp->nextL!=0)
cout << (tmp->nextL)->inf << " ";
tmp = tmp->next;
}
cout << endl;
}
//вывод списочной структуры в файл
void print_List2_to_file(List2 *tmpS){
List2 *tmp;
tmp=tmpS;
ofstream txtFile; //создание объекта для записи в файл
txtFile.open("fileout.txt",ios::out); // открытие файла в режиме записи данных,
//при этом информация в существующем файле уничтожается (режим по умолчанию для потоков ofstream)
txtFile<<"Списочная структура:"; //запись строки в файл fileout.txt
txtFile << "\nСписок 2\n"; //запись значения переменной ch в файл fileout.txt
while (tmp) {
txtFile << tmp->inf;
txtFile << " ";
tmp = tmp->next;
}
tmp=tmpS;
txtFile << "\nСписок 1\n";
while (tmp) {
if (tmp->nextL!=0){
txtFile << (tmp->nextL)->inf;
txtFile << " ";
}
tmp = tmp->next;
}
txtFile.close(); // закрытие файла fileout.txt
}
- Лидерство, влияние, власть. Виды власти. Баланс власти.
- Управление конфликтами в организации ООО "Производственная компания"
- Психологические условия оптимизации взаимоотношений в коллективах работников
- Роль мотивации в поведении организации (Типы трудовой мотивации)
- Употребление герундия в различных функциях (Развитие и формирование современного герундия)
- Теория государства и права в системе социальных и юридических наук
- Менеджмент человеческих ресурсов (МАОУ «СОШ № 7» г. Соликамск)
- Распределенная технология обработки информации (Механизм удаленного вызова процедур )
- Анализ алгоритмов сортировок методом слияния
- Применение процессного подхода для оптимизации бизнес - процессов
- Анализ деятельности спортивной организации на примере АО "Футбольный клуб "Зенит"
- Корпоративная культура в организации (НА ПРИМЕРЕ ОРГАНИЗАЦИИ НАО "ЛУКОЙЛ-АЗЕРБАЙДЖАН")