I just finished writing an implementation of the "singly linked list data structure",and i wanna know if there are some bugs or memory leaks or any bad code to make the code better! i'm so sorry because there is no comment(But the code is simple , you can understand it)
#include <iostream>
template<typename T>
struct Node
{
T Data;
Node* NextPtr = nullptr;
Node() {
NextPtr = nullptr;
}
Node(T Filler, Node* NextPtrAr) {
Data = Filler;
NextPtr = NextPtrAr;
}
void operator =(Node NAr) {
Data = NAr.Data;
NextPtr = NAr.NextPtr;
}
};
template<typename T>
class LinkedList
{
protected:
unsigned int Size = 0;
void SetSize(unsigned int SizeAr);
public:
Node<T> Head;
Node<T> Tail;
LinkedList();
LinkedList(T Filler, unsigned int NbrOfElem = 1);
LinkedList(std::initializer_list<T> List);
unsigned int GetSize();
void Push(T Filler, unsigned int Index = Size);
void Pop(unsigned int Index = 0);
void operator=(LinkedList<T> List);
void operator=(std::initializer_list<T> List);
Node<T>& operator[](unsigned int Index);
Node<T>& NodeAt(unsigned int Index);
};
template<typename T>
void LinkedList<T>::SetSize(unsigned int SizeAr) {
Size = SizeAr;
}
template<typename T>
unsigned int LinkedList<T>::GetSize() {
return Size;
}
template<typename T>
LinkedList<T>::LinkedList() {
}
template<typename T>
LinkedList<T>::LinkedList(T Filler, unsigned int NbrOfElem) {
if (NbrOfElem==1)
{
Head.Data = Filler;
SetSize(1);
}
else if(NbrOfElem==2)
{
Head.Data = Filler;
Tail.Data = Filler;
Head.NextPtr = &Tail;
SetSize(2);
}
else
{
Node<T>* TempNextPtr=new Node<T>;
Head.Data = Filler;
Head.NextPtr = TempNextPtr;
for (int i = 0; i < NbrOfElem - 1; i++)
{
Node<T>* NewNode = TempNextPtr;
TempNextPtr = new Node<T>;
NewNode->Data = Filler;
NewNode->NextPtr = TempNextPtr;
}
Tail.Data = Filler;
SetSize(NbrOfElem);
}
}
template<typename T>
Node<T>& LinkedList<T>::operator[](unsigned int Index) {
if (Index >= Size - 1)
{
return Tail;
}
Node<T>* ReturnNode = &Head;
for (int i=0;i<Index;i++)
{
ReturnNode = ReturnNode->NextPtr;
}
return *ReturnNode;
}
template<typename T>
void LinkedList<T>::operator=(LinkedList<T> List) {
//Clear
for (int i=1;i<Size-1;i++)
{
delete& NodeAt(i);
}
//Fill
Head.Data = List.Head.Data;
Head.NextPtr = new Node<T>;
Tail.Data = List.Tail.Data;
for (int i = 1; i < List.GetSize() - 1; i++)
{
Node<T>* NewNode = NodeAt(i - 1).NextPtr;
NewNode->Data = List[i].Data;
NewNode->NextPtr = new Node<T>;
}
SetSize(List.GetSize());
}
template<typename T>
void LinkedList<T>::operator=(std::initializer_list<T> List) {
//Clear
for (int i = 1; i < Size - 1; i++)
{
delete& NodeAt(i);
}
//Fill
Head.Data = *List.begin();
Head.NextPtr = new Node<T>;
Tail.Data = *(List.end()-1);
for (int i = 1; i < List.size() - 1; i++)
{
Node<T>* NewNode = NodeAt(i - 1).NextPtr;
NewNode->Data = *(List.begin()+i);
NewNode->NextPtr = new Node<T>;
}
SetSize(List.size());
}
template<typename T>
LinkedList<T>::LinkedList(std::initializer_list<T> List) {
Head.Data =*List.begin() ;
Head.NextPtr = new Node<T>;
Tail.Data = *(List.end()-1);
Tail.NextPtr = nullptr;
for (int i=1;i<List.size()-1;i++)
{
Node<T>* NewNode = NodeAt(i-1).NextPtr;
NewNode->Data = *(List.begin()+i);
NewNode->NextPtr = new Node<T>;
}
SetSize(List.size());
}
template<typename T>
Node<T>& LinkedList<T>::NodeAt(unsigned int Index) {
if (Index>=Size-1)
{
return Tail;
}
Node<T>* ReturnNode = &Head;
for (int i = 0; i < Index; i++)
{
ReturnNode = ReturnNode->NextPtr;
}
return *ReturnNode;
}
template<typename T>
void LinkedList<T>::Push(T Filler, unsigned int Index) {
Node<T>* NewNode = new Node<T>;
if (Index==0)
{
NewNode->Data = Head.Data;
NewNode->NextPtr = Head.NextPtr;
Head.Data = Filler;
Head.NextPtr = NewNode;
}
else if(Index>=Size) {
NewNode->Data = Tail.Data;
NewNode->NextPtr = &Tail;
NodeAt(Size - 2).NextPtr = NewNode;
Tail.Data = Filler;
}
else
{
NewNode->Data = Filler;
NewNode->NextPtr = NodeAt(Index - 1).NextPtr;
NodeAt(Index - 1).NextPtr = NewNode;
}
SetSize(Size + 1);
}
template<typename T>
void LinkedList<T>::Pop(unsigned int Index) {
if (Size < 2)
{
*Head.Data = nullptr;
Head.NextPtr = nullptr;
SetSize(0);
break;
}
if (Index==0)
{
Head = NodeAt(1);
delete& NodeAt(1);
}
else if(Index>=Size-1)
{
Tail.Data = NodeAt(Size - 2).Data;
NodeAt(Size - 3).NextPtr = &Tail;
delete& NodeAt(Size-2);
}
else
{
NodeAt(Index - 1).NextPtr = &NodeAt(Index + 1);
delete& NodeAt(Index);
}
SetSize(Index - 1);
}
int main()
{
LinkedList <int> L1 = { 10, 20, 30 };
LinkedList<int>L2(175, 100);
L2 = L1;
std::cout << L2[99].Data;
}