- Bổ sung 5 option 13, 14, 15, 16 và 17 trong menu:

13. Xóa phần tử liền sau phần tử chứa giá trị x đầu tiên được tìm thấy trong danhs sách

Xử lý những trường hợp ngoại lệ sau:

+  Nếu không tìm thấy x thì xuất thông báo: cout << "\nCan't find the value "<<x;
+ Trước khi xóa sẽ hỏi user:  cout<<"\nDo you want to delete the element after "<<x<<" ?(y/n): ";

+ Nếu x ở cuối danh sách thì xuất thông báo: cout<<endl<<x<<" is the last element. Can't delete the element after it";

 

14. Xóa phần tử liền trước phần tử chứa giá trị x đầu tiên được tìm thấy trong danhs sách

 + Trước khi xóa sẽ hỏi user: cout<<"\nDo you want to delete the element before "<<x<<" ?(y/n): ";

+ Nếu x ở đầu danh sách thì xuất thông báo: cout<<endl<<x<<" is the first element. Can't delete the element before it";

 

15. Xóa những phần tử đứng liền sau tất cả phần tử chứa giá trị x có trong danhs sách

+ Nếu danh sách chỉ có chứa 1 giá trị x duy nhất nhưng x lại nằm ở cuối danh sách thì không có phần tử đứng sau  nó để xóa. Do đó cần xuất thông báo: cout<<"\nList has only one "<<x<<" and "<<x<<" is the last element. Can't delete the element after it";

+ Nếu danh sách có chứa x và có thể xóa được phần tử đứng sau nó thì hỏi user:  cout<<"\nDo you want to delete all elements after "<<x<<" ?(y/n): ";  LƯU Ý CHỈ HỎI 1 LẦN THÔI.

 

16. Xóa những phần tử đứng liền trước tất cả phần tử chứa giá trị x có trong danhs sách

+ Nếu danh sách chỉ có chứa 1 giá trị x duy nhất nhưng x lại nằm ở đầu danh sách thì không có phần tử đứng trước nó để xóa. Do đó cần xuất thông báo: cout<<"\nList has only one "<<x<<" and "<<x<<" is the first element. Can't delete the element before it";

+ Nếu danh sách có chứa x và có thể xóa được phần tử đứng trước nó thì hỏi user: cout<<"\nDo you want to delete all elements before "<<x<<" ?(y/n): "; LƯU Ý CHỈ HỎI 1 LẦN THÔI.

17. Xóa toàn bộ danh sách

+ Trước khi xóa sẽ hỏi user: cout<<"\nDo you want to delete all elements?(y/n): ";

+ Sau khi xóa xong thì xuất thông báo: cout<<"\nThe list becomes empty"; /*###Begin banned keyword - each of the following line if appear in code will raise error. regex supported
define
include
using
###End banned keyword*/

#include  <iostream>
using namespace std;

struct DNode
{
	int info;
	DNode *pNext, *pPrev;
};

struct DList
{
	DNode *pHead, *pTail;
};

void init(DList &L)
{
L.pHead = L.pTail = NULL;
}

void createList(DList &L)
{
int x;
while(true)
{
std::cin >> x;
if (x==-1) break;

DNode *p = new DNode;
p->info = x;
p->pPrev = p->pNext = NULL;

if (L.pHead == NULL)
{
L.pHead = L.pTail = p;
}
else
{
L.pTail->pNext = p;
p->pPrev = L.pTail;
L.pTail = p;
}
}
}

void printList(DList L)
{
if (L.pHead==NULL)
{
std::cout << "Empty list" << std::endl;
}
else
{
for (DNode *p=L.pHead; p!=NULL; p=p->pNext)
{
std::cout << p->info << " ";
}
std::cout << std::endl;
}
}

void addHead(DList &L, int x)
{
DNode p = new DNode;
p->info = x;
p->pNext = L.pHead;
p->pPrev = NULL;
if (L.pHead) L.pHead->pPrev = p;
else L.pTail = p;
L.pHead = p;
}

void addTail(DList &L, int x)
{
DNode p = new DNode;
p->info = x;
p->pPrev = L.pTail;
p->pNext = NULL;
if (L.pTail) L.pTail->pNext = p;
else L.pHead = p;
L.pTail = p;
}


void removeAfter(DList &L, int x)
{
char c;
DNode i;

for(i=L.pHead; i; i=i->pNext)
{
if (i->info==x)
{
if (i->pNext == NULL)
{
std::cout<<std::endl<<x<<" is the last element. Can'''t delete the element after it";
return;
}
else
{
std::cout<<"\nDo you want to delete the element after “<<x<<” ?(y/n): ";
std::cin >> c;
if (c != 'y'||c!='Y') return;
DNode ans = i->pNext;
ans->pPrev->pNext = ans->pNext;
delete ans;
}

break;
}
}

if (i == NULL)
{
std::cout << "\nCan't find the value " << x;
}
}

int main()
{
	DList L;
	init(L);
	int x,y,choice; char c;

	cout<<"MENU:";
    cout<<"\n1. Create a DList";
    cout<<"\n2. Print the DList";
    cout<<"\n3. Insert a value at the front";
    cout<<"\n4. Insert a value at the end";
    cout<<"\n5. Insert a value after a given value (only for the first value found)";
    cout<<"\n6. Insert a value before a given value (only for the first value found)";
    cout<<"\n7. Insert a value after a given value (for all the same values)";
    cout<<"\n8. Insert a value before a given value (for all the same values)";
    cout<<"\n9. Delete the first element";
    cout<<"\n10. Delete the last element";
    cout<<"\n11. Delete the first element containing a specific value";
    cout<<"\n12. Delete all elements storing a particular value";
    cout<<"\n13. Delete the element after a specific value (only for the first one found)";
    cout<<"\n14. Delete the element before a specific value (only for the first one found)";
    cout<<"\n15. Delete all elements after a specific value";
    cout<<"\n16. Delete all elements before a specific value";
    cout<<"\n17. Delete all elements";
    cout<<"\n20. Exit"<<endl;


	while(true)
    {
        cout<<"\n\t\tPLEASE SELECT YOUR CHOICE: ";
        cin>>choice;
        switch(choice)
        {
        case 1:
            cout<<"\nEnter your positive integers until you enter -1 to finish: ";
            createList(L);
            break;
        case 2:
            cout<<"\nYour current DList: ";
            printList(L);
            break;
        case 3:
            cout<<"\nEnter a number: ";
            cin>>x;
            addHead(L,x);
            break;
        case 4:
            cout<<"\nEnter a number: ";
            cin>>x;
            addTail(L,x);
            break;
        case 5:
            cout<<"\nEnter two numbers: ";
            cin>>x>>y;
            addAfter(L,x,y);
            break;
        case 6:
            cout<<"\nEnter two numbers: ";
            cin>>x>>y;
            addBefore(L,x,y);
            break;
        case 7:
            cout<<"\nEnter two numbers: ";
            cin>>x>>y;
            addAfterMulti(L,x,y);
            break;
        case 8:
            cout<<"\nEnter two numbers: ";
            cin>>x>>y;
            addBeforeMulti(L,x,y);
            break;
        case 9:
            removeHead(L);
            break;
        case 10:
            removeTail(L);
            break;
        case 11:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            cout<<"\nEnter a number: ";
            cin>>x;
            removeNode(L,x);
            break;
        case 12:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            cout<<"\nEnter a number: ";
            cin>>x;
            removeMultiNodeS(L,x);
            break;
        case 13:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            cout<<"\nEnter a number: ";
            cin>>x;
            removeAfter(L,x);
            break;
        case 14:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            cout<<"\nEnter a number: ";
            cin>>x;
            removeBefore(L,x);
            break;
        case 15:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            cout<<"\nEnter a number: ";
            cin>>x;
            removeMultiAfters(L,x);
            break;
        case 16:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            cout<<"\nEnter a number: ";
            cin>>x;
            removeMultiBefores(L,x);
            break;
        case 17:
            if (L.pHead==NULL){cout<<"\nList is empty. Can't delete";break;}
            removeAll(L);
            break;
        case 20:
            cout<<"\nGOOD BYE";
            return 0;

        }
    }

	return 0;
}
