I have implemented deque through linked list. Below You can see my code:
#include <iostream>
using namespace std;
struct Node
{
int mData;
Node* pPrev, *pNext;
Node()
{
this->mData = mData;
pPrev = pNext = NULL;
}
Node(int value)
{
mData = value;
pPrev = pNext = NULL;
}
};
class Deque
{
private:
Node *pFront, *pRear;
int mSize;
public:
Deque()
{
pFront = pRear = NULL;
mSize = 0;
}
void pushFront(int data)
{
Node* newNode = new Node(data);
if (newNode == NULL)
{
cout << "Error";
}
else
{
if (pFront == NULL)
{
pRear = pFront = newNode;
}
else
{
newNode->pNext = pFront;
pFront->pPrev = newNode;
pFront = newNode;
}
mSize++;
}
}
void pushLast(int data)
{
Node* newNode = new Node(data);
if (newNode == NULL)
{
cout << "Error";
}
else
{
if (pRear == NULL)
{
pFront = pRear = newNode;
}
else
{
newNode->pPrev = pRear;
pRear->pNext = newNode;
pRear = newNode;
}
mSize++;
}
}
void deleteFront()
{
if (isEmpty())
{
cout << "Deque is empty";
}
else
{
Node* temp = pFront;
pFront = pFront->pNext;
if (pFront == NULL)
{
pRear = NULL;
}
else
{
pFront->pPrev = NULL;
}
free(temp);
mSize--;
}
}
void deleteLast()
{
if (isEmpty())
{
cout << "Deque is empty";
}
else
{
Node* temp = pRear;
pRear = pRear->pPrev;
if (pRear == NULL)
{
pFront = NULL;
}
else
{
pRear->pNext = NULL;
}
free(temp);
mSize--;
}
}
int getFront()
{
if (isEmpty())
{
cout << "Deque is empty";
}
else
{
return pFront->mData;
}
}
int getLast()
{
if (isEmpty())
{
cout << "Deque is empty";
}
else
{
return pRear->mData;
}
}
void swap()
{
if (isEmpty())
{
cout << "Deque is empty";
}
else
{
Node* temp = pFront;
while (temp->pNext != NULL) {
temp = temp->pNext;
}
Node* tmp2 = new Node();
tmp2->mData = temp->mData;
temp->mData = pFront->mData;
temp->pNext = NULL;
pFront->mData = tmp2->mData;
}
}
bool isEmpty()
{
return (mSize == 0);
}
int getSize()
{
return mSize;
}
void reverse()
{
auto curr = pFront; // current pointer
Node* prev = NULL; // previous pointer
while (curr) {
auto temp = curr->pNext;
curr->pNext = prev;
prev = curr;
pFront = prev;
curr = temp;
}
}
bool isBelong(int data)
{
Node* temp = pFront;
while (temp != NULL)
{
if (data == temp->mData)
{
return true;
}
temp = temp->pNext;
}
return false;
}
void clear()
{
pRear = NULL;
while (pFront != NULL)
{
Node* temp = pFront;
pFront = pFront->pNext;
delete temp;
}
pFront = NULL;
mSize = 0;
}
void show()
{
Node* node = pFront;
while (node != NULL)
{
cout << node->mData << " ";
node = node->pNext;
}
}
};
int main()
{
Deque deque; int num;
while (true)
{
int choice;
cout << "\n0.Exit.\n1.Insertion(head).\n2.Insertion(rear).\n3.Deletion(head).\n4.Deletion(rear).\n5.Get head.\n6.Get rear.\n7.Check emptyness.\n8.Check size.\n9.Clear deque.\n10.Swap front and rear.\n11.Check belonginess.\n12.Reverse deque.\n";
cin >> choice;
switch (choice)
{
case 0: return 0;
case 1:
cout << "Insertion to head - input value : "; cin >> num;
deque.pushFront(num);
deque.show();
system("pause");
system("cls");
break;
case 2:
cout << "Insertion to rear - input value : "; cin >> num;
deque.pushLast(num);
deque.show();
system("pause");
system("cls");
break;
case 3:
deque.deleteFront();
deque.show();
system("pause");
system("cls");
break;
case 4:
deque.deleteLast();
deque.show();
system("pause");
system("cls");
break;
case 5:
if (deque.isEmpty())
{
cout << "Deque is empty";
}
else
{
cout << "First element of deque : " << deque.getFront();
}
system("pause");
system("cls");
break;
case 6:
if (deque.isEmpty())
{
cout << "Deque is empty";
}
else
{
cout << "Last element of deque : " << deque.getLast();
}
system("pause");
system("cls");
break;
case 7:
if (deque.isEmpty())
{
cout << "Deque is empty";
}
else
{
cout << "Deque is not empty: "; deque.show();
}
system("pause");
system("cls");
break;
case 8:
cout << "Size of deque : " << deque.getSize();
system("pause");
system("cls");
break;
case 9:
deque.clear();
system("pause");
system("cls");
break;
case 10:
cout << "Deque before swap: "; deque.show(); cout << endl;
deque.swap();
cout << "Deque after swap: "; deque.show(); cout << endl;
system("pause");
system("cls");
break;
case 11:
cout << "Input number : "; int number; cin >> number;
if (deque.isBelong(number))
{
cout << number << " belongs.\n";
}
else
{
cout << number << " does not belong.\n";
}
system("pause");
system("cls");
break;
case 12:
cout << "Deque before reverse: "; deque.show(); cout << endl;
cout << "Deque after reverse: "; deque.reverse(); deque.show(); cout << endl;
system("pause");
system("cls");
break;
default:
cout << "There is no " << choice << " choice!" << endl;
system("pause");
system("cls");
break;
}
}
}
However, reverse() method works inappropriate way. Testing code I noticed that several methods working inappropriate way after reversing:
- getRear() - returns old value;
- deleteLast() - crashes.
Reverse() method based totally on same method in linked list implementation,as swap(), although it works with some problems.