#include #include #include "node1.h" #include "sequence3.h" using namespace std; namespace main_savitch_5 { sequence::sequence() { head_ptr = NULL; tail_ptr = NULL; cursor = NULL; precursor= NULL; many_nodes = 0; } sequence::sequence(const sequence& source) { list_copy(source.head_ptr, head_ptr, tail_ptr); if(source.precursor == NULL) { if(source.cursor == NULL) { cursor = NULL; precursor = NULL; } else { cursor = head_ptr; precursor = NULL; } } else { node* tmp_ptr = head_ptr; node* source_ptr = source.head_ptr; while(source_ptr != source.precursor) { source_ptr = source_ptr -> link(); tmp_ptr = tmp_ptr -> link(); } } } sequence::~sequence() { list_clear(head_ptr); } void sequence::start() { if(head_ptr==NULL) { cursor=NULL; precursor=NULL; } else { precursor = NULL; cursor=head_ptr; } } void sequence::advance() { assert(is_item()); precursor=cursor; cursor = cursor->link(); } void sequence::insert(const value_type& entry) { if (is_item( )) { if(precursor==NULL || cursor==NULL) { list_head_insert(head_ptr, entry); cursor=head_ptr; precursor=NULL; } else { list_insert(precursor, entry); cursor= precursor->link(); } } else { list_head_insert(head_ptr, entry); cursor = head_ptr; precursor=NULL; } many_nodes++; } void sequence::attach(const value_type& entry) { if (is_item( )) { precursor = cursor; list_insert(cursor, entry); cursor=cursor->link(); } else { if(head_ptr==NULL) { list_head_insert(head_ptr, entry); cursor = head_ptr; precursor=NULL; } else { precursor=list_locate(head_ptr,list_length(head_ptr)); list_insert(precursor,entry); cursor=precursor; } } many_nodes++; } void sequence::remove_current() { assert(is_item()); if(cursor == head_ptr) { if(many_nodes == 1) { list_head_remove(head_ptr); precursor = NULL; cursor = NULL; head_ptr = NULL; } else { node* tmp = head_ptr; head_ptr = head_ptr->link(); delete (tmp); cursor = head_ptr; precursor = NULL; } } else { cursor = cursor -> link(); list_remove(precursor); } --many_nodes; } void sequence::operator =(const sequence& source) { if(this == &source) { return; } else { list_copy(source.head_ptr, head_ptr, tail_ptr); if(source.precursor == NULL) { if(source.cursor == NULL) { cursor = NULL; precursor = NULL; } else { cursor = head_ptr; precursor = NULL; } } else { node *tmp_ptr = head_ptr; node *source_ptr = source.head_ptr; while(source_ptr != source.precursor) { source_ptr = source_ptr -> link(); tmp_ptr = tmp_ptr -> link(); } cursor = tmp_ptr -> link(); precursor = tmp_ptr; } } many_nodes = source.many_nodes; } sequence::value_type sequence::current() const { assert(is_item()); return cursor->data(); } }