Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

The goal of this assignment is to reinforce implementation of dynamic arrays in

ID: 3829751 • Letter: T

Question

The goal of this assignment is to reinforce implementation of dynamic arrays in C++. Specifically, the assignment is to implement a set using a dynamic array. You need to implement the following set operations

union

intersection

relative complement

insertion - if the element is already in the set, then nothing happens

deletion - if the element is not in the set, then nothing happens

query to check whether an element is in a set

query to find the number of number of elements in a set

display the set

destructor

copy constructor

overloading assignment operator

node1.cxx

// FILE: node1.cxx
// IMPLEMENTS: The functions of the node class and the
// linked list toolkit (see node1.h for documentation).
// INVARIANT for the node class:
// The data of a node is stored in data_field, and the link in link_field.

#include "node1.h"
#include <cassert> // Provides assert
#include <cstdlib> // Provides NULL and size_t
using namespace std;

namespace main_savitch_5
{
size_t list_length(const node* head_ptr)
// Library facilities used: cstdlib
{
   const node *cursor;
   size_t answer;

   answer = 0;
   for (cursor = head_ptr; cursor != NULL; cursor = cursor->link( ))
   ++answer;
  
   return answer;
}
  
void list_head_insert(node*& head_ptr, const node::value_type& entry)
{
   head_ptr = new node(entry, head_ptr);
}

void list_insert(node* previous_ptr, const node::value_type& entry)
{
   node *insert_ptr;
  
   insert_ptr = new node(entry, previous_ptr->link( ));
   previous_ptr->set_link(insert_ptr);
}

node* list_search(node* head_ptr, const node::value_type& target)
// Library facilities used: cstdlib
{
   node *cursor;

   for (cursor = head_ptr; cursor != NULL; cursor = cursor->link( ))
   if (target == cursor->data( ))
       return cursor;
   return NULL;
}

const node* list_search(const node* head_ptr, const node::value_type& target)
// Library facilities used: cstdlib
{
   const node *cursor;

   for (cursor = head_ptr; cursor != NULL; cursor = cursor->link( ))
   if (target == cursor->data( ))
       return cursor;
   return NULL;
}

node* list_locate(node* head_ptr, size_t position)
// Library facilities used: cassert, cstdlib
{
   node *cursor;
   size_t i;
  
   assert (0 < position);
   cursor = head_ptr;
   for (i = 1; (i < position) && (cursor != NULL); i++)
   cursor = cursor->link( );
   return cursor;
}

const node* list_locate(const node* head_ptr, size_t position)
// Library facilities used: cassert, cstdlib
{
   const node *cursor;
   size_t i;
  
   assert (0 < position);
   cursor = head_ptr;
   for (i = 1; (i < position) && (cursor != NULL); i++)
   cursor = cursor->link( );
   return cursor;
}

void list_head_remove(node*& head_ptr)
{
   node *remove_ptr;

   remove_ptr = head_ptr;
   head_ptr = head_ptr->link( );
   delete remove_ptr;
}

void list_remove(node* previous_ptr)
{
   node *remove_ptr;

   remove_ptr = previous_ptr->link( );
   previous_ptr->set_link( remove_ptr->link( ) );
   delete remove_ptr;
}

void list_clear(node*& head_ptr)
// Library facilities used: cstdlib
{
   while (head_ptr != NULL)
   list_head_remove(head_ptr);
}

void list_copy(const node* source_ptr, node*& head_ptr, node*& tail_ptr)
// Library facilities used: cstdlib
{
   head_ptr = NULL;
   tail_ptr = NULL;

   // Handle the case of the empty list.
   if (source_ptr == NULL)
   return;
  
   // Make the head node for the newly created list, and put data in it.
   list_head_insert(head_ptr, source_ptr->data( ));
   tail_ptr = head_ptr;
  
   // Copy the rest of the nodes one at a time, adding at the tail of new list.
   source_ptr = source_ptr->link( );
   while (source_ptr != NULL)
   {
   list_insert(tail_ptr, source_ptr->data( ));
   tail_ptr = tail_ptr->link( );
   source_ptr = source_ptr->link( );
   }
}

}

node1.h

// FILE: node1.h
// PROVIDES: A class for a node in a linked list, and list manipulation
// functions, all within the namespace main_savitch_5
//
// TYPEDEF for the node class:
// Each node of the list contains a piece of data and a pointer to the
// next node. The type of the data is defined as node::value_type in a
// typedef statement. The value_type may be any
// of the built-in C++ classes (int, char, ...) or a class with a copy
// constructor, an assignment operator, and a test for equality (x == y).
//
// CONSTRUCTOR for the node class:
// node(
// const value_type& init_data = value_type(),
// node* init_link = NULL
// )
// Postcondition: The node contains the specified data and link.
// NOTE: The default value for the init_data is obtained from the default
// constructor of the value_type. In the ANSI/ISO standard, this notation
// is also allowed for the built-in types, providing a default value of
// zero. The init_link has a default value of NULL.
//
// NOTE:
// Some of the functions have a return value which is a pointer to a node.
// Each of these functions comes in two versions: a non-const version (where
// the return value is node*) and a const version (where the return value
// is const node*).
// EXAMPLES:
// const node *c;
// c->link( ) activates the const version of link
// list_search(c,... calls the const version of list_search
// node *p;
// p->link( ) activates the non-const version of link
// list_search(p,... calls the non-const version of list_search
//
// MEMBER FUNCTIONS for the node class:
// void set_data(const value_type& new_data)
// Postcondition: The node now contains the specified new data.
//
// void set_link(node* new_link)
// Postcondition: The node now contains the specified new link.
//
// value_type data( ) const
// Postcondition: The return value is the data from this node.
//
// const node* link( ) const <----- const version
// node* link( ) <----------------- non-const version
// See the note (above) about the const version and non-const versions:
// Postcondition: The return value is the link from this node.
//
// FUNCTIONS in the linked list toolkit:
// size_t list_length(const node* head_ptr)
// Precondition: head_ptr is the head pointer of a linked list.
// Postcondition: The value returned is the number of nodes in the linked
// list.
//
// void list_head_insert(node*& head_ptr, const node::value_type& entry)
// Precondition: head_ptr is the head pointer of a linked list.
// Postcondition: A new node containing the given entry has been added at
// the head of the linked list; head_ptr now points to the head of the new,
// longer linked list.
//
// void list_insert(node* previous_ptr, const node::value_type& entry)
// Precondition: previous_ptr points to a node in a linked list.
// Postcondition: A new node containing the given entry has been added
// after the node that previous_ptr points to.
//
// const node* list_search(const node* head_ptr, const node::value_type& target)
// node* list_search(node* head_ptr, const node::value_type& target)
// See the note (above) about the const version and non-const versions:
// Precondition: head_ptr is the head pointer of a linked list.
// Postcondition: The pointer returned points to the first node containing
// the specified target in its data member. If there is no such node, the
// null pointer is returned.
//
// const node* list_locate(const node* head_ptr, size_t position)
// node* list_locate(node* head_ptr, size_t position)
// See the note (above) about the const version and non-const versions:
// Precondition: head_ptr is the head pointer of a linked list, and
// position > 0.
// Postcondition: The pointer returned points to the node at the specified
// position in the list. (The head node is position 1, the next node is
// position 2, and so on). If there is no such position, then the null
// pointer is returned.
//
// void list_head_remove(node*& head_ptr)
// Precondition: head_ptr is the head pointer of a linked list, with at
// least one node.
// Postcondition: The head node has been removed and returned to the heap;
// head_ptr is now the head pointer of the new, shorter linked list.
//
// void list_remove(node* previous_ptr)
// Precondition: previous_ptr points to a node in a linked list, and this
// is not the tail node of the list.
// Postcondition: The node after previous_ptr has been removed from the
// linked list.
//
// void list_clear(node*& head_ptr)
// Precondition: head_ptr is the head pointer of a linked list.
// Postcondition: All nodes of the list have been returned to the heap,
// and the head_ptr is now NULL.
//
// void list_copy(const node* source_ptr, node*& head_ptr, node*& tail_ptr)
// Precondition: source_ptr is the head pointer of a linked list.
// Postcondition: head_ptr and tail_ptr are the head and tail pointers for
// a new list that contains the same items as the list pointed to by
// source_ptr. The original list is unaltered.
// void list_piece(
// const node* start_ptr, const node* end_ptr,
// node*& head_ptr, node*& tail_ptr
// )
// Precondition: start_ptr and end_ptr are pointers to nodes on the same
// linked list, with the start_ptr node at or before the end_ptr node
// Postcondition: head_ptr and tail_ptr are the head and tail pointers for a
// new list that contains the items from start_ptr up to but not including
// end_ptr. The end_ptr may also be NULL, in which case the new list
// contains elements from start_ptr to the end of the list.
//
// DYNAMIC MEMORY usage by the toolkit:
// If there is insufficient dynamic memory, then the following functions throw
// bad_alloc: the constructor, list_head_insert, list_insert, list_copy,
// list_piece.

#ifndef MAIN_SAVITCH_NODE1_H
#define MAIN_SAVITCH_NODE1_H
#include <cstdlib> // Provides size_t and NULL

namespace main_savitch_5
{
class node
{
public:
   // TYPEDEF
   typedef double value_type;

   // CONSTRUCTOR
   node(
   const value_type& init_data = value_type( ),
   node* init_link = NULL
   )
   { data_field = init_data; link_field = init_link; }

   // Member functions to set the data and link fields:
void set_data(const value_type& new_data) { data_field = new_data; }
void set_link(node* new_link) { link_field = new_link; }

   // Constant member function to retrieve the current data:
   value_type data( ) const { return data_field; }

   // Two slightly different member functions to retreive
   // the current link:
   const node* link( ) const { return link_field; }
node* link( ) { return link_field; }
  
private:
   value_type data_field;
   node* link_field;
   };

// FUNCTIONS for the linked list toolkit
std::size_t list_length(const node* head_ptr);
void list_head_insert(node*& head_ptr, const node::value_type& entry);
void list_insert(node* previous_ptr, const node::value_type& entry);
node* list_search(node* head_ptr, const node::value_type& target);
const node* list_search
   (const node* head_ptr, const node::value_type& target);
node* list_locate(node* head_ptr, std::size_t position);
const node* list_locate(const node* head_ptr, std::size_t position);
void list_head_remove(node*& head_ptr);
void list_remove(node* previous_ptr);
void list_clear(node*& head_ptr);
void list_copy(const node* source_ptr, node*& head_ptr, node*& tail_ptr);
}

#endif

Explanation / Answer

#ifndef SET_H
#define SET_H

#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;

class Set{

friend ostream &operator<< ( ostream &, const Set &);
friend istream &operator>> ( istream &, Set &);

public:

Set ( int = DEFAULTSIZE ); //default constructor
Set ( const Set & ); //copy constructor
Set ( int [], int, char ); //constructor passing array of integers, size, name of set

~Set(); //destructor

//assignment operator
const Set &operator= ( const Set &);
//equality operator
bool operator== ( const Set & ) const;
//inequality operator
bool operator!= ( const Set &s1) const{
return !(*this == s1);
}
//subscript operators
int &operator[] ( int );
int operator[] ( int ) const;

//methods to find union, intersection, and difference of sets
Set Union ( Set & );
Set Intersect ( Set & );
Set Difference ( Set & );

Set operator+ ( Set & ); //to represent union of two sets
Set operator^ ( Set & ); //to represent intersection of two sets
Set operator- ( Set & ); //to represent difference between two sets

bool element ( int );

private:
static const int DELIM = -999; // delimiter to signal end of input
static const int DEFAULTSIZE = 10;
int numOfElements;
int psize; //physical size of array
int *set; //pointer array to represent set

};
#endif

//SOURCE FILE

//default constructor
Set::Set ( int s ){

if ( s > 0 )
psize = s;
else
psize = DEFAULTSIZE;
//allocate an array of specified size
set = new int[ psize ];

if(!set) {
//send an error is system cannot allocate memory
cout << "Cannot Allocate Memory, exiting program... " << endl;
exit (1);
}

for ( int i = 0; i < psize; i++){
set[i] = 0;
numOfElements = 0;
}

}

//copy constructor
Set::Set ( const Set &setToCopy): psize(setToCopy.psize){
set = new int[psize];
if(!set){
cout << "Cannot Allocate Memory, exiting program..." << endl;
exit (1);
}
for (int i = 0; i < psize; i++ ){
set[i] = setToCopy.set[i];

numOfElements = psize;
}
}

Set::~Set(){
if (set)
delete [] set;
set = NULL;
}

const Set &Set::operator= ( const Set &s1 ){
if ( &s1 != this){
if (numOfElements != s1.numOfElements){
delete [] set;
psize = numOfElements;
set = new int [psize];
if (!set){
cout << "Cannot Allocate memory, exiting program..." << endl;
exit (1);
}
}
}
//assign contents of the array on the right to the contents of the array on the left
for ( int i = 0; i < psize; i++ ){
set[i] = s1.set[i];
numOfElements = psize;
}

return (*this);
}

bool Set::operator== ( const Set &s1 ) const {
bool validate = true;

if ( numOfElements == s1.numOfElements ){
for ( int i = 0; i < numOfElements; i++){
if ( set [i] != s1.set[i] ){
validate = false;
break;
}
}
}

return (validate);
}

int &Set::operator[]( int subscript ){
if ( subscript < 0 || subscript >= psize ) {
cout << " Error, exiting program... " ;
exit (1);
}

return set[subscript];
}
void Set::input(){

int ival;

cout << "Enter up to 10 numbers or type in the delimiter -999" << endl;

for ( int i = 0; i < psize; i++){
cin >> ival;
if ( ival != Set::DELIM ){
set [i] = ival;
}
else {
numOfElements = i;
break;
}
}
}
void Set::display(){
for ( int i = 0; i < numOfElements; i++ ){
cout << set[i] << endl;
}
cout << "Physical Size is " << numOfElements << endl;
}
bool Set::element ( int n ) {
bool validate = true;
for ( int i = 0; i < psize; i++){
if ( set[i] == n )
validate = false;
}
return (validate);
}

Set Set::Union( Set &B ){
const int newsize = B.psize + psize;
Set c(newsize);
for ( int i = 0; i < psize; i++){
C.set[i] = set[i];
}
for ( int i = psize; i < newsize; i++){
for ( int j = 0; j < B.psize; j++){
C.set[i] = B.set[j];
}
}
return (c.set); //I NEED TO RETURN THE SET OF C SOMEHOW
}

main (){

Set A, B, C;
A.input();
A.display();
B.input();
B.display();
A.Union(B);
A.display();

}   

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote