Познакомиться со способами представления мультисписков на базе линейных однонаправленных списков при помощи шаблона класса, элементы которых расположены в динамической памяти. Запрограммировать алгоритмы обработки линейного списка: добавление элемента, удаление элемента, поиск элемента, удаление всего списка элементов и замена элемента.

Обеспечить выбор операций над линейным списком с помощью компонента PopUpMenu. Вывод данных из элементов списка обеспечить с помощью компонента ListBox и StringGrid.

Для выполнения работы используется пакет Borland C++ Builder 6 в сочетании со справочным комплексом MSDN (Microsoft Developers Network).

6.3 Теоретические сведения

Класс – это структура данных, которая кроме членов данных содержит функции работы с членами данных. В общем случае объявление класса имеет следующий вид:

class <Имя класса>

{

private:

<список деклараций полей и функций работы с полями>

public:

<список деклараций полей и функций работы с полями>

};

Шаблон класса в общем случае объявляется следующим образом:

template <class List>

class <Имя класса>

{

private:

<список деклараций полей и функций работы с полями>

public:

<список деклараций полей и функций работы с полями>

};

1 В ходе работы был реализован класс элемента линейного списка;

2 Был создан проект для работы с двухуровневым мультисписком на базе класса элемента линейного списка;

3 Было обеспечено использование процедур независимых от типа элемента.

Реализацию интерфейса обеспечили с помощью стандартных компонент Borland C++ Builder.

НЕ нашли? Не то? Что вы ищете?

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

Файл UnitMain.cpp

#include <vcl. h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

//

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

TListPredpr<TProduction> *Head;

//

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//

void __fastcall TForm1::ListBox1Click(TObject *Sender)

{

GroupBox1->Caption = "Данные об изделии";

Label4->Show();

Edit4->Show();

Label3->Caption = "Цена";

if (ListBox1->ItemIndex!= -1)

{

TProduction *Pr;

Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));

Edit1->Text = Pr->name;

Edit2->Text = Pr->code;

Edit3->Text = Pr->price;

Edit4->Text = Pr->view;

Pr->poduz->ListOutput(ListBox2, InfProducts);

}

}

//

void __fastcall TForm1::ListBox2Click(TObject *Sender)

{

GroupBox1->Caption = "Данные об узле";

Label4->Hide();

Edit4->Hide();

Label3->Caption = "Цех - изготовитель";

if (ListBox1->ItemIndex!= -1)

{

TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));

if (ListBox2->ItemIndex!= -1)

{

TListPredpr<TUzel> *UzHead = Pr->poduz;

TUzel *Uz;

Uz = new TUzel;

Uz = *(UzHead->FindInSortListR(UzHead->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpUzels));

Edit1->Text = Uz->name;

Edit2->Text = Uz->code;

Edit3->Text = Uz->zeh;

}

}

}

//

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Head = new TListPredpr<TProduction>;

}

//

void __fastcall TForm1::N1Click(TObject *Sender)

{

TProduction *Pr;

Pr = new TProduction;

int i;

for (i = 0; i < Edit1->Text. Length(); Pr->name[i] = Edit1->Text. c_str()[i], i++);

Pr->name[i] = '\0';

for (i = 0; i < Edit2->Text. Length(); Pr->code[i] = Edit2->Text. c_str()[i], i++);

Pr->code[i] = '\0';

for (i = 0; i < Edit3->Text. Length(); Pr->price[i] = Edit3->Text. c_str()[i], i++);

Pr->price[i] = '\0';

for (i = 0; i < Edit4->Text. Length(); Pr->view[i] = Edit4->Text. c_str()[i], i++);

Pr->view[i] = '\0';

Pr->poduz = new TListPredpr<TUzel>;

Pr->next = NULL;

Head->AddToSortList(Pr, InfProducts, CmpProducts);

Head->ListOutput(ListBox1, InfProducts);

}

//

void __fastcall TForm1::N2Click(TObject *Sender)

{

delete Head->DeleteFromSortList(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());

Head->ListOutput(ListBox1, InfProducts);

}

//

void __fastcall TForm1::N3Click(TObject *Sender)

{

TProduction *Pr;

Pr = new TProduction;

Pr = Head->DeleteFromSortList(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());

int i;

for (i = 0; i < Edit1->Text. Length(); Pr->name[i] = Edit1->Text. c_str()[i], i++);

Pr->name[i] = '\0';

for (i = 0; i < Edit2->Text. Length(); Pr->code[i] = Edit2->Text. c_str()[i], i++);

Pr->code[i] = '\0';

for (i = 0; i < Edit3->Text. Length(); Pr->price[i] = Edit3->Text. c_str()[i], i++);

Pr->price[i] = '\0';

for (i = 0; i < Edit4->Text. Length(); Pr->view[i] = Edit4->Text. c_str()[i], i++);

Pr->view[i] = '\0';

Pr->next = NULL;

Head->AddToSortList(Pr, InfProducts, CmpProducts);

Head->ListOutput(ListBox1, InfProducts);

}

//

void __fastcall TForm1::MenuItem1Click(TObject *Sender)

{

TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));

TListPredpr<TUzel> *UzHead = Pr->poduz;

TUzel *Uz;

Uz = new TUzel;

int i;

for (i = 0; i < Edit1->Text. Length(); Uz->name[i] = Edit1->Text. c_str()[i], i++);

Uz->name[i] = '\0';

for (i = 0; i < Edit2->Text. Length(); Uz->code[i] = Edit2->Text. c_str()[i], i++);

Uz->code[i] = '\0';

for (i = 0; i < Edit3->Text. Length(); Uz->zeh[i] = Edit3->Text. c_str()[i], i++);

Uz->zeh[i] = '\0';

Uz->next = NULL;

UzHead->AddToSortList(Uz, InfUzels, CmpUzels);

UzHead->ListOutput(ListBox2, InfUzels);

}

//

void __fastcall TForm1::MenuItem2Click(TObject *Sender)

{

TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));

TListPredpr<TUzel> *UzHead = Pr->poduz;

delete UzHead->DeleteFromSortList(ListBox2->Items->Strings[ListBox2->ItemIndex].c_str());

UzHead->ListOutput(ListBox2, InfUzels);

}

//

void __fastcall TForm1::MenuItem3Click(TObject *Sender)

{

TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));

TListPredpr<TUzel> *UzHead = Pr->poduz;

TUzel *Uz;

Uz = UzHead->DeleteFromSortList(ListBox2->Items->Strings[ListBox2->ItemIndex].c_str());

int i;

for (i = 0; i < Edit1->Text. Length(); Uz->name[i] = Edit1->Text. c_str()[i], i++);

Uz->name[i] = '\0';

for (i = 0; i < Edit2->Text. Length(); Uz->code[i] = Edit2->Text. c_str()[i], i++);

Uz->code[i] = '\0';

for (i = 0; i < Edit3->Text. Length(); Uz->zeh[i] = Edit3->Text. c_str()[i], i++);

Uz->zeh[i] = '\0';

Uz->next = NULL;

UzHead->AddToSortList(Uz, InfUzels, CmpUzels);

UzHead->ListOutput(ListBox2, InfUzels);

}

//

Файл UnitFunc. h

#ifndef Unit2H

#define Unit2H

#include <StdCtrls. hpp>

#include "_str. h"

//

typedef int TFCmpPtr(void*, char *key);

typedef char *TFInfPtr(void*);

//

template <class List>

class TListPredpr

{

private:

List *head;

public:

TListPredpr(){head = NULL;};

~TListPredpr();

List **GetHeadAddr(){return(&head);};

void AddToSortList(List *elem, TFInfPtr *Inform, TFCmpPtr *Compare);

List *DeleteFromSortList(char *key);

List **FindInSortListR(List **prev, char *key, TFCmpPtr *Compare);

void ListOutput(TListBox *LB, TFInfPtr *Inform);

};

//

typedef struct Uzel

{

char name[20];

char code[10];

char zeh[5];

Uzel *next;

} TUzel;

//

typedef struct Production

{

char name[20];

char code[10];

char price[5];

char view[10];

TListPredpr<TUzel> *poduz;

Production *next;

} TProduction;

int CmpProducts(void *elem, char *key)

{

return(strcmp(((TProduction *)elem)->name, key));

}

//

int CmpUzels(void *elem, char *key)

{

return(strcmp(((TUzel *)elem)->name, key));

}

//

char *InfProducts(void *elem)

{

return(((TProduction *)elem)->name);

}

//

char *InfUzels(void *elem)

{

return(((TUzel *)elem)->name);

}

//

template <class List>

TListPredpr<List>::~TListPredpr()

{

for (List *wp = head; wp!= NULL; head = wp)

{

wp = head->next;

delete head;

}

}

//

template <class List>

void TListPredpr<List>::AddToSortList(List *elem, TFInfPtr *Inform, TFCmpPtr *Compare)

{

List **pointer;

pointer = FindInSortListR(&head, Inform(elem), Compare);

elem->next = *pointer;

*pointer = elem;

}

//

template <class List>

List *TListPredpr<List>::DeleteFromSortList(char *key)

{

List **pointer = FindInSortListR(&head, key, CmpProducts);

List *pointer1 = *pointer;

*pointer = (*pointer)->next;

return(pointer1);

}

//

template <class List>

List **TListPredpr<List>::FindInSortListR(List **prev, char *key, TFCmpPtr *Compare)

{

if ((*prev!= NULL) && (Compare(*prev, key) < 0))

prev = FindInSortListR(&((*prev)->next), key, Compare);

return(prev);

}

//

template <class List>

void TListPredpr<List>::ListOutput(TListBox *LB, TFInfPtr *Inform)

{

LB->Items->Clear();

for (List *pointer = head; pointer!= NULL; pointer = pointer->next)

LB->Items->Add((AnsiString)Inform(pointer));

}

//

#endif

Заключение

В этой лабораторной работе мы познакомились с способами представления мультисписков на базе линейных однонаправленных списков при помощи шаблона класса, элементы которых расположены в динамической памяти. Запрограммировали алгоритмы обработки линейного списка: добавление элемента, удаление элемента, поиск элемента, удалене всего списка и замена элемента.