#include "CustomList.h"
#define AT_ 1
/* std::string
int main(int argc, char *argv[]) {
CustomList list;
list.push_front("added first");
list.push_front("added second");
list.pop_front();
list.push_back("added third");
list.push_back("added fourth");
list.pop_back();
list.push_back("added fifth");
printf("At [%lu]: \"%s\"\n", AT_, list.at(AT_).c_str());
printf("Size: \n- %lu\n", list.size());
list.print();
printf("Done!\n");
return 0;
}
*/
int main(int argc, char *argv[]) {
CustomList<int> list;
list.push_front(111);
list.push_front(222);
list.pop_front();
list.push_back(333);
list.push_back(444);
list.pop_back();
list.push_back(555);
list.remove_at(0);
list.insert_at(1, 222);
printf("At [%lu]: \"%i\"\n", AT_, list.at(AT_));
printf("Size: \n- %lu\n", list.size());
list.print();
printf("Done!\n");
return 0;
}
#ifndef CUSTOMLIST_H
#define CUSTOMLIST_H
#include <cstdio>
#include <iostream>
#include <string>
/** One node in a linked list of strings. */
template <typename T> struct CustomListNode {
T item;
CustomListNode *next;
};
/** A linked list of strings. */
template <typename T> class CustomList {
public:
CustomList() {
}
~CustomList() {
CustomListNode<T> *p = begin_;
CustomListNode<T> *pNext = nullptr;
while (p != nullptr) {
pNext = p->next;
delete p;
p = pNext;
}
}
/** Print out the items in the list. */
void print() {
puts("Contents:");
CustomListNode<T> *p = begin_;
if(p == nullptr) {
puts("!Empty!");
return;
}
while (p != nullptr) {
std::cout << "- " << p->item << "\n";
p = p->next;
}
}
size_t size() {
return len_;
}
void insert_at(size_t n, const T& item) {
CustomListNode<T> *node = new CustomListNode<T>;
node->item = item;
CustomListNode<T> **p = &begin_;
for(size_t i = 0; i < n; i++, p = &((*p)->next));
node->next = *p;
*p = node;
len_++;
}
void remove_at(size_t n) {
CustomListNode<T> **p = &begin_;
for(size_t i = 0; i < n; i++, p = &((*p)->next));
*p = (*p)->next;
len_--;
}
void push_front(const T& item) {
CustomListNode<T> *node = new CustomListNode<T>;
node->item = item;
node->next = begin_;
begin_ = node;
len_++;
}
void pop_front() {
if(begin_ != nullptr) {
CustomListNode<T> *pNext = begin_->next;
delete begin_;
begin_ = pNext;
len_--;
} else {
puts("ERROR: List already empty");
exit(1);
}
}
void push_back(const T& item) {
CustomListNode<T> *node = new CustomListNode<T>;
node->item = item;
node->next = nullptr;
if(begin_ == nullptr) {
begin_ = node;
} else {
CustomListNode<T> *p = begin_;
while(p->next) p = p->next;
p->next = node;
}
len_++;
}
void pop_back() {
if(begin_ != nullptr) {
CustomListNode<T> *p = begin_;
while(p->next->next) p = p->next;
delete p->next;
p->next = nullptr;
len_--;
} else {
puts("ERROR: List already empty");
exit(1);
}
}
T& at(size_t n) {
CustomListNode<T> *p = begin_;
if(begin_ == nullptr) {
puts("ERROR: List empty");
exit(1);
} else if(n >= len_) {
printf("ERROR: List doesn't have an element at %lu\n", n);
exit(1);
}
for(size_t i = 0; i < n; i++, p = p->next);
return p->item;
}
private:
CustomListNode<T> *begin_ = nullptr;
size_t len_ = 0;
};
#endif