public ref class CNumbers
{
private:
int size;
CNumber ^ Sample;
public:
CNumber ^ Head;
CNumbers()
{
size = 0;
Head = nullptr;
}
property int Count
{
int get() { return size; }
}
int Add(CNumber ^ NewItem)
{
CNumber ^ Sample = gcnew CNumber;
Sample = NewItem;
Sample->Next = Head;
Head = Sample;
return size++;
}
};
int main()
{
CNumbers ^ nbrs = gcnew CNumbers;
Console::WriteLine(L"Number of Items: {0}", nbrs->Count);
CNumber ^ one = gcnew CNumber;
one->Item = 2937.45;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 329.459;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 98.23456;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 32465.645;
nbrs->Add(one);
return 0;
}
Practical
Learning: Adding Items to a Collection |
|
- Change the FlowerInventory.h header file as follows:
#pragma once
#include "Flower.h"
public ref class CFlowerInventory : CFlower
{
public:
CFlower ^ Inventory;
CFlowerInventory(void);
CFlower ^ Head;
int Add(CFlower ^ obj);
};
|
- Access the FlowerInventory.cpp source file and change it as follows:
#include "FlowerInventory.h"
CFlowerInventory::CFlowerInventory(void)
{
Head = nullptr;
Inventory = gcnew CFlower;
}
int CFlowerInventory::Add(CFlower ^ NewFlower)
{
CFlower ^ Sample = gcnew CFlower;
Sample = NewFlower;
Sample->Next = Head;
Head = Sample;
return items++;
}
|
- Save all
Once a list exists, the user can explore it. One of the operations performed on items is to locate and retrieve one. To do this, you can
create a method that takes as argument an index. The method would examine the argument with regards to the number of items in the list to make sure the argument's value is in the range of
the current items of the list. If the number is too low or too high, the method can return
nullptr. If the number is in the range, the method can return the item at that position. Here is an example:
using namespace System;
public ref class CNumber
{
public:
double Item;
CNumber ^ Next;
};
public ref class CNumbers
{
private:
int size;
CNumber ^ Sample;
public:
CNumber ^ Head;
CNumbers()
{
size = 0;
Head = nullptr;
}
property int Count
{
int get() { return size; }
}
int Add(CNumber ^ NewItem)
{
CNumber ^ Sample = gcnew CNumber;
Sample = NewItem;
Sample->Next = Head;
Head = Sample;
return size++;
}
CNumber ^ Retrieve(int Position)
{
CNumber ^ Current = Head;
for (int i = Count - 1; i > Position && Current != nullptr; i--)
Current = Current->Next;
return Current;
}
};
int main()
{
CNumbers ^ nbrs = gcnew CNumbers;
Console::WriteLine(L"Number of Items: {0}\n", nbrs->Count);
CNumber ^ one = gcnew CNumber;
one->Item = 2937.45;
nbrs->Add(one);one = gcnew CNumber;
one->Item = 329.459;
nbrs->Add(one);one = gcnew CNumber;
one->Item = 98.23456;
nbrs->Add(one);one = gcnew CNumber;
one->Item = 32465.645;
nbrs->Add(one);
Console::WriteLine(L"\nNumber of Items: {0}\n", nbrs->Count);
for(int i = 0; i < nbrs->Count; i++)
Console::WriteLine("Number: {0}", nbrs->Retrieve(i)->Item);
Console::WriteLine();
return 0;
}
This would produce:
Number of Items: 0
Number of Items: 4
Number: 2937.45
Number: 329.459
Number: 98.23456
Number: 32465.645
Press any key to continue . . .
Practical
Learning: Retrieving the Items of a Collection |
|
- Access the FlowerInventory.h header file and add the following method:
#pragma once
#include "Flower.h"
public ref class CFlowerInventory : CFlower
{
public:
CFlower ^ Inventory;
CFlowerInventory(void);
CFlower ^ Head;
int Add(CFlower ^ obj);
CFlower ^ Get(int index);
};
|
- Access the FlowerInventory.cpp source file and add the following method:
#include "FlowerInventory.h"
CFlowerInventory::CFlowerInventory(void)
{
Head = nullptr;
Inventory = gcnew CFlower;
}
int CFlowerInventory::Add(CFlower ^ NewFlower)
{
CFlower ^ Sample = gcnew CFlower;
Sample = NewFlower;
Sample->Next = Head;
Head = Sample;
return items++;
}
CFlower ^ CFlowerInventory::Get(int index)
{
CFlower ^ Current = Head;
for(int i = Count - 1;
i > index && Current != nullptr;
i--)
Current = Current->Next;
return Current;
}
|
- Access the Exercise.cpp source file and change it as follows:
#include "OrderProcessing.h"
#include "FlowerInventory.h"
using namespace System;
int main()
{
CFlowerInventory ^ flowers = gcnew CFlowerInventory;
CFlower ^ nice;
nice = gcnew CFlower;
nice->Type = Lilies;
nice->Color = White;
nice->Arrangement = Bouquet;
nice->UnitPrice = 39.95;
flowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Daisies;
nice->Color = Various;
nice->Arrangement = Bouquet;
nice->UnitPrice = 40.50;
flowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Carnations;
nice->Color = Lavender;
nice->Arrangement = Any;
nice->UnitPrice = 34.85;
flowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Roses;
nice->Color = Pink;
nice->Arrangement = Bouquet;
nice->UnitPrice = 29.95;
flowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Daisies;
nice->Color = Yellow;
nice->Arrangement = Vase;
nice->UnitPrice = 29.95;
flowers->Add(nice);
|
|
Console::WriteLine(L"//=//=//=//=//=//=//=//=//=//=//=//=//=//=//");
Console::WriteLine(L"Total: {0} flower items in current inventory",
flowers->Count);
Console::WriteLine(L"--------------------------------------------");
Console::WriteLine(L"Inventory Summary");
for(int i = 0; i < flowers->Count; i++)
{
Console::WriteLine(L"------------------------");
Console::WriteLine(L"Flower Information");
Console::Write(L"Type: ");
switch(flowers->Get(i)->Type)
{
case 1:
Console::WriteLine(L"Roses");
break;
case 2:
Console::WriteLine(L"Lilies");
break;
case 3:
Console::WriteLine(L"Daisies");
break;
case 4:
Console::WriteLine(L"Carnations");
break;
case 5:
Console::WriteLine(L"Live Plant");
break;
default:
Console::WriteLine(L"Mixed");
}
Console::Write(L"Color: ");
switch(flowers->Get(i)->Color)
{
case 1:
Console::WriteLine(L"Red");
break;
case 2:
Console::WriteLine(L"White");
break;
case 3:
Console::WriteLine(L"Yellow");
break;
case 4:
Console::WriteLine(L"Pink");
break;
case 5:
Console::WriteLine(L"Orange");
break;
case 6:
Console::WriteLine(L"Blue");
break;
case 7:
Console::WriteLine(L"Lavender");
break;
default:
Console::WriteLine(L"Various");
}
Console::Write(L"Arrangement: ");
switch(flowers->Get(i)->Arrangement)
{
case 1:
Console::WriteLine(L"Bouquet");
break;
case 2:
Console::WriteLine(L"Vase");
break;
case 3:
Console::WriteLine(L"Basket");
break;
default:
Console::WriteLine(L"Any");
}
Console::WriteLine(L"Unit Price: {0:F}",
flowers->Get(i)->UnitPrice);
}
Console::WriteLine(L"//=//=//=//=//=//=//=//=//=//=//=//=//=//=//");
Console::WriteLine();
return 0;
}
|
- Execute the application to view the result:
//=//=//=//=//=//=//=//=//=//=//=//=//=//=//
Total: 5 flower items in current inventory
--------------------------------------------
Inventory Summary
------------------------
Flower Information
Type: Lilies
Color: White
Arrangement: Bouquet
Unit Price: 39.95
------------------------
Flower Information
Type: Daisies
Color: Various
Arrangement: Bouquet
Unit Price: 40.50
------------------------
Flower Information
Type: Carnations
Color: Lavender
Arrangement: Any
Unit Price: 34.85
------------------------
Flower Information
Type: Roses
Color: Pink
Arrangement: Bouquet
Unit Price: 29.95
------------------------
Flower Information
Type: Daisies
Color: Yellow
Arrangement: Vase
Unit Price: 29.95
//=//=//=//=//=//=//=//=//=//=//=//=//=//=//
Press any key to continue . . .
|
- Close the DOS window
Deleting an item consists of removing it from the list. There are two main
approaches you can use. You can simply ask the class to delete an item. In this case, it is usually the item at the end that gets deleted. If you do this, make sure you perform other routines operations such as decrementing the count of items in the
list. Here is an example:
using namespace System;
public ref class CNumber
{
public:
double Item;
CNumber ^ Next;
};
public ref class CNumbers
{
private:
int size;
CNumber ^ Sample;
public:
CNumber ^ Head;
CNumbers()
{
size = 0;
Head = nullptr;
}
property int Count
{
int get() { return size; }
}
int Add(CNumber ^ NewItem)
{
CNumber ^ Sample = gcnew CNumber;
Sample = NewItem;
Sample->Next = Head;
Head = Sample;
return size++;
}
CNumber ^ Retrieve(int Position)
{
CNumber ^ Current = Head;
for (int i = Count - 1; i > Position && Current != nullptr; i--)
Current = Current->Next;
return Current;
}
bool DeleteFirst()
{
if (Head == nullptr)
{
Console::WriteLine(L"The list is empty");
return false;
}
CNumber ^ Current;
Current = Head->Next;
size--;
return true;
}
};
int main()
{
CNumbers ^ nbrs = gcnew CNumbers;
CNumber ^ one = gcnew CNumber;
one->Item = 2937.45;
nbrs->Add(one);one = gcnew CNumber;
one->Item = 329.459;
nbrs->Add(one);one = gcnew CNumber;
one->Item = 98.23456;
nbrs->Add(one);one = gcnew CNumber;
one->Item = 32465.645;
nbrs->Add(one);
for(int i = 0; i < nbrs->Count; i++)
Console::WriteLine("Number: {0}", nbrs->Retrieve(i)->Item);
Console::WriteLine(L"\nNumber of Items: {0}\n", nbrs->Count);
nbrs->DeleteFirst();
for(int i = 0; i < nbrs->Count; i++)
Console::WriteLine("Number: {0}", nbrs->Retrieve(i)->Item);
Console::WriteLine(L"\nNumber of Items: {0}\n", nbrs->Count);
return 0;
}
This would produce:
Number: 2937.45
Number: 329.459
Number: 98.23456
Number: 32465.645
Number of Items: 4
Number: 329.459
Number: 98.23456
Number: 32465.645
Number of Items: 3
Press any key to continue . . .
Another technique used to delete an item consists of specifying the position of the item to be deleted. To do this, you can pass an argument as the desired position. The method would check the range of values of the current
list. If the specified position is beyond the appropriate range, the method can return false, 0, or
nullptr, depending on how you create it.
Practical
Learning: Retrieving the Items of a Collection |
|
- Access the FlowerInventory.h header file and add the following method:
#pragma once
#include "Flower.h"
public ref class CFlowerInventory : CFlower
{
public:
CFlower ^ Inventory;
CFlowerInventory(void);
CFlower ^ Head;
int Add(CFlower ^ obj);
CFlower ^ Get(int index);
bool Delete();
};
|
- Access the FlowerInventory.cpp source file and change it as follows:
#include "FlowerInventory.h"
CFlowerInventory::CFlowerInventory(void)
{
Head = nullptr;
Inventory = gcnew CFlower;
}
int CFlowerInventory::Add(CFlower ^ NewFlower)
{
CFlower ^ Sample = gcnew CFlower;
Sample = NewFlower;
Sample->Next = Head;
Head = Sample;
return items++;
}
CFlower ^ CFlowerInventory::Get(int index)
{
CFlower ^ Current = Head;
for(int i = Count - 1;
i > index && Current != nullptr;
i--)
Current = Current->Next;
return Current;
}
bool CFlowerInventory::Delete()
{
if (Head == nullptr)
{
Console::WriteLine(L"The inventory is empty");
return false;
}
CFlower ^ Current;
Current = Head->Next;
Head->Next = Current->Next;
items--;
return true;
}
|
- Access the Exercise.cpp file and change it as follows:
#include "OrderProcessing.h"
#include "FlowerInventory.h"
using namespace System;
CFlowerInventory ^ CreateFlowers()
{
CFlowerInventory ^ NewFlowers = gcnew CFlowerInventory();
CFlower ^ nice;
nice = gcnew CFlower;
nice->Type = Lilies;
nice->Color = White;
nice->Arrangement = Bouquet;
nice->UnitPrice = 39.95;
NewFlowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Daisies;
nice->Color = Various;
nice->Arrangement = Bouquet;
nice->UnitPrice = 40.50;
NewFlowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Carnations;
nice->Color = Lavender;
nice->Arrangement = Any;
nice->UnitPrice = 34.85;
NewFlowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Roses;
nice->Color = Pink;
nice->Arrangement = Bouquet;
nice->UnitPrice = 29.95;
NewFlowers->Add(nice);
nice = gcnew CFlower;
nice->Type = Daisies;
nice->Color = Yellow;
nice->Arrangement = Vase;
nice->UnitPrice = 29.95;
NewFlowers->Add(nice);
return NewFlowers;
}
void ShowInventory(CFlowerInventory ^ FlowersList)
{
Console::WriteLine(L"//=//=//=//=//=//=//=//=//=//=//=//=//=//=//");
Console::WriteLine(L"Total: {0} flower items in current inventory",
FlowersList->Count);
Console::WriteLine(L"--------------------------------------------");
Console::WriteLine(L"Inventory Summary");
for(int i = 0; i < FlowersList->Count; i++)
{
Console::WriteLine(L"------------------------");
Console::WriteLine(L"Flower Information");
Console::Write(L"Type: ");
switch(FlowersList->Get(i)->Type)
{
case 1:
Console::WriteLine(L"Roses");
break;
case 2:
Console::WriteLine(L"Lilies");
break;
case 3:
Console::WriteLine(L"Daisies");
break;
case 4:
Console::WriteLine(L"Carnations");
break;
case 5:
Console::WriteLine(L"Live Plant");
break;
default:
Console::WriteLine(L"Mixed");
}
Console::Write(L"Color: ");
switch(FlowersList->Get(i)->Color)
{
case 1:
Console::WriteLine(L"Red");
break;
case 2:
Console::WriteLine(L"White");
break;
case 3:
Console::WriteLine(L"Yellow");
break;
case 4:
Console::WriteLine(L"Pink");
break;
case 5:
Console::WriteLine(L"Orange");
break;
case 6:
Console::WriteLine(L"Blue");
break;
case 7:
Console::WriteLine(L"Lavender");
break;
default:
Console::WriteLine(L"Various");
}
Console::Write(L"Arrangement: ");
switch(FlowersList->Get(i)->Arrangement)
{
case 1:
Console::WriteLine(L"Bouquet");
break;
case 2:
Console::WriteLine(L"Vase");
break;
case 3:
Console::WriteLine(L"Basket");
break;
default:
Console::WriteLine(L"Any");
}
Console::WriteLine(L"Unit Price: {0:F}",
FlowersList->Get(i)->UnitPrice);
}
Console::WriteLine(L"//=//=//=//=//=//=//=//=//=//=//=//=//=//=//");
}
int main()
{
CFlowerInventory ^ flowers = CreateFlowers();
ShowInventory(flowers);
flowers->Delete();
flowers->Delete();
Console::Write(L"Press Enter to see the new inventory...");
Console::ReadLine();
ShowInventory(flowers);
Console::WriteLine();
return 0;
}
|
- Execute the application to view the result:
//=//=//=//=//=//=//=//=//=//=//=//=//=//=//
Total: 5 flower items in current inventory
--------------------------------------------
Inventory Summary
------------------------
Flower Information
Type: Lilies
Color: White
Arrangement: Bouquet
Unit Price: 39.95
------------------------
Flower Information
Type: Daisies
Color: Various
Arrangement: Bouquet
Unit Price: 40.50
------------------------
Flower Information
Type: Carnations
Color: Lavender
Arrangement: Any
Unit Price: 34.85
------------------------
Flower Information
Type: Roses
Color: Pink
Arrangement: Bouquet
Unit Price: 29.95
------------------------
Flower Information
Type: Daisies
Color: Yellow
Arrangement: Vase
Unit Price: 29.95
//=//=//=//=//=//=//=//=//=//=//=//=//=//=//
Press Enter to see the new inventory...
//=//=//=//=//=//=//=//=//=//=//=//=//=//=//
Total: 3 flower items in current inventory
--------------------------------------------
Inventory Summary
------------------------
Flower Information
Type: Lilies
Color: White
Arrangement: Bouquet
Unit Price: 39.95
------------------------
Flower Information
Type: Daisies
Color: Various
Arrangement: Bouquet
Unit Price: 40.50
------------------------
Flower Information
Type: Daisies
Color: Yellow
Arrangement: Vase
Unit Price: 29.95
//=//=//=//=//=//=//=//=//=//=//=//=//=//=//
Press any key to continue . . .
|
- Close the DOS window
One of the operations hardly performed on a list is to find an item. This is because if you ask a list to locate a particular item, you must provide as much information as possible. Probably the most expedient way you can do this is to completely define an item and pass it to the
list. Only if the item is found in the list would it be recognized.
Here is an example:
using namespace System;
public ref class CNumber
{
public:
double Item;
CNumber ^ Next;
};
public ref class CNumbers
{
private:
int size;
CNumber ^ Sample;
public:
CNumber ^ Head;
CNumbers()
{
size = 0;
Head = nullptr;
}
property int Count
{
int get() { return size; }
}
int Add(CNumber ^ NewItem)
{
CNumber ^ Sample = gcnew CNumber;
Sample = NewItem;
Sample->Next = Head;
Head = Sample;
return size++;
}
CNumber ^ Retrieve(int Position)
{
CNumber ^ Current = Head;
for (int i = Count - 1; i > Position && Current != nullptr; i--)
Current = Current->Next;
return Current;
}
bool DeleteFirst()
{
if (Head == nullptr)
{
Console::WriteLine(L"The list is empty");
return false;
}
CNumber ^ Current;
Current = Head->Next;
size--;
return true;
}
bool Find(CNumber ^ toFind)
{
CNumber ^ Current = gcnew CNumber;
if (toFind == nullptr)
return false;
for (Current = Head; Current != nullptr; Current = Current->Next)
{
if( Current->Item == toFind->Item )
return true;
}
return false;
}
};
int main()
{
CNumbers ^ nbrs = gcnew CNumbers;
CNumber ^ one = gcnew CNumber;
one->Item = 2937.45;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 329.459;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 98.23456;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 26486.56;
nbrs->Add(one);
one = gcnew CNumber;
one->Item = 32465.645;
nbrs->Add(one);
for(int i = 0; i < nbrs->Count; i++)
Console::WriteLine("Number: {0}", nbrs->Retrieve(i)->Item);
Console::WriteLine(L"\nNumber of Items: {0}\n", nbrs->Count);
CNumber ^ nbrToFind = gcnew CNumber;
nbrToFind->Item = 26486.56;
bool Found = nbrs->Find(nbrToFind);
if( Found == true )
Console::WriteLine(L"The number {0} was found in the list",
nbrToFind->Item);
else
Console::WriteLine(L"The number {0} was NOT found in the list",
nbrToFind->Item);
nbrToFind = gcnew CNumber;
nbrToFind->Item = 50883.82;
Found = nbrs->Find(nbrToFind);
if( Found == true )
Console::WriteLine(L"The number {0} was found in the list\n",
nbrToFind->Item);
else
Console::WriteLine(L"The number {0} was NOT found in the list\n",
nbrToFind->Item);
return 0;
}
This would produce:
Number: 2937.45
Number: 329.459
Number: 98.23456
Number: 26486.56
Number: 32465.645
Number of Items: 5
The number 26486.56 was found in the list
The number 50883.82 was NOT found in the list
Press any key to continue . . .