//list.h
//list.h
#ifndef GUARD_list.h
#define GUARD_list.h
#include <iostream>
template <class nodeType>
class listNode {
public:
nodeType data;
listNode<nodeType>* next;
};
template <class T>
class list {
public:
//default constructor
list(): first(NULL) { };
// default destructor
~list();
// functions to manage data
// get data from spot
T get(listNode<T>*);
//T get();
// print data
std::ostream& print(std::ostream&, listNode<T>*);
// find data
listNode<T>* find(T);
// instert element into list or insert element after given position
T insert(T);
listNode<T>* insert(T, listNode<T>*);
// remove element from list
listNode<T>* remove(listNode<T>*);
// print list
std::ostream& list<T>::print(std::ostream&);
//private:
listNode<T>* first;
};
template <class T>
list<T>::~list()
{
while(first != NULL)
{
first = remove(first);
}
}
template <class T>
T list<T>::get(listNode<T>* element)
{
return element->data;
}
template <class T>
std::ostream& list<T>::print(std::ostream& out, listNode<T>* element)
{
return out << element->data;
}
template <class T>
listNode<T>* list<T>::find(T valueToFind)
{
listNode<T>* node = first;
T value;
while (node != NULL || value != valueToFind)
{
value = node->data;
node = node->next;
}
return node;
}
template <class T>
T list<T>::insert(T value)
{
// does first equal null
if (first == NULL)
cout << "first equals null\n";
listNode<T>* node = first;
if (node == first)
cout << "node equals first\n";
// find last pointer
while (node != NULL)
{
node = node->next;
}
std::cout << "here\n";
node = new listNode<T>;
std::cout << "memory allocated";
node->data = value;
node->next = NULL;
return node->data;
}
template <class T>
listNode<T>* list<T>::insert(T value, listNode<T>* n)
{
// pointer to node before new element
listNode<T>*& nodeBefore = n;
// pointer to node after new element
listNode<T>*& nodeAfter = n->next;
// pointer to new node
listNode<T>* newNode = new listNode<T>;
// link nodeBefore to newNode
nodeBefore->next = newNode;
//link newNode to nodeAfter
newNode->next = nodeAfter;
// set value of newNode
newNode->data = value;
return newNode;
}
template <class T>
listNode<T>* list<T>::remove(listNode<T>* nodeToRemove)
{
listNode<T>* nodeAfterRemoved = nodeToRemove->next;
delete nodeToRemove;
nodeToRemove = nodeAfterRemoved;
return nodeAfterRemoved;
}
template <class T>
std::ostream& list<T>::print(std::ostream& out)
{
listNode<T>* node = first;
while (node != NULL)
{
out << node->data << " ";
node = node->next;
}
out << std::endl;
return out;
}
#endif
// linked_list.cpp
#include <iostream>
#include "list.h"
using namespace std;
int main()
{
list<int> test;
cout << test.insert(7);
return 0;
}
[grunewac@tetra LinkedList.dir]% ./linked_list.exe
first equals null
node equals first
here
Segmentation fault (core dumped)
[grunewac@tetra LinkedList.dir]%