4.2 Интерфейс
class Node {
public:
Node();
~Node();
friend class List;
private:
int Price;
int Number;
char Name[50];
Node *pNext;
};
class List {
public:
~List();
List();
Node* GetHead() const;
void Insert();
void Insert(char*, Node*);
void Remove(char*);
void Remove_(char*);
void Print(Node*) const;
void SetTail(Node*);
int Search(char*) const;
private:
Node *pHead;
Node *pTail;
};
int menu();
int Correct();
4.3 Реализация методов
#include <iostream>
#include <cassert>
#include <cstdlib>
using namespace std;
Node::Node() {
cout<<"Enter name: ";cin>>Name;
cout<<"Enter price (use only digits): ";Price = Correct();
cout<<"Enter number (use only digits): ";Number = Correct();
cout<<"Node constructor called; new entry created\n";
}
List::List() {
pHead = NULL;
pTail = NULL;
cout<<"List constructor called; new list created\n";
}
List::~List() {
Node* pTemp;
while (pHead) {
pTemp = pHead;
pHead = pHead->pNext;
delete pTemp;
cout<<"Destroying the list...\n";
}
}
Node* List::GetHead() const {
return pHead;
}
void List::Insert() {
if (pHead == NULL) {
pHead = new Node;
assert(pHead != NULL);
pHead->pNext = NULL;
pTail = pHead;
}
else {
pTail->pNext = new Node;
assert(pTail->pNext != NULL);
pTail = pTail->pNext;
pTail->pNext = NULL;
}
}
void List::Insert(char *Query, Node *Pointer) {
int Match;
Node *pNewNode;
if (Pointer == NULL) {
cout<<"No match found\n";
return;
} else {
Match = strcmp(Query, Pointer->Name);
if (Match == 0) {
pNewNode = new Node;
assert(pNewNode != NULL);
pNewNode->pNext = Pointer->pNext;
Pointer->pNext = pNewNode;
}else
Insert(Query, Pointer->pNext);
}
}
void List::Print(Node *Pointer) const {
if (Pointer == NULL)
return;
cout<<"Name: "<<Pointer->Name<<"";
cout<<"Price: "<<Pointer->Price<<"";
cout<<"Number: "<<Pointer->Number<<"\n";
Print(Pointer->pNext);
}
void List::Remove(char *Query) {
if (pHead == NULL) {
cout<<"The list is already empty\n";
return;
}
Node *pPrev = pHead;
Node *pTemp = pHead->pNext;
if (strcmp(Query, pHead->Name) == 0) {
pTemp = pHead;
pHead = pHead->pNext;
delete pTemp;
cout<<"Entry removed successfully\n";
return;
}
while (pTemp != NULL) {
if (strcmp(Query,pTemp->Name)==0)
break;
pPrev = pTemp;
pTemp = pTemp->pNext;
}
if (pTemp == NULL) {
cout<<"No match found";
return;
}
else {
pPrev->pNext = pTemp->pNext;
if (pTemp == pTail) {
delete pTemp;
SetTail(pHead);
cout<<"New tail of list assigned\n";
return;
}
delete pTemp;
cout<<"Entry removed successfully\n";
}
}
void List::Remove_(char *Query) {
int choice;
cout<<"(1) Remove only one entry with specified name\n";
cout<<"(2) Remove all entries with specified name: "; cin>>choice;
if (choice != 2) {
Remove(Query);
return;
}
while (Search(Query) == 1) {
Remove(Query);
}
}
int List::Search(char *Query) const {
Node *Pointer = pHead;
while (Pointer != NULL) {
if (strcmp(Query,Pointer->Name)==0)
return 1;
Pointer = Pointer->pNext;
}
return 0;
}
void List::SetTail(Node *Pointer) {
if (Pointer->pNext == NULL) {
pTail = Pointer;
return;
}
if (Pointer == NULL) {
pTail = pHead;
return;
}
SetTail(Pointer->pNext);
}
int menu() {
int choice;
cout<<"\n(1) Add entry";
cout<<"\n(2) Add entry after specified";
cout<<"\n(3) Remove entry";
cout<<"\n(4) Print the list";
cout<<"\n(5) Quit\n";
cout<<" Select action: ";
choice = Correct();
return choice;
}
int Correct() {
int number = 0; char buffer[10];
cin>>buffer;
for (int i = 0; i != 9; i++) {
if (buffer[i]>='0' && buffer[i]<='9')
number = number*10 + buffer[i] - '0';
}
return number;
}
Заключение
В данном курсовом проекте был реализован абстрактный тип данных – односвязный список на основе указателей.
В процессе реализации были соблюдены принципы объектно-ориентированного программирования. Особое внимание было уделено инкапсуляции данных и разработке интерфейса, исключающего нелигитимное модифицирование данных, определенных в задании.
водить все действия, что и с обычными переменными. Для работы с динамическим распределением памяти очень удобно использовать связанные структуры данных, например односвязные списки. Простейшим примером списка является массив, в котором последовательно расположены все его элементы. Но у такого представления есть существенный недостаток – требуется заранее точно указать количество элементов ...
... подход к разработке эффективного алгоритма для решения любой задачи – изучить ее сущность. Довольно часто задачу можно сформулировать на языке теории множеств, относящейся к фундаментальным разделам математики. В этом случае алгоритм ее решения можно изложить в терминах основных операций над множествами. К таким задачам относятся и задачи информационного поиска, в которых решаются проблемы, ...
... данных будет нести больше смысла, если его отсортировать каким‑либо образом. Часто требуется сортировать данные несколькими различными способами. Во‑вторых, многие алгоритмы сортировки являются интересными примерами программирования. Они демонстрируют важные методы, такие как частичное упорядочение, рекурсия, слияние списков и хранение двоичных деревьев в массиве. Наконец, сортировка ...
... мощность (заменять процессоры), расширять емкость оперативной памяти, добавлять внешние устройства. Машины имеют большие наборы команд, развитое системное программное обеспечение, включающее трансляторы языков программирования Ассемблер, ФОРТРАН, ПЛ/1, КОБОЛ, АЛГОЛ, ПАСКАЛЬ, операционные системы с различными функциональными возможностями. Основная особенность управляющих вычислительных машин ...
0 комментариев