首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。 这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以
首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。
这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以由linked list 继承出ordered linked list。
言归正传, 出现问题的代码如下:
linkedlist.h 文件如下:
#ifndef H_LinkedListType#define H_LinkedListType#include #include using namespace std;//Definition of the nodetemplate struct nodeType{ Type info; nodeType *link;};template class linkedListIterator{public: linkedListIterator(); //Default constructor //Postcondition: current = NULL; linkedListIterator(nodeType *ptr); //Constructor with a parameter. //Postcondition: current = ptr; Type operator*(); //Function to overload the dereferencing operator *. //Postcondition: Returns the info contained in the node. linkedListIterator operator++(); //Overload the pre-increment operator. //Postcondition: The iterator is advanced to the next // node. bool operator==(const linkedListIterator& right) const; //Overload the equality operator. //Postcondition: Returns true if this iterator is equal to // the iterator specified by right, // otherwise it returns the value false. bool operator!=(const linkedListIterator& right) const; //Overload the not equal to operator. //Postcondition: Returns true if this iterator is not // equal to the iterator specified by // right; otherwise it returns the value // false.private: nodeType *current; //pointer to point to the current //node in the linked list};template linkedListIterator::linkedListIterator(){ current = NULL;}template linkedListIterator:: linkedListIterator(nodeType *ptr){ current = ptr;}template Type linkedListIterator::operator*(){ return current->info;}template linkedListIterator linkedListIterator::operator++(){ current = current->link; return *this;}template bool linkedListIterator::operator== (const linkedListIterator& right) const{ return (current == right.current);}template bool linkedListIterator::operator!= (const linkedListIterator& right) const{ return (current != right.current);}//***************** class linkedListType ****************template class linkedListType{public: const linkedListType& operator= (const linkedListType&); //Overload the assignment operator. void initializeList(); //Initialize the list to an empty state. //Postcondition: first = NULL, last = NULL, count = 0; bool isEmptyList() const; //Function to determine whether the list is empty. //Postcondition: Returns true if the list is empty, // otherwise it returns false. void print() const; //Function to output the data contained in each node. //Postcondition: none int length() const; //Function to return the number of nodes in the list. //Postcondition: The value of count is returned. void destroyList(); //Function to delete all the nodes from the list. //Postcondition: first = NULL, last = NULL, count = 0; Type front() const; //Function to return the first element of the list. //Precondition: The list must exist and must not be // empty. //Postcondition: If the list is empty, the program // terminates; otherwise, the first // element of the list is returned. Type back() const; //Function to return the last element of the list. //Precondition: The list must exist and must not be // empty. //Postcondition: If the list is empty, the program // terminates; otherwise, the last // element of the list is returned. virtual bool search(const Type& searchItem) const = 0; //Function to determine whether searchItem is in the list. //Postcondition: Returns true if searchItem is in the // list, otherwise the value false is // returned. virtual void insertFirst(const Type& newItem) = 0; //Function to insert newItem at the beginning of the list. //Postcondition: first points to the new list, newItem is // inserted at the beginning of the list, // last points to the last node in the list, // and count is incremented by 1. virtual void insertLast(const Type& newItem) = 0; //Function to insert newItem at the end of the list. //Postcondition: first points to the new list, newItem // is inserted at the end of the list, // last points to the last node in the list, // and count is incremented by 1. virtual void deleteNode(const Type& deleteItem) = 0; //Function to delete deleteItem from the list. //Postcondition: If found, the node containing // deleteItem is deleted from the list. // first points to the first node, last // points to the last node of the updated // list, and count is decremented by 1. linkedListIterator begin(); //Function to return an iterator at the begining of the //linked list. //Postcondition: Returns an iterator such that current is // set to first. linkedListIterator end(); //Function to return an iterator one element past the //last element of the linked list. //Postcondition: Returns an iterator such that current is // set to NULL. linkedListType(); //default constructor //Initializes the list to an empty state. //Postcondition: first = NULL, last = NULL, count = 0; linkedListType(const linkedListType& otherList); //copy constructor ~linkedListType(); //destructor //Deletes all the nodes from the list. //Postcondition: The list object is destroyed.protected: int count; //variable to store the number of //elements in the list nodeType *first; //pointer to the first node of the list nodeType *last; //pointer to the last node of the listprivate: void copyList(const linkedListType& otherList); //Function to make a copy of otherList. //Postcondition: A copy of otherList is created and // assigned to this list.};template bool linkedListType::isEmptyList() const{ return(first == NULL);}template linkedListType::linkedListType() //default constructor{ first = NULL; last = NULL; count = 0;}template void linkedListType::destroyList(){ nodeType *temp; //pointer to deallocate the memory //occupied by the node while (first != NULL) //while there are nodes in the list { temp = first; //set temp to the current node first = first->link; //advance first to the next node delete temp; //deallocate the memory occupied by temp } last = NULL; //initialize last to NULL; first has already //been set to NULL by the while loop count = 0;}template void linkedListType::initializeList(){ destroyList(); //if the list has any nodes, delete them}template void linkedListType::print() const{ nodeType *current; //pointer to traverse the list current = first; //set current so that it points to //the first node while (current != NULL) //while more data to print { cout <info <link; }}//end printtemplate int linkedListType::length() const{ return count;} //end lengthtemplate Type linkedListType::front() const{ assert(first != NULL); return first->info; //return the info of the first node}//end fronttemplate Type linkedListType::back() const{ assert(last != NULL); return last->info; //return the info of the last node}//end backtemplate linkedListIterator linkedListType::begin(){ linkedListIterator temp(first); return temp;}template linkedListIterator linkedListType::end(){ linkedListIterator temp(NULL); return temp;}template void linkedListType::copyList (const linkedListType& otherList){ nodeType *newNode; //pointer to create a node nodeType *current; //pointer to traverse the list if (first != NULL) //if the list is nonempty, make it empty destroyList(); if (otherList.first == NULL) //otherList is empty { first = NULL; last = NULL; count = 0; } else { current = otherList.first; //current points to the //list to be copied count = otherList.count; //copy the first node first = new nodeType; //create the node first->info = current->info; //copy the info first->link = NULL; //set the link field of //the node to NULL last = first; //make last point to the //first node current = current->link; //make current point to //the next node //copy the remaining list while (current != NULL) { newNode = new nodeType; //create a node newNode->info = current->info; //copy the info newNode->link = NULL; //set the link of //newNode to NULL last->link = newNode; //attach newNode after last last = newNode; //make last point to //the actual last node current = current->link; //make current point //to the next node }//end while }//end else}//end copyListtemplate linkedListType::~linkedListType() //destructor{ destroyList();}//end destructortemplate linkedListType::linkedListType (const linkedListType& otherList){ first = NULL; copyList(otherList);}//end copy constructor //overload the assignment operatortemplate const linkedListType& linkedListType::operator= (const linkedListType& otherList){ if (this != &otherList) //avoid self-copy { copyList(otherList); }//end else return *this;}#endif
unorderedLinkedList.h文件如下:
#ifndef H_UnorderedLinkedList#define H_UnorderedLinkedList#include "linkedList.h"using namespace std;template class unorderedLinkedList: public linkedListType{public: bool search(const Type& searchItem) const; //Function to determine whether searchItem is in the list. //Postcondition: Returns true if searchItem is in the // list, otherwise the value false is // returned. void insertFirst(const Type& newItem); //Function to insert newItem at the beginning of the list. //Postcondition: first points to the new list, newItem is // inserted at the beginning of the list, // last points to the last node in the // list, and count is incremented by 1. void insertLast(const Type& newItem); //Function to insert newItem at the end of the list. //Postcondition: first points to the new list, newItem // is inserted at the end of the list, // last points to the last node in the // list, and count is incremented by 1. void deleteNode(const Type& deleteItem); //Function to delete deleteItem from the list. //Postcondition: If found, the node containing // deleteItem is deleted from the list. // first points to the first node, last // points to the last node of the updated // list, and count is decremented by 1.};template bool unorderedLinkedList:: search(const Type& searchItem) const{ nodeType *current; //pointer to traverse the list bool found = false; current = first; //set current to point to the first //node in the list while (current != NULL && !found) //search the list if (current->info == searchItem) //searchItem is found found = true; else current = current->link; //make current point to //the next node return found;}//end searchtemplate void unorderedLinkedList::insertFirst(const Type& newItem){ nodeType *newNode; //pointer to create the new node newNode = new nodeType; //create the new node newNode->info = newItem; //store the new item in the node newNode->link = this -> first; //insert newNode before first first = newNode; //make first point to the //actual first node count++; //increment count if (last == NULL) //if the list was empty, newNode is also //the last node in the list last = newNode;}//end insertFirsttemplate void unorderedLinkedList::insertLast(const Type& newItem){ nodeType *newNode; //pointer to create the new node newNode = new nodeType; //create the new node newNode->info = newItem; //store the new item in the node newNode->link = NULL; //set the link field of newNode //to NULL if ( first == NULL) //if the list is empty, newNode is //both the first and last node { first = newNode; last = newNode; count++; //increment count } else //the list is not empty, insert newNode after last { last->link = newNode; //insert newNode after last last = newNode; //make last point to the actual //last node in the list count++; //increment count }}//end insertLasttemplate void unorderedLinkedList::deleteNode(const Type& deleteItem){ nodeType *current; //pointer to traverse the list nodeType *trailCurrent; //pointer just before current bool found; if (first == NULL) //Case 1; the list is empty. cout << "Cannot delete from an empty list." <info == deleteItem) //Case 2 { current = first; first = first->link; count--; if (first == NULL) //the list has only one node last = NULL; delete current; } else //search the list for the node with the given info { found = false; trailCurrent = first; //set trailCurrent to point //to the first node current = first->link; //set current to point to //the second node while (current != NULL && !found) { if (current->info != deleteItem) { trailCurrent = current; current = current-> link; } else found = true; }//end while if (found) //Case 3; if found, delete the node { trailCurrent->link = current->link; this -> count--; if (last == current) //node to be deleted //was the last node last = trailCurrent; //update the value //of last delete current; //delete the node from the list } else cout << "The item to be deleted is not in " << "the list." << endl; }//end else }//end else}//end deleteNode#endif
主程序如下main.cpp:
//This program tests various operation of a linked list//34 62 21 90 66 53 88 24 10 -999#include #include "unorderedLinkedList.h"using namespace std;int main(){ unorderedLinkedList list1, list2; //Line 1 int num; //Line 2 cout << "Line 3: Enter integers ending " << "with -999" <> num; //Line 4 while (num != -999) //Line 5 { list1.insertLast(num); //Line 6 cin >> num; //Line 7 } cout << endl; //Line 8 cout << "Line 9: list1: "; //Line 9 list1.print(); //Line 10 cout << endl; //Line 11 cout << "Line 12: Length of list1: " << list1.length() << endl; //Line 12 list2 = list1; //test the assignment operator Line 13 cout << "Line 16: list2: "; //Line 14 list2.print(); //Line 15 cout << endl; //Line 16 cout << "Line 17: Length of list2: " << list2.length() << endl; //Li<strong>本文来源gaodai#ma#com搞@@代~&码*网2</strong>ne 17 cout << "Line 18: Enter the number to be " <> num; //Line 19 cout << endl; //Line 20 list2.deleteNode(num); //Line 21 cout << "Line 22: After deleting " << num << " list2: " << endl; //Line 22 list2.print(); //Line 23 cout << endl; //Line 24 cout << "Line 25: Length of list2: " << list2.length() << endl; //Line 25 cout << endl << "Line 26: Output list1 " << "using an iterator" << endl; //LIne 26 linkedListIterator it; //Line 27 for (it = list1.begin(); it != list1.end(); ++it) //Line 28 cout << *it << " "; //Line 29 cout << endl; //Line 30 return 0;}
编译结果error message 如下: