// tll.cpp #include "tll.h" // data structures: // node for a linked list template class LLNode { public: Elem elem; // the element at this node LLNode *next; // pointer to the next node }; //=========================================================================== template LinkedList::LinkedList(void) { root = NULL; length = 0; } //=========================================================================== template LinkedList::LinkedList(const LinkedList &llist) { root = NULL; LLNode *temp_ptr = llist.root; while (temp_ptr) { Insert(temp_ptr->elem); temp_ptr = temp_ptr->next; } } //=========================================================================== template LinkedList &LinkedList::operator = ( const LinkedList &llist) { root = NULL; LLNode *temp_ptr = llist.root; while (temp_ptr) { Insert(temp_ptr->elem); temp_ptr = temp_ptr->next; } return *this; } //============================================================================ template LinkedList::~LinkedList(void) { if (root) { LLNode *temp_ptr = root->next, *next_temp_ptr; delete root; while (temp_ptr) { next_temp_ptr = temp_ptr->next; delete temp_ptr; temp_ptr = next_temp_ptr; } } } //============================================================================ template void LinkedList::Clear(void) { if (root) { LLNode *temp_ptr = root->next, *next_temp_ptr; delete root; while (temp_ptr) { next_temp_ptr = temp_ptr->next; delete temp_ptr; temp_ptr = next_temp_ptr; } } root = NULL; length = 0; } //=========================================================================== template Elem *LinkedList::Insert(const Elem &elem) { if (!root) { root = new LLNode; root->elem = elem; root->next = NULL; length++; return &(root->elem); } else { if (!Search(elem)) { // only put in if it is not already in - this is ineff. LLNode temp_node; temp_node.elem = root->elem; temp_node.next = root->next; root->elem = elem; root->next = new LLNode; root->next->elem = temp_node.elem; root->next->next = temp_node.next; length++; return &(root->elem); } else { // put the elem back in the same place root->elem = elem; return &(root->elem); } } return NULL; } //=========================================================================== template Elem *LinkedList::Search(const Elem &elem) { LLNode *curr_ptr = root; while (curr_ptr) { if (curr_ptr->elem == elem) return &(curr_ptr->elem); // this is very important, because they may not be completely the same, // since the comparison could be done on a key only else curr_ptr = curr_ptr->next; } return NULL; } //=========================================================================== template void LinkedList::Write(ostream &s) { LLNode *curr_ptr = root; while (curr_ptr) { s<<(curr_ptr->elem)<<" "; curr_ptr = curr_ptr->next; } } //============================================================================= template ostream &operator<<(ostream &s, LinkedList &ll) { ll.Write(s); return s; } //=========================================================================== template int LinkedList::DeleteNext(Elem &elem) { if (!root) return 0; elem = root->elem; LLNode *kill_ptr = root; root = root->next; delete kill_ptr; length--; return 1; } //=========================================================================== template int LinkedList::GetNext(Elem &elem, int start) { if (start) get_next_ptr = root; if (get_next_ptr) { elem = get_next_ptr->elem; get_next_ptr = get_next_ptr->next; return 1; } return 0; }