русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Программа: Управление динамическими структурами данных. Двунаправленные списки в языке Си

Задание

Использовать прикладное задание предыдущей работы (см. здесь). Выполнить представление данных в виде двунаправленного списка. Обеспечить следующую функциональность:

1. Добавление элементу в список.
2. Удаление элемента.
3. Поиск элемента.
4. Отображение информационных полей, а также сортировка списка по заданному атрибуту, группировка элементов списка (сортировка по нескольким признакам).

Примечания: выполнять мониторинг динамическим распределением памяти, реализовать диалоговый интерфейс, выделить процедуры обработки списка в модуль.

 

Выбор алгоритма решения задачи

В данной программе используются алгоритмы обработки однонаправленных кольцевых списков. Каждый элемент списка состоит из поля данных и указателя на следующий элемент списка. Все процедуры управления списком и главное меню помещены в модуль. При запуске программы выводится главное меню, выбрав пункт в котором можно предпринять соответствующее действие. Реализованная система только абсолютного позиционирования (существует указатель на первый элемент), осуществляется контроль за памятью.

 

Описание решения задачи

Единственная функция вызывается из текста основной программы - это функция MENU, выбрав пункт в которой можно сделать остальные все действия над списком. Функция "Добавления" позволяет создать новый элемент, функция "Удаления" позволяет удалить элемент по его номеру. Функция "Показания" показывает все элементы списка, поскольку список имеет форму кольца, то вывод элементов осуществляется по нажатию любой клавиши, когда выведены все элементы списка, выводится опять первый элемент. Функция "Сортировки по имени" сортирует элементы по имени. Функция "Поиск по имени" находит нужный элемент по имени. В главной программе существует основное меню программы.

 

Текст програми

1. Head.h

#ifndef TEXT_H
#define TEXT_H

#include <iostream.h>
#include <string.h>
#include <alloc.h>
#include <conio.h>
#include <stdlib.h>

 

struct FDat {               //структура данных
char Name[20];          //имя
char r[4];              // расширение
char d[10];             //       дата
int size;               // размер
char attr[4];           //  атрибут
FDat *Next;
FDat *Previous;
};

FDat *Add(FDat *);
FDat *Del(FDat *, int &);
void Show (FDat *, FDat *);
void Find (FDat *);
void SortByName (FDat *);
void SortBySize (FDat *);
void FreeRam (FDat *);

#endif

 

2 PROGRAM

#include "head.h"

FDat *Add(FDat *posl)
{
cout << "+++ \n" ;

if (posl == NULL){
posl  = new FDat;

                               cout << "Vvedite - Name, Racsherenie, Daty, Razmer and Attribut: \n";
cin >> posl->Name >> posl->r >> posl->d >> posl->size >> posl->attr;
posl->Next = NULL;
posl->Previous = NULL;
}
else {
posl->Next = new FDat;
posl->Next->Previous = posl;
posl = posl->Next;

                               cout << "Vvedite - Name, Racsherenie, Daty, Razmer and Attribut: \n";
cin >> posl->Name >> posl->r >> posl->d >> posl->size >> posl->attr;
posl->Next = NULL;
}

                return posl;
}

///////////////////////////////////////////////////////////////////////

 

FDat *Del(FDat *begin, int &identif)
{
FDat *prom, *begin_new, *next;
int x = 0, j =  0, k = 0, y = 0;
char name[20];

                cout << "Mi udalaem!!! \n";

                cout <<"Vvedite NAME : ";
cin >> name;
begin_new = prom = next = begin;
while ( begin != NULL) {
for (int i = 0; i<strlen(name); i++)
if (name[i] == begin->Name[i]) j++;
if (j == strlen(name)) {
if (prom == begin) {
begin_new = begin->Next;
prom = begin->Next;
delete begin;
x = 1;
y = 1;
begin = prom;
}
else {
while ( k == 0) {
if (next->Next == begin){
if (next->Next->Next == NULL) {
k = 1;
x = 1;
delete begin;
next->Next = NULL;
begin = NULL;
identif = 1;
begin_new = next;
}
else {
prom = begin->Next;
delete begin;
x = 1;
k = 1;
y = 1;
next->Next = begin = prom;
}
}
next = next->Next;
}
}
}
if (y == 1) begin = NULL;
if (begin != NULL)            begin = begin->Next;
j = 0;
}
if (x == 0)
cout << "NAME nety ... ";
getch();
return begin_new;

}

 

/////////////////////////////////////////////////////////////////////////

 

void Show (FDat *begin, FDat *posl)
{
int x;
cout << "Prosmotr spiska!!! \n";
cout <<"Vvivod snachala (press ... 0) ili s konca (press ... 1)???\n";
cin>>x;
cout <<"Name, Racsherenie, Data, Razmer and Attribut\n";
if (x == 0)
while ( begin != NULL) {
cout <<"\n"<< begin->Name <<"."<<begin->r <<" "<<begin->d <<"  "
<< begin->size <<" byte  "<<begin->attr <<" \n ";
begin = begin->Next;
}
else
while (posl != NULL) {
cout <<"\n"<< posl->Name <<"."<<posl->r <<" "<<posl->d <<"  "
<< posl->size <<" byte  "<<posl->attr <<" \n ";
posl = posl->Previous;
}
getch();
}

 

/////////////////////////////////////////////////////////////////////////

void Find (FDat *begin)
{
int x = 0, j =  0;
char name[20];
cout << "poisk!!! \n";
cout <<"Vvedite NAME : ";
cin >> name;
while ( begin != NULL) {
for (int i = 0; i<strlen(name); i++)
if (name[i] == begin->Name[i]) j++;

                                 if (j == strlen(name)) {
cout <<"\n"<< begin->Name <<"."<<begin->r <<" "<<begin->d <<"  "
<< begin->size <<" byte"<<begin->attr <<" \n ";
x = 1;
j = 0;
}

                               begin = begin->Next;
}
if (x == 0)
cout << "NAME nety ... ";
getch();

}

//////////////////////////////////////////////////////////////////

void SortByName (FDat *begin )
{
char Name2[20];          //имя
char r2[4];              // расширение
char d2[10];             //       дата
int size2;               // размер
char attr2[4];           //  атрибут
FDat *Next2;
FDat *Previous2;
FDat *Work;
int k = 1, _k = 1;

                Work = begin;

                while (k == 1){
begin = Work;
while ( begin->Next != NULL) {
if (begin->Name < begin->Next->Name) {
strcpy (Name2 , begin->Name);
strcpy (r2 , begin->r);
strcpy (d2 , begin->d);
size2 = begin->size;
strcpy (attr2 , begin->attr);

                                                               strcpy (begin->Name, begin->Next->Name);
strcpy (begin->r, begin->Next->r);
strcpy (begin->d, begin->Next->d );
begin->size = begin->Next->size;
strcpy (begin->attr, begin->Next->attr);

                                                               strcpy (begin->Next->Name, Name2);
strcpy (begin->Next->r, r2);
strcpy (begin->Next->d, d2);
begin->Next->size = size2;
strcpy (begin->Next->attr, attr2);

                                                               _k = 0;
}

                                               begin = begin->Next;
}
if (_k == 1)
k = 0;
_k = 1;
}

                cout <<"Sortirovka osyshestvlena!!!";
getch();

}

///////////////////////////////////////////////////////////////////

void SortBySize (FDat *begin )
{
char Name2[20];          //имя
char r2[4];              // расширение
char d2[10];             //       дата
int size2;               // размер
char attr2[4];           //  атрибут
FDat *Next2;
FDat *Previous2;
FDat *Work;
int k = 1, _k;

                Work = begin;

                while (k == 1){
begin = Work;
_k = 1;
while ( begin->Next != NULL) {
if (begin->size > begin->Next->size) {
strcpy (Name2 , begin->Name);
strcpy (r2 , begin->r);
strcpy (d2 , begin->d);
size2 = begin->size;
strcpy (attr2 , begin->attr);

                                                               strcpy (begin->Name, begin->Next->Name);
strcpy (begin->r, begin->Next->r);
strcpy (begin->d, begin->Next->d );
begin->size = begin->Next->size;
strcpy (begin->attr, begin->Next->attr);

                                                               strcpy (begin->Next->Name, Name2);
strcpy (begin->Next->r, r2);
strcpy (begin->Next->d, d2);
begin->Next->size = size2;
strcpy (begin->Next->attr, attr2);

                                                               _k = 0;
}

                                               begin = begin->Next;
}
if (_k == 1)
k = 0;
}
cout <<"Sortirovka osyshestvlena!!!";
getch();

}

///////////////////////////////////////////////////////////////////

 

void FreeRam (FDat *begin)
{
FDat *prom;
prom = begin;
while ( prom != NULL) {
begin = begin->Next;
delete prom;
prom = begin;
}
}

 

///////////////////////////////////////////////////////////////////

 

int main()
{
long int mem;
FDat *Begin = NULL, *Posl = NULL, *Dopol;
int ch, iden = 0;               //    {наж. клавиша}

                mem = farcoreleft(); //     {Размер своб. памяти}
cout <<"Memory - "<<mem<<"\n";
do {
cout<<" <1> - DOBAVIT ZAPIS \n"
<<" <2> - UDALIT ZAPIS \n"
<<" <3> - PROSMOTR SPISKA \n"
<<" <4> - POISK \n"
<<" <5> - Sort po Name \n"
<<" <6> - Sort po Size \n"
<<" <7> - EXIT \n";

                  cin>>ch;       //  {реализация меню}

                  switch (ch) {
case 1 :
if (Begin == NULL) {
Begin = Add(Posl);
Posl = Begin;
}
else Posl = Add(Posl);
break;
case 2 :
Dopol = Del(Begin, iden);
if (iden == 0) Begin = Dopol;
else Posl = Dopol;
break;
case 3 :
Show(Begin, Posl);
break;
case 4 :
Find(Begin);
break;
case 5 :
SortByName (Begin);
break;
case 6 :
SortBySize (Begin);
break;
}
} while (ch != 7);

                cout <<"\n Memory - " <<farcoreleft()<<"\n";

                FreeRam(Begin);           //   {очистка памяти}
getch();

                cout <<"\n Memory - " <<farcoreleft()<<"\n";
if (mem == farcoreleft()) cout <<"Pamat' ne poterana ... ";
else cout << "ERROR!!! Potera Memory!!!";

                cout<<" Press key..."<<endl;
getch();

                return 0;

}

 

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

Просмотров: 13277

Вернуться воглавление




Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.