Указатели и динамические структуры данных (связные списки) в языках С/С++
Работа с указателями и организация динамических структур в виде связных списков. Принцип построения двунаправленного кольцевого списка, описание его простейшего элемента; информационное и адресные поля. Схема фрагмента алгоритма и листинг программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 03.06.2014 |
Размер файла | 74,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное агентство по образованию Российской Федерации
Государственное образовательное учреждение высшего профессионального образования «Южно-Уральский государственный университет»
Факультет «Приборостроительный»
Кафедра «Электронно-вычислительные машины»
Указатели и динамические структуры данных (связные списки) в языках С/С++
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОЙ РАБОТЕ
по дисциплине «программирование на языках высокого уровня»
ЮУрГУ-230100.2013.886.ПЗ КР
Челябинск 2013
ЗАДАНИЕ
связный двунаправленный список указатель
на курсовую работу студента Филиппова Ильи Александровича
Группа ПС-118
1. Дисциплина «программирование на языках высокого уровня»
2. Тема работы «Указатели и динамические структуры данных (связные списки) в языках С/С++»
3. Срок сдачи студентом законченной работы «___»___________2013 г.
4. Перечень вопросов, подлежащих разработке
Вид списка: двухсвязный кольцевой список
Элемент списка: строка символов произвольной длины
Операции над списком:
*вставка элемента в начало, в конец списка
*получение значения элемента по индексу
*удаление элемента по индексу
*очистка всех элементов списка
*подсчет количества элементов в списке
Специальная операция: поиск анаграмм в списке.
Ввод-вывод: Исходные данные - список строк вводится пользователем через текстовый интерфейс. Исходные данные могут быть некорректными. Реализовать понятный удобный текстовый интерфейс пользователя, позволяющий производить все указанные операции над элементами списка. Найденные анаграммы выводить на экран или в файл, указанный пользователем.
5. Календарный план
Наименование разделов курсовой работы |
Срок выполнения разделов работы |
Отметка о выполнении руководителя |
|
Демонстрация программы руководителю |
|||
Сдача пояснительной записки руководителю |
|||
Защита работы перед комиссией |
Двухсвязный список
Двунаправленный (двусвязный) кольцевой список - это структура данных, состоящая из последовательности элементов, каждый из которых содержит информационную часть и два указателя на соседние элементы (рисунок 1). При этом два соседних элемента должны содержать взаимные ссылки друг на друга.
В таком списке каждый элемент связан с предыдущим и следующим за ним элементами, при этом последний ссылается на первый и первый ссылается на последний. Каждый элемент двунаправленного списка имеет два поля с указателями: одно поле содержит ссылку на следующий элемент(для последнего на первый), другое поле - ссылку на предыдущий элемент(для первого - на последний) и третье поле - информационное. Наличие ссылок на следующее звено и на предыдущее позволяет двигаться по списку от каждого звена в любом направлении: от звена к концу списка или от звена к началу списка, поэтому такой список называют двунаправленным и кольцевым.
Описание простейшего элемента такого списка выглядит следующим образом:
struct имя_типа {
информационное поле;
адресное поле 1;
адресное поле 2;};
где информационное поле - это поле любого, ранее объявленного или стандартного, типа; адресное поле 1 - это указатель на объект того же типа, что и определяемая структура, в него записывается адрес следующего элемента списка ; адресное поле 2 - это указатель на объект того же типа, что и определяемая структура, в него записывается адрес предыдущего элемента списка.
Рисунок 1 - Двунаправленный список
Схема фрагмента алгоритма программы
Функция очистки всех элементов списка (void Spisok::Clear())
Листинг программы с комментариями
Файл head.h
#ifndef _CIRCL_H
#define _CIRCL_H
#include <iostream>
#include <fstream>
class Spisok{ //класс
private:
struct Elem{ //структура
char* data; //указатель на массив
Elem *next; //указатель на следующий элемент
Elem *prev; //указатель не предыдущий элемент
int index; //индекс элемента};
Elem *first; //указатель на первый элемент
Elem *Last; //указатель на последний элемент
void MoveIndexDown(int index); //процедура корректирования индекса, необходимая при удалении\добавлении в начало
void MoveIndexUp(int index); //процедура корректирования индекса, необходимая при удалении\добавлении в начало
public:
int count; //количество
Spisok(); //конструктор
~Spisok(); //деструктор
Elem *FindElem(int index); //функция поиска элемента по индексу
void Del(int index); //процедура удаления элемента по индексу
char* Get(int index); //функция, возвращающая указатель на массив элемента #index
void Add(char* data); //процедура добавления элемента в конец
void AddToHead(char* data); //процедура добавления элемента в начало
void Clear(); //процедура очистки списка
void Anagr(char* FName);//поиск анаграмм};
#endif _CIRCL_H
Файл func.cpp
#include "head.h"
void Spisok::MoveIndexDown(int index){
Elem *idx;//буфер
for(int i=index+1;i<=count;i++){//уменьшение индексов элементов после Iтого на 1
idx=FindElem(i);
idx->index=i-1;}}
void Spisok::MoveIndexUp(int id){//увеличение индексов элементов после Iтого на 1
Elem *idx=FindElem(id+1);
while(idx!=first){
idx->index=idx->index+1;
idx=idx->next;}}
Spisok::Spisok(){
first=NULL; //обнуление
Last=NULL;
count=0;}
Spisok::~Spisok(){
Clear();//очистка списка}
Spisok::Elem *Spisok::FindElem(int index){
if(first==NULL){return NULL;}
Elem *buf=first;
while(buf->next!=first){ //перебор всех элементов с первого до последнего, пока не совпадут индексы
if(buf->index==index){
return buf;
}else{
if(buf!=NULL){buf=buf->next;}}}
void Spisok::Del(int index){
Elem *buf;//буфер
buf=FindElem(index);//поиск элемента по индексу
MoveIndexDown(index);//смещение индексов
if(buf->prev!=NULL){buf->prev->next=buf->next;}else{first=buf->next;}//замена указателей предыдущего и следующего элементов
if(buf->next!=NULL){buf->next->prev=buf->prev;}
buf->index=-1;
if(buf==first){first=first->next;}//проверка на первый и последний элементы
if(buf==Last){Last=Last->prev;}
delete[] (buf->data);//освобождение мамяти под строку
delete(buf);//освобождение памяти под элемент
Spisok::count--; //уменьшение количества элементов}
char* Spisok::Get(int index){
return FindElem(index)->data;//поиск элемента и возвращение указателя на строку}
void Spisok::Add(char* data){
Elem *next = new Elem; //выделение памяти под новый элемент
next->data=data;
if(first==NULL){first=next;}//проверка существования первого, если нету новый будет первым
next->index=count+1;//присваивание индекса
next->prev=Last;//задание указателя на предыдущий
next->next=first;//задание указателя на следующий
if(Last!=NULL){Last->next=next;}//задание указателя предыдущего на новый
Last=next;//делаем новый последним созданным
Spisok::count++;//увеличение количества}
void Spisok::AddToHead(char* data){
if(first==NULL){Add(data);}else{//проверка на наличие первого
MoveIndexUp(1);//смещение индексов вверх
Elem *next = new Elem;//выделение памяти под новый элемент
next->data=data;
next->next=first;//создание связей
first->prev=next;
first->index=2;
first=next;
next->prev=Last;
Last->next=next;
next->index=1;
Spisok::count++;//увеличение количества}}
void Spisok::Clear(){
int b;//буфер
Elem *nex;//буфер
Elem *buf;//буфер
if(first!=NULL){//проверка на отсутствие элементов
b=count;// получаем количество элементов
buf=first;
for(int i=1;i<=b;i++){//перебор всех элементов
nex=buf;
if(buf->next!=NULL){buf=buf->next;}
if(nex!=NULL){
delete[](nex->data);//очищение памяти строки элемента
delete(nex);//очищение памяти элемента}}
first=NULL;//обнуление первого
Last=NULL;//обнуление последнего
count=0;//обнуление количества}}
void sort(char** arr, int count){//функция сортировки строки
char buf;//буфер для перестановки
bool c;//индикатор наличия перестановок
for(int i=0;i<count;i++){
do{//сортировка символов в каждой строке
c=0;
for(int j=0;j<strlen(arr[i]);j++){
if((arr[i][j]<arr[i][j+1])&&(arr[i][j+1]!='\0')){
buf=arr[i][j];
arr[i][j]=arr[i][j+1];
arr[i][j+1]=buf;
c=1;}}}while(c);}}
void Spisok::Anagr(char* FName){
if(first==NULL){return;}//проверка на пустой список
char** arr=new char*[count+1];//массив-буфер для сортировки
arr[count]='\0';
int j=0;
Elem* buf=first;
do{//заполняем массив
buf=FindElem(j+1);
arr[j]=new char[strlen(buf->data)+1];
for(int i=0;i<strlen(arr[j]);i++){
if(buf!=NULL){arr[j][i]=buf->data[i];}}
arr[j][strlen(arr[j])]='\0';
j++;}
while(j<=count);
sort(arr,count);//сортируем символы в каждой строке массива
std::ofstream out(FName);//запись в файл и вывод на экран
std::cout<<"Найденные анаграммы:"<<std::endl;
for(int a=0;a<count;a++){
for(int b=a+1;b<count;b++){
if((strcmp(arr[a],arr[b])==0)&&(strlen(arr[a])==strlen(arr[b]))){//ставниваем отсортированные строки для поиска анаграмм
std::cout<<Get(a+1)<<" -> "<<Get(b+1)<<std::endl;
out<<Get(a+1)<<" -> "<<Get(b+1)<<std::endl;}}}
out.close();//закрываем файл
for(int i=0;i<count;i++){//освобождение памяти
delete[] arr[i];}
delete arr;}
Файл main.cpp
#include "head.h"
void main (){
setlocale( LC_ALL,"Russian" );//установка языка
std::cout<<"Вариант 32"<<std::endl;//вывод информации о курсовой работе
std::cout<<"Вид списка: двухсвязный кольцевой список"<<std::endl;
std::cout<<"Элемент списка: строка символов произвольной длины"<<std::endl;
fflush(stdin);
system("PAUSE");
Spisok Obj;
char s='\n';
while(s!='0'){
system("CLS");//очистка экрана
std::cout<<"Операции над списком:"<<std::endl;//вывод команд
std::cout<<"1. Вставка элемента в конец списка"<<std::endl;
std::cout<<"2. Вставка элемента в начало списка"<<std::endl;
std::cout<<"3. Получение значения элемента по индексу"<<std::endl;
std::cout<<"4. Удаление элемента по индексу"<<std::endl;
std::cout<<"5. Очистка всех элементов списка"<<std::endl;
std::cout<<"6. Подсчет количества элементов в списке"<<std::endl;
std::cout<<std::endl;
std::cout<<"Специальная операция:"<<std::endl;
std::cout<<"7. Поиск анаграмм в списке"<<std::endl;
std::cout<<std::endl;
std::cout<<"0. Выход"<<std::endl;
std::cout<<std::endl;
std::cout<<"Выберите операцию:"<<std::endl;
std::cin>>s;//считывание команды
fflush(stdin);
switch(s){//обработка
case '0':exit(0);
case '1':{
system("CLS");
std::cout<<"1. Вставка элемента в конец списка"<<std::endl;
char* buf = new char[256];
std::cout<<"Введите строку:"<<std::endl;
gets(buf);
fflush(stdin);
buf[strlen(buf)+1]='\0';
Obj.Add(buf);
break;}
case '2':{
system("CLS");
std::cout<<"2. Вставка элемента в начало списка"<<std::endl;
char* buf = new char[256];
std::cout<<"Введите строку:"<<std::endl;
gets(buf);
fflush(stdin);
buf[strlen(buf)+1]='\0';
Obj.Add(buf);
break;
}
case '3':{
system("CLS");
std::cout<<"3. Получение значения элемента по индексу"<<std::endl;
std::cout<<"Введите индекс(список индексируется с 1):"<<std::endl;
int idx=0;
std::cin>>idx;
if((idx<1)||(idx>Obj.count)){std::cout<<"Неверный ввод"<<std::endl; fflush(stdin); std::cin.clear(); system("PAUSE"); break;}
char* buf = Obj.Get(idx);
std::cout<<buf;
std::cout<<std::endl;
system("PAUSE");
break; }
case '4':{
system("CLS");
std::cout<<"4. Удаление элемента по индексу"<<std::endl;
std::cout<<"Введите индекс(массив индексируется с 1):"<<std::endl;
int idx=0;
std::cin>>idx;
if((idx<1)||(idx>Obj.count)){std::cout<<"Неверный ввод"<<std::endl; fflush(stdin); std::cin.clear(); system("PAUSE"); break;}
Obj.Del(idx);
std::cout<<"Удалено"<<std::endl;
system("PAUSE");
break; }
case '5':{
system("CLS");
std::cout<<"5. Очистка всех элементов списка"<<std::endl;
Obj.Clear();
std::cout<<"Очищено"<<std::endl;
system("PAUSE");
break; }
case '6':{
system("CLS");
std::cout<<"6. Подсчет количества элементов в списке"<<std::endl;
std::cout<<"Количество элементов = "<<Obj.count<<std::endl;
system("PAUSE");
break; }
case '7':{
system("CLS");
std::cout<<"7. Поиск анаграмм в списке"<<std::endl;
std::cout<<"Введите имя файла(не больше 20 символов):"<<std::endl;
char* FName=new char[21];
gets(FName);
Obj.Anagr(FName);
system("PAUSE");
break; }}}}
Выводы
В результате выполнения проекта мы овладели приемами работы с указателями и организации на их базе динамических структур в виде связных списков на языкe C++. Были разработаны классы и функции для реализации связного списка.
Список литературы
1. Страуструп Б. Язык программирования С++ / пер. с англ - Издательство Бином, 2011 г. - 1136 с.
2. Шилдт, Г. Полный справочник по C++ / Герберт Шилдт; пер. с англ. Д. Клюшин. - Вильямс, 2008. - 800 с.
3. Связный список. - http://ru.wikipedia.org/wiki/%D1%E2%FF%E7%ED%FB%E9_%F1%EF%E8%F1%EE%EA
Размещено на Allbest.ru
...Подобные документы
Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.
курсовая работа [944,7 K], добавлен 14.03.2015Средства создания динамических структур данных. Формат описания ссылочного типа. Структура памяти во время выполнения программы. Линейные списки, стек, очередь. Организация списков в динамической памяти. Пример создания списка в обратном порядке.
лабораторная работа [788,2 K], добавлен 14.06.2009Линейные динамические структуры. Построение списочной структуры, состоящей из трехнаправленного и двух однонаправленных списков, связанных между собой. Дерево двоичного поиска для заданного множества целых чисел. Листинг программы на языках Си и Паскаль.
курсовая работа [451,1 K], добавлен 19.10.2013Проблемы с организацией данных. Определение и классификация динамических структур данных. Линейные односвязные, двухсвязные, кольцевые списки. Очередь, стеки. Описание основных типов данных и функции для работы с ними. Листинг программы, пример ее работы.
контрольная работа [290,6 K], добавлен 17.07.2012Написание программы, исходя из конкретных данных. Создание двунаправленного линейного списка. Main - главная программа, содержащая меню. Занесение данных в память списка. Результирующий файл. Значения всех числовых данных из диапазона целого типа данных.
курсовая работа [2,3 M], добавлен 22.12.2010Понятие и обработка списков. Имя домена списка. Примеры записи списков. Основные принципы работы со списками. Рекурсивная программа обработки списка. Определение номера элемента или элемента по номеру. Решение задач, использующих структуру графа.
презентация [65,0 K], добавлен 29.07.2012Разработка информационной системы с применением динамических структур данных. Назначение и область применения разрабатываемой программы по регистрации больных в поликлинике. Структурная схема фрагмента информационной системы, таблица имен и списков.
курсовая работа [325,6 K], добавлен 05.12.2013Разработка алгоритмов на динамических структурах данных. Описание структуры данных "стек". Процедуры добавления и удаления элемента, очистки памяти. Код распечатки содержимого всего стека. Инструкция пользователя, код программы, контрольный пример.
курсовая работа [22,9 K], добавлен 19.10.2010Исследование программного средства для управления базой данных с информацией о фильмах. Составление алгоритма удаления и добавления элемента в указанное место двунаправленного списка. Характеристика поиска, вывода на экран и сортировки элементов списка.
курсовая работа [94,5 K], добавлен 23.09.2011Представление (построение, создание) списка данных в виде линейного однонаправленного списка. Формирование массива данных. Вывод данных на экран. Алгоритм удаления, перемещения данных. Сортировка методом вставки. Алгоритм загрузки данных из файла.
курсовая работа [2,1 M], добавлен 16.05.2015Расположение элементов списка в памяти. Информация о полях структуры TMember. Логическая структура двусвязного кольцевого списка. Логические схемы наиболее важных операций со списками. Алгоритмы обработки основных структур. Руководство пользователя.
курсовая работа [2,3 M], добавлен 27.08.2012Разработка простейших классов на примере разработки моделей элементарных объектов и динамических информационных структур (одно и двунаправленных списков). Разработка простых классов. Вызывающая программа (main). Информационные динамические структуры.
творческая работа [17,5 K], добавлен 08.12.2007Переменные типа integer, real, их функции. Общее понятие о массиве, файлы для Pascal. Информационный и информанизационный набор списка. Реализация и тестирование программы. Выбор базы данных, внесение имени, меню. Блок-схема алгоритма, листинг программы.
курсовая работа [306,0 K], добавлен 04.02.2013Словесное описание алгоритма программы. Открытие файла процедурой Rewrite, его проверка на наличие ошибок при открытии. Особенности построения диаграммы. Листинг программы, ее тестирование и отладка. Выполнение процедуры CloseFile при закрытии файла.
контрольная работа [17,3 K], добавлен 11.06.2010Разработка программы обработки изображений, позволяющей прорисовывать типовые геометрические фигуры. Выбор аппаратных и технических средств для реализации программного продукта. Организация входных и выходных данных. Блок-схема и листинг программы.
курсовая работа [2,4 M], добавлен 18.06.2014Описание методов вычисления определителя матрицы. Математическое решение задачи с применением метода исключения Гаусса с выбором главного элемента. Схема алгоритма программы, описание переменных и структур данных, текст программы на языке Pascal.
курсовая работа [438,8 K], добавлен 16.02.2011Конструирование программ на высокоуровневых языках программирования на примере Pelec C. Модульная схема программы. Добавление новых записей, удаление и редактирование старых. Приемы реализации динамических списков связного хранения, методы их обработки.
курсовая работа [1,0 M], добавлен 19.05.2013Динамические структуры данных, их классификация и разновидности, назначение и функциональные особенности. Линейные односвязные списки, их внутренняя организация и значение. Порядок и принципы составления программы, главные требования, предъявляемые к ней.
курсовая работа [137,4 K], добавлен 11.05.2014Структура записей входного массива. Описание основных типов данных. Алгоритм программы: присвоение начальных значений переменных, чтение списка из файла, вывод данных на экран, выполнение обработки данных, сохранение списка в файл. Листинг программы.
курсовая работа [325,2 K], добавлен 28.12.2012Требование к структуре данных в базе, описание ее вида, содержание объектов. Используемые форматы данных. Алгоритмы и их особенности. Функциональное описание разработки. Описание пользовательского интерфейса. Контрольные примеры, временные характеристики.
курсовая работа [1,5 M], добавлен 06.04.2016