├── .gitattributes ├── DS Assignment-02.docx └── Solution.cpp /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /DS Assignment-02.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fazeelkhalid/concatinate-and-delete-data/44cbde0f4e68ff2ce0b1adfb8f1de99e096ffe89/DS Assignment-02.docx -------------------------------------------------------------------------------- /Solution.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | 4 | struct node { 5 | int data; 6 | node* nextNode; 7 | node* previousNode; 8 | node() { 9 | data = 0; 10 | nextNode = NULL; 11 | previousNode = NULL; 12 | } 13 | }; 14 | 15 | class doublyList { 16 | private: 17 | node* listHead; 18 | public: 19 | doublyList() { 20 | listHead = 0; 21 | } 22 | void insert(int data) {//it will insert data at the end of linked list 23 | if(listHead != NULL ) { 24 | node * tHead = listHead; // tempHead 25 | while (tHead->nextNode) { // untill tHead not NUll 26 | tHead = tHead->nextNode; 27 | } 28 | node *newNode = new node; 29 | newNode->data = data; 30 | tHead->nextNode= newNode; 31 | newNode->previousNode= tHead; 32 | } 33 | if (listHead == NULL) { 34 | listHead = new node; 35 | listHead->data = data; 36 | } 37 | } 38 | 39 | void printI() { // print with the help of next pointer 40 | cout << "\nList Data : "; 41 | node * tHead= listHead; 42 | 43 | while (tHead) { 44 | cout << tHead->data << " "; 45 | tHead = tHead->nextNode; 46 | } 47 | } 48 | node* getHead() { 49 | return listHead; 50 | } 51 | 52 | void RemoveAllBut(int key) { 53 | node* tHead = listHead; // temp head; 54 | node* tPreHead = NULL; // temp previous head 55 | for (int i = 0; tHead; i++) { 56 | if (key != tHead->data) { 57 | if (!tHead->previousNode || i == 0) { // i zero means we ant to delete first node 58 | node* tempNode = listHead; 59 | listHead = tempNode->nextNode; 60 | listHead->previousNode = NULL; 61 | delete tempNode; // delete first node 62 | tHead = listHead; 63 | } 64 | else if (!tHead->nextNode) { // delete last Node 65 | tPreHead->nextNode = NULL; 66 | delete tHead; 67 | tHead = tPreHead; 68 | } 69 | else { 70 | tPreHead->nextNode = tHead->nextNode; 71 | tHead->nextNode->previousNode = tPreHead; 72 | delete tHead; 73 | tHead = tPreHead; 74 | } 75 | } 76 | tPreHead = tHead; 77 | tHead = tHead->nextNode; 78 | } 79 | } 80 | }; 81 | 82 | 83 | void concatenate(doublyList &l1, doublyList& l2){ 84 | node* tHead = l2.getHead(); 85 | if (l1.getHead() == NULL && l2.getHead() != NULL) { 86 | while (tHead) { 87 | l1.insert(tHead->data); 88 | tHead = tHead->nextNode; 89 | } 90 | } 91 | if (l1.getHead() != NULL && l2.getHead() != NULL) { 92 | while (tHead) { 93 | l1.insert(tHead->data); 94 | tHead = tHead->nextNode; 95 | } 96 | } 97 | return; 98 | 99 | } 100 | 101 | void main() { 102 | doublyList l1; 103 | l1.insert(10); 104 | l1.insert(30); 105 | l1.insert(30); 106 | l1.insert(40); 107 | cout << "\n------------------------>>> LIST 1 <<<------------------------"; 108 | l1.printI(); 109 | 110 | doublyList l2; 111 | l2.insert(20); 112 | l2.insert(20); 113 | l2.insert(30); 114 | l2.insert(30); 115 | cout << "\n\n------------------------>>> LIST 2 <<<------------------------"; 116 | l2.printI(); 117 | 118 | 119 | concatenate(l1, l2); 120 | cout << "\n\n------------------------>>> LIST 1 AFTER CONCATINATION <<<------------------------"; 121 | l1.printI(); 122 | 123 | l1.RemoveAllBut(30); 124 | l1.printI(); 125 | 126 | } --------------------------------------------------------------------------------