class DOUBLE_CLLIST : public DOUBLE_LIST_CORE{
friend class DOUBLE_DL_CELL;
friend class DOUBLECLLISTFIter;
friend class DOUBLECLLISTBIter;
friend class DOUBLEDLLISTFIter;
friend class DOUBLEDLLISTBIter;
friend istream& operator>>(istream& in,DOUBLE_CLLIST& A)
{A.grab(in); return(in);};
friend istream& operator>>(istream& in,DOUBLE_CLLIST* A)
{A->grab(in); return(in);};
friend ostream& operator<<(ostream& out,const DOUBLE_CLLIST& A)
{A.print(out); return(out);};
friend ostream& operator<<(ostream& out,const DOUBLE_CLLIST* A)
{A->print(out); return(out);};
public:
DOUBLE_CLLIST(char *name_in);
DOUBLE_CLLIST(DOUBLE_CLLIST&);
~DOUBLE_CLLIST();
DOUBLE_CLLIST& operator=(const DOUBLE_CLLIST&);
// agents
int is_empty(){return(head==NULL);};
void delete_element(DOUBLE target_key);
void search_element(DOUBLE search_key);
void build_list(DOUBLE *A,int size);
int get_number_elements();
void insert_after(DOUBLE before_element,DOUBLE new_element);
void insert_before(DOUBLE after_element,DOUBLE new_element);
void mergesort();
istream& grab(istream& in);
ostream& print(ostream& out) const;
protected:
char *name;
DOUBLE_DL_CELL *head;
DOUBLE_DL_CELL *end;
DOUBLE_DL_CELL* get_element_address(DOUBLE search_key);
DOUBLE_DL_CELL* get_before_element_address(DOUBLE search_key);
DOUBLE_DL_CELL* get_after_element_address(DOUBLE search_key);
};