.:Pudge:. 0 Light Poster

I tried looking at the other examples on the site, but I still get segmentation errors whenever I run the file. I need help with the constructors in bold in the "List" class.

#include <iostream>
using std::cout;
using std::endl;

// forward declaration of List class, so ListElement can make 
// it a friend.  NOTE: If List is a friend of ListElement, that
// means that the List class has access to the private members
// of the ListElement class, but no one else does (besides ListElement
// itself). 

class List;
class ListIterator;

class ListElement {
 friend class List;
 friend class ListIterator;
 public:
 ListElement(): next(this), prev(this), isHeader(true) {}
 ListElement(int i): item(i), isHeader(false) {}
 ~ListElement() {}  // default destructor
 private:
  int item;
  ListElement *next;    
  ListElement *prev;    
  bool isHeader;
};

class ListIterator {
 friend class List;
 public:
  ListIterator() : currentPtr(NULL) { }
  ListIterator operator++(){
               this->currentPtr->prev=this->currentPtr;
               this->currentPtr->next=this->currentPtr->next->next;              
               return *this;
               }  // advance iterator to the next list node; return value is iterator *after* advancing  
  ListIterator operator--(){
               this->currentPtr->next=this->currentPtr;
               this->currentPtr->prev=this->currentPtr->prev->prev;
               return *this;
               }  // advance iterator to the previous list node; return value is iterator *after* advancing
  ListIterator operator++(int){
                this->currentPtr->prev=this->currentPtr;
               this->currentPtr->next=this->currentPtr->next->next;              
               return *this;
               }  // advance iterator to the next list node; return value is iterator *before* advancing
  ListIterator operator--(int){
               this->currentPtr->next=this->currentPtr;
               this->currentPtr->prev=this->currentPtr->prev->prev;
               return *this;
               }  // advance iterator to the previous list node; return value is iterator *before* advancing
  int operator*(){
       if(currentPtr->isHeader){
                printf("error\n");
                exit(1); 
                }
        return currentPtr->item;                
      } // return contents pointed to by iterator; print "error\n"
        // and terminate program if iterator refers to header node
 private:
  ListElement *currentPtr;
};

class List {
  public:
    List(){
           listSize=0;
           }   // creates an empty list
    ~List(){
	ListIterator *nodePtr, *nextNodePtr;
	nodePtr->currentPtr = head;
	while (nodePtr->currentPtr != NULL)
	{
	nextNodePtr->currentPtr = nodePtr->currentPtr->next;
	delete nodePtr;
	nodePtr = nextNodePtr;
	}      
            }  // *must* deallocate the entire list
    [B]List(const List &L){
       ListIterator lTemp;
	int value;          
       lTemp.currentPtr=L.head;
       while(lTemp.currentPtr->next!=L.head){
               lTemp.currentPtr=lTemp.currentPtr->next;
               ListElement *temp= new ListElement();
		 temp=lTemp.currentPtr;
               this->head->next=temp;
	        this->head->prev=temp;
		 temp->next=this->head;
		 temp->prev=this->head; 
               listSize++;
               }          
               }  // copy constructor (*must* be a deep copy)
    List & operator =(List &L){
		

         }[/B]  // *must* (deep) copy list, and must avoid memory leak

    // these are functions to set and test the list iterator
    void SetStartList(ListIterator &p) {p.currentPtr = head->next;}
    void SetEndList(ListIterator &p) {p.currentPtr = head->prev;}
    bool IsUndefined(ListIterator p) {return (p.currentPtr == head);}
    bool AtEndList(ListIterator p) {return (p.currentPtr == head);}
    bool AtStartList(ListIterator p) {return (p.currentPtr == head);}
    bool AtFirstNode(ListIterator p) {return (p.currentPtr == head->next);}
    bool AtLastNode(ListIterator p) {return (p.currentPtr == head->prev);}
    // Insert integer at the beginning of the list  
    void Prepend(int it){
         ListIterator p;    
	  p.currentPtr=this->head;	     
         ListElement *temp= new ListElement();  
         temp->item=it;
		      if(this->IsEmpty()){
                            this->head->next=temp;
				this->head->prev=temp;
				temp->next=this->head;
				temp->prev=this->head;   
                               }   
            else{
                    temp->prev=p.currentPtr;
                    temp->next=p.currentPtr->next;
                    p.currentPtr->next->prev=temp;
                    p.currentPtr->next=temp;
                    p.currentPtr=temp;
                    }

                 listSize++;
}
    // Insert integer at the end of the list
    void Append(int it){
            ListIterator p;
            p.currentPtr=this->head;
	     ListElement *temp= new ListElement();  
            temp->item=it;
		if(this->IsEmpty()){
                            this->head->next=temp;
				this->head->prev=temp;
				temp->next=this->head;
				temp->prev=this->head;   
                               }         
            else{ 
                    temp->next=p.currentPtr;
                    temp->prev=p.currentPtr->prev;
                    p.currentPtr->prev->next=temp;
                    p.currentPtr->prev=temp;
                    p.currentPtr=temp;
                    }
	 
                 listSize++;
}
    // Remove first integer from list, return through first parameter.
    // Success is set to true if original list is nonempty, false if empty
    void Pop(int &it, bool &success){
          if(IsEmpty()){
                             success=false;         
                   }  
          else{
               success=true;
               ListElement *temp= new ListElement(); 
               temp=this->head->next;
               it=temp->item;
               temp->next->prev=this->head;
               this->head->next=temp->next;
               temp->prev=NULL;
	           temp->next=NULL;
               }         
		listSize--;
          }    
    // Remove last integer from list, return through first parameter.
    // Success is set to true if original list is nonempty, false if empty
    void Pull(int &it, bool &success){
          if(IsEmpty()){
                             success=false;         
                   }  
          else{
               success=true;
               ListElement *temp= new ListElement(); 
               temp=this->head->prev;
               it=temp->item;
               temp->prev->next=this->head;
               this->head->prev=temp->prev;
               temp->prev=NULL;
	           temp->next=NULL;
               } 
		listSize--;        
          }      
    // Get first integer on list, return through first parameter
    // Success is set to true if original list is nonempty, false if empty
    void First(int &it, bool &success){
                   if(IsEmpty()){
                             success=false;         
                   }       
                   else{    
                   success=true;          
                   ListElement *temp= new ListElement();
                   temp=head->next;
                   it=temp->item;        
                   }
}
    // Get last integer on list, return through first parameter
    // Success is set to true if original list is nonempty, false if empty
    void Last(int &it, bool &success){
            if(IsEmpty()){
                             success=false;         
                   }       
                   else{    
                   success=true;          
                   ListElement *temp= new ListElement();
                   temp=head->prev;
                   it=temp->item;        
                   }
}
    // insert integer before list element referred to by p
    void InsertBefore(int it, ListIterator p){ //may need to check if 'p' is NULL
         ListElement *temp= new ListElement();  
         temp->item=it;
         if(p.currentPtr->prev==head){
                temp->prev=head;
                head->next=temp;
                temp->next=p.currentPtr;
                p.currentPtr->prev=temp;
                }   
         else{      
               temp->next=p.currentPtr->next;
               p.currentPtr->next->prev=temp;
               temp->prev=p.currentPtr;
               p.currentPtr->next=temp;
         }
         listSize++;
}
    // insert integer after list element referred to by p
    void InsertAfter(int it, ListIterator p){ //may need to check if 'p' is NULL
         ListElement *temp= new ListElement();  
         temp->item=it;
         if(p.currentPtr->next==head){
                temp->next=head;
                head->prev=temp;
                temp->prev=p.currentPtr;
                p.currentPtr->next=temp;
                }   
         else{        
                p.currentPtr->next->prev=temp;
                temp->next=p.currentPtr->next;
                p.currentPtr->next=temp;
                temp->prev=p.currentPtr;
         }
         listSize++;
}
    // delete list element referred to by p; print "error\n"
    // and exit if p refers to the header node
    // p is undefined after this function
    void Delete(ListIterator p){
            if(p.currentPtr==head){
                  printf("error\n");
                  exit(1);
                  }                             
            if(p.currentPtr->prev==head){
                 p.currentPtr->next->prev=head;
		         head->next=p.currentPtr->next;
		         p.currentPtr->next=NULL;
		         p.currentPtr->prev=NULL;
	        }
	        else if (p.currentPtr->next==head){
                 p.currentPtr->prev->next=head;
		         head->prev=p.currentPtr->prev;
		         p.currentPtr->prev=NULL;
		         p.currentPtr->next=NULL;
	}
	else
	{
	p.currentPtr->prev->next=p.currentPtr->next;
	p.currentPtr->next->prev=p.currentPtr->prev;
	p.currentPtr->next=NULL;
	p.currentPtr->prev=NULL;
	}
    listSize--;
    }
    // apply function "func" to each element on the list
    void MapFunction(void (*func)(int &)){
         ListIterator p;         
         this->AtFirstNode(p);
         for(int i=0;i<listSize;i++){
                 func(p.currentPtr->item);
                 p.currentPtr=p.currentPtr->next;
                 }
}     
    // returns true if list empty, false otherwise
    bool IsEmpty(){
         if(listSize==0){
         return true;
         }
         return false;
}
    int GetSize() {return listSize;}

    // must print out list elements, one per line
    void Print(){
         ListIterator p;
         p.currentPtr=this->head->next;         
         for(int i=0;i<listSize;i++){
                 cout << p.currentPtr->item << endl;
                 p.currentPtr=p.currentPtr->next;
                 }
}
  private:
    ListElement *head;
    int listSize;
};