Linked List - Final

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 6

### part 3

#DynamicStructure
[[Linked List]] [[Linked List.Clear]] [[Linked List.Final]] [[Linked List Double
(!!!)]]

---
```cpp
#include <iostream>
using namespace std;

template<typename T>
class List {
public:
List() {
size = 0;
head = nullptr;
}
~List() {
clear();
}

int GetSize() { return size; }


void push_front(T data);
void insert(T value, int index);
void push_back(T data);
void pop_front();
void removeAt(int index);
void pop_back();

T& operator [](const int index);


void clear();

private:
template<typename T>
class Node {
public:
T data;
Node* pNext;

Node(T data = T(), Node* pNext = nullptr) {


this->data = data;
this->pNext = pNext;
}
};

int size;
Node<T>* head;
};

//operator overloading
template<typename T>
T& List<T>::operator [](const int index) {
int counter = 0;
Node<T>* current = head;
while (current->pNext != nullptr) {
if (counter == index)
return current->data;
current = current->pNext;
counter++;
}
}

//elements operations
template<typename T>
void List<T>::push_front(T data) {
head = new Node<T>(data, head);
size++;
}

template<typename T>
void List<T>::insert(T value, int index) {
if (index == 0)
push_front(value);
else {
Node<T>* previous = head;
for (int i = 0; i < index - 1; i++) {
previous = previous->pNext;
}
previous->pNext = new Node<T>(value, previous->pNext);
size++;
}
}

template<typename T>
void List<T>::push_back(T data) {
if (head == nullptr)
head = new Node<T>(data);
else {
Node<T>* current = head;
while (current->pNext != nullptr)
current = current->pNext;

current->pNext = new Node<T>(data);


}
size++;
}

template<typename T>
void List<T>::pop_front() {
Node<T>* temp = head;
head = head->pNext;
delete temp;
size--;
}
template<typename T>
void List<T>::removeAt(int index) {
if (index == 0)
pop_front();
else {
Node<T>* previous = head;
for (int i = 0; i < index - 1; i++) {
previous = previous->pNext;
}
Node<T>* toDelete = previous->pNext;
previous->pNext = toDelete->pNext;

delete toDelete;
size--;
}
}
template<typename T>
void List<T>::pop_back(){
removeAt(size - 1);
}

template<typename T>
void List<T>::clear() {
while (size)
pop_front();
}

int main() {
List<int> lst;
lst.push_front(4);
lst.push_front(3);
lst.push_front(7);
lst.push_front(8);
lst.push_front(53);
lst.push_front(83);

for (int i = 0; i < lst.GetSize(); i++) {


cout << lst[i] << endl;
}

cout << "\ninsert!\n" << endl;


lst.insert(245, 2);
cout << "\nremove!\n" << endl;
lst.removeAt(4);

for (int i = 0; i < lst.GetSize(); i++){


cout << lst[i] << endl;
}

cout << "\npop_back\n";


lst.pop_back();

for (int i = 0; i < lst.GetSize(); i++) {


cout << lst[i] << endl;
}

cout << "\nelemenets on the list: " << lst.GetSize() << endl;

cout << "clear" << endl;


lst.clear();

cout << "elements on the list: " << lst.GetSize() << endl;

return 0;
}
```
## More examples
```cpp
#include <iostream>
using namespace std;

template<typename T>
class List {
public:
List() {
size = 0;
head = nullptr;
}
~List() {
clear();
}

int GetSize() { return size; }


T& operator [] (const int index);

void push_front(T data);


void insert(T data, int index);
void push_back(T data);

void pop_front();
void removeAt(int index);
void pop_back();

void clear();

private:
template <typename T>
class Node {
public:
T data;
Node* pNext;

Node(T data = T(), Node* pNext = nullptr) {


this->data = data;
this->pNext = pNext;
}
};

int size;
Node<T>* head;
};

//operator overload
template<typename T>
T& List<T>::operator[](const int index){
int counter = 0;
Node<T>* current = head;
while (current != nullptr){
if (counter == index)
return current->data;
current = current->pNext;
counter++;
}
}
//element operation
template<typename T>
void List<T>::push_front(T data) {
head = new Node<T>(data, head);
size++;
}
template<typename T>
void List<T>::insert(T data, int index) {
if (index == 0)
push_front(data);
else {
Node<T>* previous = head;
for (int i = 0; i < index - 1; i++){
previous = previous->pNext;
}
previous->pNext = new Node<T>(data, previous->pNext);
size++;
}
}
template<typename T>
void List<T>::push_back(T data) {
if (head == nullptr)
head = new Node<T>(data);
else {
Node<T>* current = head;
while (current->pNext != nullptr) {
current = current->pNext;
}
current->pNext = new Node<T>(data);
}
size++;
}
template<typename T>
void List<T>::pop_back() {
removeAt(size - 1);
}

template<typename T>
void List<T>::clear(){
while (size)
pop_front();
}

template<typename T>
void List<T>::pop_front(){
Node<T>* temp = head;
head = head->pNext;
delete temp;
size--;
}
template<typename T>
void List<T>::removeAt(int index){
if (index == 0)
pop_front();
else {
Node<T>* previous = head;
for (int i = 0; i < index - 1; i++){
previous = previous->pNext;
}
Node<T>* ToDelete = previous->pNext;
previous->pNext = ToDelete->pNext;

delete ToDelete;
size--;
}
}

template<typename T>
void printList(List<T>& lst) {
for (int i = 0; i < lst.GetSize(); i++) {
cout << lst[i] << endl;
}
}

int main() {

List<int> lst;

int size = 5;
for (int i = 0; i < size; i++){
lst.push_back(rand() % 10);
}

lst.insert(155, 2);
lst.removeAt(2);

printList(lst);

return 0;
}
```

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy