| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- #include "List.h"
- #include "ListNode.h"
- #include <string>
- using namespace std;
- // constructor with 0 parameters
- List::List() :
- List("List")
- {
- }
- // constructor with name parameter
- List::List(string name) :
- first_node(nullptr), last_node(nullptr), name(name)
- {
- }
- List::~List()
- {
- // set current to the start of the list
- ListNode * current = first_node;
- ListNode * to_delete;
- // clean the list until the end
- while(current != nullptr)
- {
- to_delete = current;
- // set next to traverse through the list
- current = current->get_next();
- // delete the data in the node
- delete to_delete;
- }
- }
- // insert at front of list
- void List::insert_at_front(void * data)
- {
- // cases
- // 1) empty list
- // 2) list with many elements
- // case 1
- if(first_node == nullptr)
- {
- // set first node to new peice of data
- first_node = new ListNode(data, nullptr);
- // set last node to the new data since there is only one element
- last_node = first_node;
- }
- // case 2
- else
- {
- // set next of new first node to current first node
- first_node = new ListNode(data, first_node);
- }
- }
- // insert at back of list
- void List::insert_at_back(void * data)
- {
- // cases
- // 1) empty list
- // 2) list with many elements
- // case 1
- if(first_node == nullptr)
- {
- // set last node to the new data
- last_node = new ListNode(data, nullptr);
- // set the first node to the last node since there is only one element
- first_node = last_node;
- }
- // case 2
- else
- {
- // next of last node is 0
- ListNode * new_node = new ListNode(data, nullptr);
- // set current last node to the new instance
- last_node->set_next(new_node);
- // set last node to the new node
- last_node = new_node;
- }
-
- }
- // remove from front of list
- void * List::remove_from_front(void)
- {
- void * removed_data = nullptr;
- // cases
- // 1) empty list
- // 2) one element in list
- // 3) multiple elements in list
- // empty list
- if(first_node == nullptr)
- {
- removed_data = nullptr;
- }
- // one element in list
- else if(first_node == last_node)
- {
- // removed_data holds the address of the first element
- removed_data = first_node;
- // null first and last node no more elements
- first_node = nullptr;
- last_node = nullptr;
- }
- // multiple element in list
- else
- {
- // remvoed data holds the address of the first element
- removed_data = first_node;
- // set the 2nd element in the list as the first
- first_node = first_node->get_next();
- }
- return removed_data;
- }
- // remove from back of list
- void * List::remove_from_back(void)
- {
- // cases
- // 1) empty list
- // 2) one element in list
- // 3) multiple elements in list
- void * removed_data = nullptr;
- // empty list
- if(first_node == nullptr)
- {
- removed_data = nullptr;
- }
- // one element in list
- else if(first_node == last_node)
- {
- // removed data holds the address of the last element
- removed_data = last_node;
- // set the last node to null as list is empty
- first_node = nullptr;
- // set the last node to null as list is empty
- last_node = nullptr;
- }
- // multiple elements in list
- else
- {
- ListNode * current = first_node;
- while(current->get_next() != last_node)
- {
- current = current->get_next();
- }
- // removed data holds the address of the current last element in the
- // list
- removed_data = last_node;
- // set the last node to equal to the current variable which is the
- // second to last element in the list
- last_node = current;
- }
- return removed_data;
- }
- // get the first node in the list
- ListNode * List::get_first(void)
- {
- return first_node;
- }
|