# include <iostream.h> # include <stdlib.h> # include <string.h> # include <conio.h> /**************************************************************************///-------------------------- Class Definition --------------------------///**************************************************************************///-------------------------------- Set ---------------------------------//class Set { private: int data; int size; staticint flag; staticintvalue; staticint cur; Set *LeftNode; Set *RightNode; public: Set *RootNode; Set *Location; Set *Parent; Set( ); Set* InsertElement(Set*, constint); void DeleteElementWith0Or1Child( ); void DeleteElementWith2Child( ); void getElementAtPos(Set*, constint); int getElementAt(Set*, constint); void Print(Set*); void Print( ); void PrintAscending(Set*); void PrintDescending(Set*); int Size( ); void Empty( ); int IsEmpty( ); void Read(constchar*); void AddElement(constint); void DeleteElement(constint); void PrintAscending( ); void PrintDescending( ); int IsAnElement(constint); Set Union(const Set set); Set Intersection(const Set set); int IsASubSet(const Set subset); intoperator==(const Set set); Set operator-(const Set set); }; int Set::flag = 1; int Set::value = 0; int Set::cur = 0; /*************************************************************************///------------------------ Function Definitions -----------------------///*************************************************************************///------------------------------- Set( ) ------------------------------// Set::Set( ) { RootNode = NULL; LeftNode = NULL; RightNode = NULL; data = 0; size = 0; } //-------------------------- InsertElement( ) ------------------------// Set* Set::InsertElement(Set *Node, constint data) { if (Node == NULL) { Set *Temp; Temp = new Set; Temp->data = data; Node = Temp; Node->LeftNode = NULL; Node->RightNode = NULL; size ++; } else { Parent = Node; if (data > Node->data) { if (Node->RightNode == NULL) Node->RightNode = InsertElement(Node->RightNode, data); else InsertElement(Node->RightNode, data); } else { if (Node->LeftNode == NULL) Node->LeftNode = InsertElement(Node->LeftNode, data); else InsertElement(Node->LeftNode,data); } } return Node; } //------------------------------ Size( ) -------------------------------//int Set::Size( ) { return size; } //----------------------------- IsEmpty( ) -----------------------------//int Set::IsEmpty( ) { if (RootNode == NULL) return 1; return 0; } //------------------------------- Empty( ) -----------------------------//void Set::Empty( ) { for (int i = size; i >= 1; i--) { int num = getElementAt(RootNode, i); flag = 0; DeleteElement(num); flag = 1; } RootNode = NULL; size = 0; } //--------------------------- getElementAtPos( ) -----------------------//void Set::getElementAtPos(Set *Node, constint req) { cur ++; if (cur == req) value = Node->data; if (Node->LeftNode != NULL) getElementAtPos(Node->LeftNode, req); if (Node->RightNode != NULL) getElementAtPos(Node->RightNode, req); } int Set::getElementAt(Set* Node, constint req) { value = 0; cur = 0; getElementAtPos(Node, req); returnvalue; } //---------------------------------- Print( ) --------------------------//void Set::Print(Set *Node) { if (Node == NULL) { } else { cout << " " << Node->data; if (Node->LeftNode != NULL) Print(Node->LeftNode); if (Node->RightNode != NULL) Print(Node->RightNode); } } void Set::Print( ) { Print(RootNode); } //--------------------------- PrintAscending( ) ------------------------//void Set::PrintAscending(Set *Node) { if (Node==NULL) { } else { if (Node->LeftNode != NULL) PrintAscending(Node->LeftNode); cout << " " << Node->data; if (Node->RightNode != NULL) PrintAscending(Node->RightNode); } } void Set::PrintAscending( ) { PrintAscending(RootNode); } //--------------------------- PrintDescending( ) -----------------------//void Set::PrintDescending(Set *Node) { if (Node == NULL) { } else { if (Node->RightNode != NULL) PrintDescending(Node->RightNode); cout << " " << Node->data; if (Node->LeftNode != NULL) PrintDescending(Node->LeftNode); } } void Set::PrintDescending( ) { PrintDescending(RootNode); } //--------------------------- IsAnElement( ) ---------------------------//int Set::IsAnElement(constint key) { int depth = 1; int left_right = 0; Set *Pointer = NULL; Set *Save = NULL; Location = NULL; Parent = NULL; if (RootNode == NULL) { Location = NULL; Parent = NULL; } elseif (key == RootNode->data) { Location = RootNode; Parent = NULL; depth = 1; } else { if (key < RootNode->data) { Pointer = RootNode->LeftNode; left_right = 1; } else { Pointer = RootNode->RightNode; left_right = 2; } Save = RootNode; while (Pointer != NULL) { depth += 1; if (key == Pointer->data) { Location = Pointer; Parent = Save; break; } elseif(key < Pointer->data) { Save = Pointer; Pointer = Pointer->LeftNode; } elseif(key > Pointer->data) { Save = Pointer; Pointer = Pointer->RightNode; } } } if (flag == 1) { if (Location == NULL) { Parent = NULL; cout << "\n\n*** " << key << " is not found in the Set. " << endl; } elseif (Location != NULL) { if (left_right == 0) cout << "\n\n*** " << key << " is the Root Node." << endl; elseif (left_right == 1) cout << "\n\n*** " << key << " lies at the Left side of the Root Node "; elseif (left_right == 2) cout << "\n\n*** " << key << " lies at the Right side of the Root Node "; if (left_right) cout << "and at the depth level " << depth << endl; } } if (Location != NULL) return 1; return 0; } //-------------------- DeleteElementWith0Or1Child( ) -------------------//void Set::DeleteElementWith0Or1Child( ) { Set *Child; if (Location->LeftNode == NULL && Location->RightNode == NULL) Child = NULL; elseif (Location->LeftNode != NULL) Child = Location->LeftNode; else Child = Location->RightNode; if (Parent != NULL) { if (Location == Parent->LeftNode) Parent->LeftNode = Child; else Parent->RightNode = Child; } else RootNode = Child; } //---------------------- DeleteElementWith2Child( ) --------------------//void Set::DeleteElementWith2Child( ) { Set *Pointer = Location->RightNode; Set *Save = Location; Set *Sucessor; Set *Parent_sucessor; while (Pointer->LeftNode != NULL) { Save = Pointer; Pointer = Pointer->LeftNode; } Sucessor = Pointer; Parent_sucessor = Save; Set *temp_loc = Location; Set *temp_par = Parent; Location = Sucessor; Parent = Parent_sucessor; DeleteElementWith0Or1Child( ); Location = temp_loc; Parent = temp_par; if (Parent != NULL) { if (Location == Parent->LeftNode) Parent->LeftNode = Sucessor; else Parent->RightNode = Sucessor; } else RootNode = Sucessor; Sucessor->LeftNode = Location->LeftNode; Sucessor->RightNode = Location->RightNode; } //-------------------------- DeleteElement( ) --------------------------//void Set::DeleteElement(constint key) { IsAnElement(key); if (RootNode == NULL) { if (flag == 1) cout << "\n\n*** Error : Set is empty. \n" << endl; } elseif (Location == NULL) { if (flag == 1) cout << "\n\n*** " << key << " does not exists in the Set \n" << endl; } else { if (Location->RightNode != NULL && Location->LeftNode != NULL) DeleteElementWith2Child( ); else DeleteElementWith0Or1Child( ); size --; if (flag == 1) cout << "*** " << key << " is deleted from the Set." << endl; } } //---------------------------- AddElement( ) ---------------------------//void Set::AddElement(constint num) { if (RootNode == NULL) RootNode = InsertElement(RootNode, num); else { flag = 0; IsAnElement(num); flag = 1; if (Location==NULL) InsertElement(RootNode, num); } } //-------------------------------- Read( ) -----------------------------//void Set::Read(constchar* Numbers) { char Temp[255] = {NULL}; strcpy(Temp, Numbers); char* Ptr = strtok(Temp,","); int num = 0; flag = 0; while (Ptr != NULL) { num = atoi(Ptr); AddElement(num); Ptr = strtok(NULL, ","); } flag = 1; } //---------------------------------- Union( ) --------------------------// Set Set::Union(const Set set) { Set C; flag = 0; for (int i = 1; i <= size; i ++) C.AddElement(getElementAt(RootNode, i)); for (int j = 1; j <= set.Size( ); j ++) C.AddElement(getElementAt(set.RootNode, j)); flag = 1; return C; } //--------------------------- Intersection( ) --------------------------// Set Set::Intersection(const Set set) { Set C; for (int i = 1; i <= size; i ++) { int num = getElementAt(RootNode, i); flag = 0; if (set.IsAnElement(num) == 1) C.AddElement(num); flag = 1; } return C; } //---------------------------- Operator==( ) ---------------------------//int Set::operator==(const Set set) { if (size != set.Size( )) return 0; int eFlag = 1; for (int i = 1; i <= size; i ++) { int num = getElementAt(RootNode, i); flag = 0; if (set.IsAnElement(num) == 0) { eFlag = 0; break; } flag = 1; } return eFlag; } //----------------------------- Operator-( ) ---------------------------// Set Set::operator-(const Set set) { Set C; for (int i = 1; i <= size; i ++) C.AddElement(getElementAt(RootNode, i)); for (int j = 1; j <= set.Size( ); j ++) { int num = getElementAt(set.RootNode, j); flag = 0; C.DeleteElement(num); flag = 1; } return C; } //----------------------------- IsASubSet( ) ---------------------------//int Set::IsASubSet(const Set subset) { if (size == 0) return 0; if (subset.Size( ) == 0) return 1; int eFlag = 1; for (int i = 1; i <= size; i ++) { int num = getElementAt(subset.RootNode, i); flag = 0; if (IsAnElement(num) == 0) { eFlag = 0; break; } flag = 1; } return eFlag; } /*************************************************************************///------------------------------- main( ) -----------------------------///*************************************************************************/int main( ) { clrscr( ); Set A; cout << "Read() & AddElement() Demonstration" << endl; cout << "***********************************" << endl; cout << "\nRead(\"5,3,1,2,0\")" << endl; A.Read("5,3,1,2,0"); cout << "AddElement(4)" << endl; cout << "AddElement(9)" << endl; cout << "AddElement(4)" << endl; A.AddElement(4); A.AddElement(9); A.AddElement(4); cout << "\nSet A ="; A.Print( ); getch( ); cout << "\n\n\nPrintAscending() Demonstration" << endl; cout << "******************************" << endl; cout << "\nAscending Order :"; A.PrintAscending( ); getch( ); cout << "\n\n\nPrintDescending() Demonstration" << endl; cout << "*******************************" << endl; cout << "\nDescending Order :"; A.PrintDescending( ); getch( ); cout << "\n\n\nDeleteElement() Demonstration" << endl; cout << "*****************************" << endl; cout << "DeleteElement(5)" << endl; A.DeleteElement(5); cout << "\nSet ="; A.Print( ); getch( ); cout << "\n\n\nIsAnElement() Demonstration" << endl; cout << "***************************" << endl; A.IsAnElement(2); getch( ); cout << "\n\n\nSize() Demonstration" << endl; cout << "********************" << endl; cout << "\nSet Size = " << A.Size( ) << endl; getch( ); cout << "\n\n\nIsEmpty() Demonstration" << endl; cout << "******************************" << endl; if (A.IsEmpty( ) == 1) cout << "\nThe Set is Empty" << endl; else cout << "\nThe Set Is Not Empty" << endl; getch( ); cout << "\n\n\nUnion() Demonstration" << endl; cout << "*********************" << endl; Set B, C; B.Read("1,7,0,4,6,8,5"); cout << "\nSet A ="; A.Print( ); cout << "\nSet B ="; B.Print( ); C = A.Union(B); cout << "\n\nC = A u B ="; C.Print( ); getch( ); cout << "\n\n\nIntersection() Demonstration" << endl; cout << "****************************" << endl; C = A.Intersection(B); cout << "\n\nC = A n B ="; C.Print( ); getch( ); cout << "\n\n\nEmpty() Demonstration" << endl; cout << "*********************" << endl; C.Empty( ); if (C.IsEmpty( ) == 1) cout << "\n\nThe Set C is Empty" << endl; else cout << "\n\nThe Set C Is Not Empty" << endl; getch( ); cout << "\n\n\nOperator == Demonstration" << endl; cout << "*************************" << endl; if (A == B) cout << "\nSet A = Set B" << endl; else cout << "\nSet A != Set B" << endl; getch( ); cout << "\n\n\nOperator - Demonstration" << endl; cout << "************************" << endl; C = (A - B); cout << "\nC = A - B = "; C.Print( ); getch( ); cout << "\n\n\nIsASubSet() Demonstration" << endl; cout << "*************************" << endl; B.Empty( ); B.Read("4,1,2"); cout << "\n\nSet A ="; A.Print( ); cout << "\nSet B ="; B.Print( ); if (A.IsASubSet(B) == 1) cout << "\n\nSet B is a Subset of Set A" << endl; else cout << "\n\nSet B is not Subset of Set A" << endl; getch( ); return 0; }
No comments:
Post a Comment