Data Structures in C++ I am really new to C++, so links are really hard topic for me. It would be nice if you can provide explanations of what doubly linked lists are and of some of you steps... Thank you In this assignment, you will implement a doubly-linked list class, together with some list operations. To make things easier, you’ll implement a list of int, rather than a template class. Solution A variable helps us to identify the data. For ex: int a = 5; Here 5 is identified through variable a. Now, if we have collection of integers, we need some representation to identify them. We call it array. For ex: int arr[5] This array is nothing but a Data Structure. So, a Data Structure is a way to group the data. There are many Data Structures available like Arrays, Linked List, Doubly-Linked list, Stack, Queue, etc. Doubly-Linked list are the ones where you can traverse from the current node both in left and right directions. Why so many different types of Data Structures are required ? Answer is very simple, grouping of data, storage of data and accessing the data is different. For example, in case of Arrays we store all the data in contiguous locations. What if we are not able to store the data in contiguous locations because we have huge data. Answer is go for Linked List/Doubly-Linked list. Here we can store the data anywhere and link the data through pointers. I will try to provide comments for the code you have given. May be this can help you. #pragma once /* dlist.h Doubly-linked lists of ints */ #include class dlist { public: dlist() { } // Here we are creating a NODE, it has a integer value and two pointers. // One pointer is to move to next node and other to go back to previous node. struct node { int value; node* next; node* prev; }; // To return head pointer, i.e. start of the Doubly-Linked list. node* head() const { return _head; } // To return Tail pointer, i.e. end of the Doubly-Linked list. node* tail() const { return _tail; } // **** Implement ALL the following methods **** // Returns the node at a particular index (0 is the head). node* at(int index){ int cnt = 0; struct node* tmp = head(); while(tmp!=NULL) { if (cnt+1 == index) return tmp; tmp = tmp->next; } } // Insert a new value, after an existing one void insert(node *previous, int value){ // check if the given previous is NULL if (previous == NULL) { printf(\"the given previous node cannot be NULL\"); return; } // allocate new node struct node* new_node =(struct node*) malloc(sizeof(struct node)); // put in the data new_node->data = new_data; // Make next of new node as next of previous new_node->next = previous->next; // Make the next of previous as new_node previous->next = new_node; // Make previous as previous of new_node new_node->prev = previous; // Change previous of new_node\'s next node if (new_node->next != NULL) new_node->next->prev = new_node; } // Delete the given node void del(node* which){ struct node* head_ref = head(); /* base case */ if(*head_ref == NUL.