#include
void menu();
int listSize(struct Node *temp);
struct Node
{
int data;
struct Node *next;
struct Node *prev;
};
typedef struct Node node;
int main()
{
node *head = NULL, *temp, *newNode;
int ch, n, i;
menu();
scanf("%d",&ch);
while(ch)
{
if(ch == 1)
{
if(head == NULL)
{
head = new node();
printf("enter data: ");
scanf("%d",&head->data);
head->next = NULL;
head->prev = NULL;
}
else
{
newNode = new node();
printf("enter data: ");
scanf("%d",&newNode->data);
newNode->next = head;
newNode->prev = NULL;
head->prev = newNode;
head = newNode;
}
}
else if(ch == 2)
{
printf("enter position: ");
scanf("%d",&n);
if(n == 1)
{
if(head == NULL)
{
head = new node();
printf("enter data: ");
scanf("%d",&head->data);
head->next = NULL;
head->prev = NULL;
}
else
{
newNode = new node();
printf("enter data: ");
scanf("%d",&newNode->data);
newNode->next = head;
newNode->prev = NULL;
head->prev = newNode;
head = newNode;
}
}
else
{
if(n >= 2 && n <= listSize(head)+1)
{
temp = head;
for(i = 1; i <= n-2; i++)
{
temp = temp->next;
}
newNode = new node();
printf("enter data: ");
scanf("%d",&newNode->data);
newNode->next = NULL;
newNode->prev = NULL;
newNode->next = temp->next;
newNode->prev = temp;
temp->next = newNode;
if(newNode->next != NULL)
newNode->next->prev = newNode;
}
else
{
printf("invalid position.\n\n");
}
}
}
else if(ch == 3)
{
if(head == NULL)
{
head = new node();
printf("enter data: ");
scanf("%d",&head->data);
head->next = NULL;
head->prev = NULL;
}
else
{
temp = head;
while(temp->next != NULL)
{
temp = temp->next;
}
newNode = new node();
printf("enter data: ");
scanf("%d",&newNode->data);
newNode->next = NULL;
newNode->prev = temp;
temp->next = newNode;
}
}
else if(ch == 4)
{
if(head == NULL)
{
printf("List is empty. Nothing to delete.\n\n");
}
else
{
temp = head;
head = head->next;
delete(temp);
}
}
else if(ch == 5)
{
temp = head;
int l_size = listSize(temp);
if(l_size > 0)
{
printf("enter position: ");
scanf("%d",&n);
if(n > 0 && n <= l_size )
{
if(n == 1)
{
temp = head;
head = head->next;
delete(temp);
}
else if(n == l_size)
{
temp = head;
if(listSize(temp) > 1)
{
node *pr = temp;
while(temp->next != NULL)
{
temp = temp->next;
}
pr = temp->prev;
delete(temp);
pr->next = NULL;
}
else
{
delete(temp);
head = NULL;
}
}
else
{
temp = head;
for(i = 1; i <= n-1; i++)
{
temp = temp->next;
}
temp->prev->next = temp->next;
temp->next->prev = temp->prev;
delete(temp);
}
}
else
{
printf("invalid position.\n\n");
}
}
}
else if(ch == 6)
{
if(head == NULL)
{
printf("List is empty. Nothing to delete.\n\n");
}
else
{
temp = head;
if(listSize(temp) > 1)
{
node *pr = temp;
while(temp->next != NULL)
{
temp = temp->next;
}
pr = temp->prev;
delete(temp);
pr->next = NULL;
}
else
{
delete(temp);
head = NULL;
}
}
}
else if(ch == 9)
{
temp = head;
while(temp != NULL)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n\n");
}
else
{
printf("invalid choice. please try again...\n\n");
}menu();
scanf("%d",&ch);
}
//printf("hello\n");
return 0;
}
void menu()
{
printf("1. insert (head)\n");
printf("2. insert (nth position)\n");
printf("3. insert (tail)\n");
printf("4. delete (head)\n");
printf("5. delete (nth position)\n");
printf("6. delete (tail)\n");
printf("9. print list\n");
printf("0. exit\n");
printf("enter choice: ");
}
int listSize(node *temp)
{
int i=0;
while(temp != NULL)
{
i++;
temp = temp->next;
}
return i;
}
//For this problem, you need to modify the doubly linked list code from your class.
Implement 2 function void undo() , void redo().
undo function will undone the changes (insert, delete, update) you have made.
redo function will undone the changes of undo function.
Please keep in mind that multiple occasion of undo and redo should be handled in your code.
NB: it is a combo of Linklist, stack, and queue.