/* $Id: list.cc,v 1.1 1998/08/17 20:23:26 cthulhu Exp $ */ #include #include "list.hh" #include "event.hh" #define NOMEM_ACTION return NULL template int Node::IsFirst () { if(element==NULL) return(-1); if(prev==NULL) return(1); return(0); } template int Node::IsLast () { if(element==NULL) return(-1); if(next==NULL) return(1); return(0); } template Lista::Lista () { num_elements = 0; head = NULL; tail = NULL; } template ElemType* Lista::GetHead () { return head->element; } template ElemType* Lista::GetTail () { return tail->element; } template ElemType* Lista::RemoveHead () { return RemoveAt(head); } template ElemType* Lista::RemoveTail () { return RemoveAt(tail); } template Node* Lista::AddHead (ElemType* elem) { Node *new_node = new Node; if (!new_node) NOMEM_ACTION; new_node->prev = NULL; new_node->next = head; new_node->element = elem; if (head == NULL) tail = new_node; else head->prev = new_node; head = new_node; num_elements++; return head; } template Node* Lista::AddTail (ElemType* elem) { Node *new_node = new Node; if (!new_node) NOMEM_ACTION; new_node->prev = tail; new_node->next = NULL; new_node->element = elem; if (tail == NULL) head = new_node; else tail->next = new_node; tail = new_node; num_elements++; return tail; } template void Lista::RemoveAll () { while (!IsEmpty()) RemoveHead(); } template Node* Lista::GetHeadPosition () { return head; } template Node* Lista::GetTailPosition () { return tail; } template ElemType* Lista::GetNext (Node* *node) { ElemType* elem; elem = (*node)->element; *node = (*node)->next; return elem; } template ElemType* Lista::GetPrev (Node* *node) { ElemType* elem; elem = (*node)->element; *node = (*node)->prev; return elem; } template ElemType* Lista::GetAt (Node* node) { return node->element; } template ElemType* Lista::SetAt (Node* node, ElemType* elem) { ElemType* old_elem; old_elem = node->element; node->element = elem; return old_elem; } template ElemType* Lista::RemoveAt (Node* node) { ElemType* old_elem; old_elem = node->element; if (node->prev == NULL) head = node->next; else node->prev->next = node->next; if (node->next == NULL) tail = node->prev; else node->next->prev = node->prev; delete node; num_elements--; return old_elem; } template Node* Lista::InsertBefore (Node* pnode, ElemType* elem) { Node *new_node; if (pnode == NULL) return AddHead (elem); if (pnode->prev == NULL) return AddHead (elem); new_node = new Node; if (!new_node) NOMEM_ACTION; new_node->prev = pnode->prev; new_node->next = pnode; new_node->prev->next = new_node; new_node->next->prev = new_node; new_node->element = elem; num_elements++; return new_node; } template Node* Lista::InsertAfter (Node* pnode, ElemType* elem) { Node* new_node; if (pnode == NULL) return AddTail (elem); if (pnode->next == NULL) return AddTail (elem); new_node = new Node; if (!new_node) NOMEM_ACTION; new_node->prev = pnode; new_node->next = pnode->next; new_node->prev->next = new_node; new_node->next->prev = new_node; new_node->element = elem; num_elements++; return new_node; } template void Lista::MergeList (Lista list2) { if (list2.IsEmpty()) { list2.RemoveAll(); return; } if (IsEmpty()) { head = list2.head; tail = list2.tail; num_elements = list2.num_elements; list2.RemoveAll(); return; } num_elements += list2.num_elements; list2.head->prev = tail; tail->next = list2.head; tail = list2.tail; list2.RemoveAll(); } template Node* Lista::Find (ElemType* elem) { Node *pos1, *pos2; for (pos1 = GetHeadPosition(); (pos2 = pos1) != NULL;) if (elem == GetNext (&pos1)) break; return pos2; } template Node* Lista::FindIndex (UINT index) { Node* node; UINT i; if (num_elements <= index) return NULL; node = head; for (i = 0; i < index; i++, node = node->next); return node; } template UINT Lista::GetCount () { return num_elements; } template int Lista::IsEmpty () { return (!num_elements); } template class Lista; template class Node; /* $Log: list.cc,v $ * Revision 1.1 1998/08/17 20:23:26 cthulhu * Initial revision * */