// Ahmed mohamed mostafa azazy
// Computer Science
#include<iostream>
#include<string>
using namespace std;
class DoublyLinkedList
{
private:
struct Node
{
int data;
Node* next;
Node* prev;
Node() {
next = NULL; // inatial state
prev = NULL;
}
};
Node* head = NULL;
public:
void append(int val) // if user don't insert position
{
Node* newNode = new Node;
newNode->data = val;
if (head == NULL)
{
head = newNode;
}
else
{
Node* temp = head;
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
};
void insert_at_pos(int val, int pos)
{
Node* newNode = new Node;
newNode->data = val;
if (head == NULL)
{
head = newNode;
return;
}
if (pos == 0)
{
newNode->next = head;
head->prev = newNode;
head = newNode;
return;
}
Node* temp = head;
for (int i = 0; i < pos && temp != NULL; i++)
{
temp = temp->next;
}
// if temp get null after loop will insert at last of list
if (temp == NULL) {
this->append(val);
return;
}
newNode->prev = temp->prev;
temp->prev->next = newNode;
temp->prev = newNode;
newNode->next = temp;
};;
int locate(int value)
{
Node* temp = head;
int pos = 0;
while (temp != NULL)
{
if (temp->data == value)
return pos;
temp = temp->next;
pos++;
}
cout << "Value not found\n";
return -1;
}
void delete_at_pos(int pos)
{
if (head == NULL || pos < 0)
{
cout << "Invalid position or empty list\n";
return;
}
Node* temp = head;
if (pos == 0)
{
head = head->next;
if (head != NULL)
head->prev = NULL;
delete temp;
return;
}
for (int i = 0; i < pos && temp != NULL; i++)
{
temp = temp->next;
}
if (temp == NULL)
{
cout << "Position out of bounds\n";
return;
}
if (temp->prev != NULL)
temp->prev->next = temp->next;
if (temp->next != NULL)
temp->next->prev = temp->prev;
delete temp;
}
int retrieve(int pos)
{
if (pos < 0)
{
cout << "Invalid position\n";
return -1;
}
Node* temp = head;
int current = 0;
while (temp != NULL)
{
if (current == pos)
return temp->data;
temp = temp->next;
current++;
}
cout << "Position out of bounds\n";
return -1;
}
int get_size()
{
int count = 0;
Node* temp = head;
while (temp != NULL)
{
count++;
temp = temp->next;
}
return count;
};
void reverse() {
Node* current = head;
Node* temp = NULL;
while (current != NULL) {
temp = current->prev;
current->prev = current->next;
current->next = temp;
current = current->prev;
}
if (temp != NULL)
head = temp->prev;
}
void purge()
{
Node* temp = head;
while (temp != NULL)
{
Node* nextNode = temp->next;
delete temp;
temp = nextNode;
}
head = NULL;
}
void display()
{
Node* temp = head;
while (temp != NULL)
{
cout << temp->data << "\t";
temp = temp->next;
}
cout << endl;
}
};
int main()
{
DoublyLinkedList l1;
l1.append(10);
l1.append(20);
l1.append(30);
l1.append(40);
l1.display();
l1.insert_at_pos(15, 1);
l1.insert_at_pos(5, 0);
l1.insert_at_pos(50, 10);
l1.display();
cout << l1.locate(30) << endl;
l1.delete_at_pos(0);
l1.delete_at_pos(2);
l1.display();
cout << l1.retrieve(2) << endl;
cout << l1.get_size() << endl;
l1.reverse();
l1.display();
l1.purge();
l1.display();
return 0;
}