|
//DSortedList08.cpp //date: 11/25/2002 //author: AOU //Project#6 Due 11/20/2002 //Dynamic sorted list //////////////////////////////////////////////////////////// // Include files //////////////////////////////////////////////////////////// #include<iostream.h> #include<math.h> #include<stdlib.h> #include<time.h> //////////////////////////////////////////////////////////// // Constants //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// const int MAX_SIZE = 20; //maximum entries allowed in a list const int UNDEFINED = -9999; const int MAX_VALUE = 50; const int TEST_COUNT = 20; const int INFINITY = 32000; void testInsert(void); void testConstructorN(void); void testConstructorChar(void); void testRemoveAll(void); void testDestructor(void); void testAdd(void); //project#6 Due 11/20/2002 void testDisplayRev(void); void testShuffle(void); void testSortBubble(void); const int sValues[] = {55, 12, 34, 71, 98, 45, 20}; const int S_SIZE = sizeof(sValues)/sizeof(sValues[0]); //////////////////////////////////////////////////////////// //class CNode //////////////////////////////////////////////////////////// class CNode { private: int m_key; // int age; // char name[20]; // char socsec[10]; CNode *m_next; public: CNode(void); //2002.10.30 void display(void); //2002.10.30 CNode(int x); //2002.11.04 CNode(char ch); //2002.11.04 //... friend class CDSortedList; friend ostream & operator << //2002.11.13 (ostream & bob, const CDSortedList &aList); friend ostream & operator << //2002.11.15 (ostream & bob, const CNode &aNode); }; //////////////////////////////////////////////////////////// //class CDSortedList //////////////////////////////////////////////////////////// class CDSortedList { private: int m_count; CNode *m_first; void init(void); //should only be called by a constructor public: CDSortedList(void); //2002.10.30 void display(void); //2002.10.30 bool insert(int x); //2002.11.04 CDSortedList(int n); //2002.11.06 CDSortedList(char ch);//2002.11.06 void removeAll(void); //2002.11.08 all except dummy values ~CDSortedList(void); //2002.11.08 //project#6 Due 11/20/2002 //Submit well-documented source code and the output //The resulting list should be sorted with unique values friend void add(const CDSortedList &aList, const CDSortedList &bList, CDSortedList &cList); friend ostream & operator << //2002.11.13 (ostream & bob, const CDSortedList &aList); CNode* addByPos(int pos); //2002.11.15 void displayRev(void); // 2002.11.15 void shuffle(void); // 2002.11.18 void analyze(void); // 2002.11.18 void sortBubble(void); //2002.11.25 bool isSorted(void) const; //2002.11.25 }; //////////////////////////////////////////////////////////// //void main(void) //////////////////////////////////////////////////////////// void main(void) { srand(time(NULL)); // testInsert(); //testConstructorN(); //testConstructorChar(); //testRemoveAll(); //testDestructor(); //testAdd(); // testDisplayRev(); //testShuffle(); testSortBubble(); } //////////////////////////////////////////////////////////// // void CDSortedList::sortBubble(void) //////////////////////////////////////////////////////////// void CDSortedList::sortBubble(void) { if (this->m_count <= 1) return; int temp; CNode *ip; bool sorted = false; while (!sorted) { sorted = true; for (ip = this->m_first->m_next; ip->m_next->m_next != NULL; ip = ip->m_next) { if (ip->m_key > ip->m_next->m_key) { temp = ip->m_key; ip->m_key = ip->m_next->m_key; ip->m_next->m_key = temp; sorted = false; } } } } //////////////////////////////////////////////////////////// // isSorted(void) //////////////////////////////////////////////////////////// bool CDSortedList::isSorted(void) const { if (this->m_count <= 1) return true; for (CNode*ip = this->m_first->m_next; ip->m_next->m_next != NULL; ip = ip->m_next) if (ip->m_key > ip->m_next->m_key) return false; return true; } //////////////////////////////////////////////////////////// // testSortBubble2(void) //////////////////////////////////////////////////////////// void testSortBubble(void) { cout << "testSortBubble\n"; cout << "==============\n"; for (int i=1; i<=10; i++) { CDSortedList myList('r'); cout << "Original list\n"; cout << myList; if (myList.isSorted()) cout << "List is SORTED\n"; else cout << "List is NOT SORTED\n"; myList.shuffle(); cout << "Shuffled list\n"; cout << myList; if (myList.isSorted()) cout << "List is SORTED\n"; else cout << "List is NOT SORTED\n"; myList.sortBubble(); cout << "After sortBubble\n"; cout << myList; if (myList.isSorted()) cout << "List is SORTED\n"; else cout << "List is NOT SORTED\n"; cout << "-------------------\n"; } } //////////////////////////////////////////////////////////// // void CDSortedList::analyze(void) //////////////////////////////////////////////////////////// void CDSortedList::analyze(void) { int countUp=0, countDn=0, countEq=0; for (int i=0; i<this->m_count-1; i++) { CNode *p1, *p2; p1 = this->addByPos(i); p2 = this->addByPos(i+1); if (p1->m_key < p2->m_key) countUp++; if (p1->m_key > p2->m_key) countDn++; if (p1->m_key == p2->m_key) countEq++; } cout << "Count Up = " << countUp << endl; cout << "Count Dn = " << countDn << endl; cout << "Count Eq = " << countEq << endl; } //////////////////////////////////////////////////////////// // void CDSortedList::shuffle(void) //////////////////////////////////////////////////////////// void CDSortedList::shuffle(void) { /* do the following count*100 times randomly pick two elements swap their values */ for (int i=0; i<this->m_count*100; i++) { int pos1, pos2; pos1 = rand()%this->m_count; pos2 = rand()%this->m_count; CNode *p1, *p2; p1 = this->addByPos(pos1); p2 = this->addByPos(pos2); int temp = p1->m_key; p1->m_key = p2->m_key; p2->m_key = temp; } } //////////////////////////////////////////////////////////// // void testShuffle(void) //////////////////////////////////////////////////////////// void testShuffle(void) { cout << "testShuffle\n"; cout << "===========\n"; for (int i=0; i<TEST_COUNT; i++) { CDSortedList* myListPtr = new CDSortedList('r'); cout << *myListPtr; myListPtr->analyze(); cout << "After shuffle\n"; myListPtr->shuffle(); cout << *myListPtr; myListPtr->analyze(); delete myListPtr; cout << "------------------------\n"; } } //////////////////////////////////////////////////////////// // void CDSortedList::displayRev(void) //////////////////////////////////////////////////////////// void CDSortedList::displayRev(void) { cout << "SortedRevr[" << this->m_count << "]= "; for (int i = this->m_count-1; i>=0; i--) { CNode *q = this->addByPos(i); cout << *q; } cout << endl; } //////////////////////////////////////////////////////////// // void testDisplayRev(void) //////////////////////////////////////////////////////////// void testDisplayRev(void) { for (int i=0; i<TEST_COUNT; i++) { CDSortedList myList('r'); cout << myList; myList.displayRev(); cout << "------------------------\n"; } } //////////////////////////////////////////////////////////// // CNode* CDSortedList::addByPos(int pos) //////////////////////////////////////////////////////////// CNode* CDSortedList::addByPos(int pos) { /* Possibilities: Empty list pos < 0 pos >= m_count pos >=0 and pos <m_count */ if (this->m_count == 0) return NULL; if (pos < 0) return NULL; if (pos >= this->m_count) return NULL; CNode *p; p = this->m_first->m_next; while (pos > 0) { pos--; p = p->m_next; } return p; } //////////////////////////////////////////////////////////// // add //////////////////////////////////////////////////////////// void add(const CDSortedList &aList, const CDSortedList &bList, CDSortedList &cList) { //put in c distinct values from a and b //a={1, 3, 5, 5}, b={3, 3, 4, 6, 6} then //c={1, 3, 4, 5, 6} cout << "NOT IMPLEMENTED\n"; } //////////////////////////////////////////////////////////// // testAdd //////////////////////////////////////////////////////////// void testAdd(void) { cout << "testAdd\n"; cout << "-------\n"; int m1 = rand()%(MAX_SIZE/2); int m2 = rand()%(MAX_SIZE/2); for (int i=0; i<TEST_COUNT; i++) { CDSortedList aL(m1), bL(m2), cL('r'); cout << "aL = " << aL; cout << "bL = " << bL; cout << "cL = " << cL; add(aL, bL, cL); cout << "After add(aL, bL, cL);\n"; cout << "aL = " << aL; cout << "bL = " << bL; cout << "cL = " << cL; cout <<"=================\n"; } } //////////////////////////////////////////////////////////// // operator << //////////////////////////////////////////////////////////// ostream & operator << (ostream & bob, const CNode &aNode) { bob << aNode.m_key << ' '; return bob; } //////////////////////////////////////////////////////////// // operator << //////////////////////////////////////////////////////////// ostream & operator << (ostream & bob, const CDSortedList &aList) { bob << "SortedList[" << aList.m_count << "]= "; CNode *p; p = aList.m_first->m_next; while (p->m_next != NULL) { bob << *p; p = p->m_next; } bob << endl; return bob; } //////////////////////////////////////////////////////////// // CDSortedList::~CDSortedList(void) //////////////////////////////////////////////////////////// CDSortedList::~CDSortedList(void) { cout << "Destructor was called\n"; CNode *cia1, *cia2; cia1 = this->m_first; while (cia1 != NULL) { cia2 = cia1->m_next; delete cia1; cia1 = cia2; } } //////////////////////////////////////////////////////////// // void testDestructor(void) //////////////////////////////////////////////////////////// void testDestructor(void) { cout << "testDestructor\n"; cout << "==============\n"; CDSortedList *mp1 = new CDSortedList('c'); mp1->display(); delete mp1; cout << "-----------------\n"; for (int i=0; i<TEST_COUNT; i++) { CDSortedList *mp1 = new CDSortedList('r'); mp1->display(); delete mp1; cout << "-----------------\n"; } } //////////////////////////////////////////////////////////// // void CDSortedList::removeAll(void) //////////////////////////////////////////////////////////// void CDSortedList::removeAll(void) { CNode *cia1, *cia2; cia1 = this->m_first; while (cia1 != NULL) { cia2 = cia1->m_next; delete cia1; cia1 = cia2; } this->init(); } //////////////////////////////////////////////////////////// // void testRemoveAll(void) //////////////////////////////////////////////////////////// void testRemoveAll(void) { cout << "testRemoveAll\n"; cout << "=============\n"; CDSortedList myList('c'); myList.display(); myList.removeAll(); myList.display(); cout << "-----------------\n"; for (int i=0; i<TEST_COUNT; i++) { CDSortedList myList('r'); myList.display(); myList.removeAll(); myList.display(); cout << "-----------------\n"; } } //////////////////////////////////////////////////////////// // void CDSortedList::init(void) //////////////////////////////////////////////////////////// void CDSortedList::init(void) { CNode *p1 = new CNode; CNode *p2 = new CNode; this->m_first = p1; p1->m_next = p2; p2->m_next = NULL; p1->m_key = -INFINITY; p2->m_key = +INFINITY; this->m_count = 0; } //////////////////////////////////////////////////////////// // CDSortedList::CDSortedList(char ch) //////////////////////////////////////////////////////////// CDSortedList::CDSortedList(char ch) { this->init(); if (('r' == ch) || ('R' == ch)) { //insert random number of random values to the list int n = rand()%(MAX_SIZE+1); for (int i=0; i<n; i++) this->insert(rand()%(MAX_VALUE+1)); } if (('c' == ch) || ('C' == ch)) { //insert random number of random values to the list for (int i=0; i<S_SIZE; i++) this->insert(sValues[i]); } } //////////////////////////////////////////////////////////// // void testConstructorChar(void) //////////////////////////////////////////////////////////// void testConstructorChar(void) { cout << "testConstructorChar\n"; cout << "===================\n"; CDSortedList myList('c'); myList.display(); cout << "-----------------\n"; for (int i=0; i<TEST_COUNT; i++) { CDSortedList myList('r'); myList.display(); cout << "-----------------\n"; } } //////////////////////////////////////////////////////////// // CDSortedList::CDSortedList(int n) //////////////////////////////////////////////////////////// CDSortedList::CDSortedList(int n) { this->init(); //insert n random values to the list for (int i=0; i<n; i++) this->insert(rand()%(MAX_VALUE+1)); } //////////////////////////////////////////////////////////// // void testConstructorN(void) //////////////////////////////////////////////////////////// void testConstructorN(void) { cout << "testConstructorN\n"; cout << "================\n"; for (int i=0; i<TEST_COUNT; i++) { CDSortedList myList(rand()%MAX_SIZE); myList.display(); } } //////////////////////////////////////////////////////////// // bool CDSortedList::insert(int x) //////////////////////////////////////////////////////////// bool CDSortedList::insert(int x) { if (this->m_count >= MAX_SIZE) return false; CNode *p, *p1, *p2; p = new CNode(x); if (NULL == p) return false; p1 = this->m_first; p2 = p1->m_next; while(true) { if ((x >= p1->m_key) && (x <= p2->m_key)) { p1->m_next = p; p->m_next = p2; this->m_count++; return true; } else { p1 = p1->m_next; p2 = p1->m_next; } } } void testInsert(void) { cout << "testInsert\n"; cout << "==========\n"; CDSortedList myList; myList.display(); for (int i=0; i<10; i++) { int x = rand()%MAX_VALUE; myList.insert(x); cout << "After inserting " << x << endl; myList.display(); } } //////////////////////////////////////////////////////////// //void CDSortedList::display(void) //////////////////////////////////////////////////////////// void CDSortedList::display(void) { cout << "List[" << this->m_count << "] = \n"; CNode *p; p = this->m_first; while (p != NULL) { p->display(); p = p->m_next; cout << endl; } cout << endl; } //////////////////////////////////////////////////////////// //CDSortedList::CDSortedList(void) //////////////////////////////////////////////////////////// CDSortedList::CDSortedList(void) { /* create two nodes one pointed to by p1, other pointed to by p2 make first point to p1 make p1 point to p2 make p2 point to nothing put -infin in p1 node put +infin in p2 node set count = 0 */ this->init(); } //////////////////////////////////////////////////////////// // CNode::CNode(char ch) //////////////////////////////////////////////////////////// CNode::CNode(char ch) { if (('r' == ch) || ('R' == ch)) { this->m_key = rand()%(MAX_VALUE+1); this->m_next = NULL; } else { this->m_key = UNDEFINED; this->m_next = NULL; } } //////////////////////////////////////////////////////////// // CNode::CNode(int x) //////////////////////////////////////////////////////////// CNode::CNode(int x) { this->m_key = x; this->m_next = NULL; } //////////////////////////////////////////////////////////// //CNode::CNode(void) //////////////////////////////////////////////////////////// CNode::CNode(void) { this->m_key = UNDEFINED; this->m_next = NULL; } //////////////////////////////////////////////////////////// //void CNode::display(void) //////////////////////////////////////////////////////////// void CNode::display(void) { //cout << "["; //cout << this << " "; cout << this->m_key << " "; //cout << this->m_next << "] "; } /* SAMPLE RUN: testSortBubble ============== Original list SortedList[19]= 2 2 8 9 16 17 17 27 27 27 30 35 36 37 41 41 43 44 45 List is SORTED Shuffled list SortedList[19]= 30 27 16 37 45 44 35 8 27 36 2 43 2 41 27 41 17 17 9 List is NOT SORTED After sortBubble SortedList[19]= 2 2 8 9 16 17 17 27 27 27 30 35 36 37 41 41 43 44 45 List is SORTED ------------------- Destructor was called Original list SortedList[0]= List is SORTED Shuffled list SortedList[0]= List is SORTED After sortBubble SortedList[0]= List is SORTED ------------------- Destructor was called Original list SortedList[11]= 2 3 4 6 6 14 22 29 44 46 48 List is SORTED Shuffled list SortedList[11]= 29 14 4 6 48 6 46 3 44 22 2 List is NOT SORTED After sortBubble SortedList[11]= 2 3 4 6 6 14 22 29 44 46 48 List is SORTED ------------------- Destructor was called Original list SortedList[2]= 4 30 List is SORTED Shuffled list SortedList[2]= 30 4 List is NOT SORTED After sortBubble SortedList[2]= 4 30 List is SORTED ------------------- Destructor was called Original list SortedList[0]= List is SORTED Shuffled list SortedList[0]= List is SORTED After sortBubble SortedList[0]= List is SORTED ------------------- Destructor was called Original list SortedList[0]= List is SORTED Shuffled list SortedList[0]= List is SORTED After sortBubble SortedList[0]= List is SORTED ------------------- Destructor was called Original list SortedList[0]= List is SORTED Shuffled list SortedList[0]= List is SORTED After sortBubble SortedList[0]= List is SORTED ------------------- Destructor was called Original list SortedList[4]= 3 39 42 49 List is SORTED Shuffled list SortedList[4]= 49 42 3 39 List is NOT SORTED After sortBubble SortedList[4]= 3 39 42 49 List is SORTED ------------------- Destructor was called Original list SortedList[15]= 0 5 5 9 13 14 16 17 17 22 24 28 35 35 45 List is SORTED Shuffled list SortedList[15]= 35 14 17 0 5 16 5 35 28 13 17 24 22 45 9 List is NOT SORTED After sortBubble SortedList[15]= 0 5 5 9 13 14 16 17 17 22 24 28 35 35 45 List is SORTED ------------------- Destructor was called Original list SortedList[10]= 14 22 23 24 29 33 40 42 44 50 List is SORTED Shuffled list SortedList[10]= 42 14 40 22 50 24 29 33 23 44 List is NOT SORTED After sortBubble SortedList[10]= 14 22 23 24 29 33 40 42 44 50 List is SORTED ------------------- Destructor was called Press any key to continue */ |