SLL09
Home ] Up ]

 

//file   SLL09.cpp
//date   11/29/2006
//author aou
//csis250.tripod.com

// SLL: Singly-linked list

// Project 4, test functions for all the member functions

/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
code:
test-driver:
test-data:
test-results:
*/

///////////////////////////////////////////////////////////
//includes
///////////////////////////////////////////////////////////
#include <iostream>
using namespace std;


const int TEST_COUNT = 5;

class CInfo
  {
  private:
    int value;
    CInfo *next;

  friend class CSLL;
  friend ostream & operator << (ostream & bob, const CSLL & list);
  };


class CSLL
  {
  private:
    int n;
    CInfo *first;  //essential
    CInfo *last;

  private:
    void initialize(void);

  public:
    CSLL(void);  //default constructor///////////////////////////////
    bool insert(int x);/////////////////////////////////////////////////
    friend ostream & operator << (ostream & bob, const CSLL & list);/////
    CSLL(char ch); //constructs based on value of ch ///////////////////
    CSLL(int low, int high); ////////////////////////////////////////  
    CSLL(int low, int high, int n);//////////////////////////////////
    bool operator == (const CSLL &list2);
    CSLL(const CSLL &list);
    void input(void);
    bool insert(const CSLL & list2);
  };


void test_CSLL_initialize(void);


void main(void)
  {
  test_CSLL_initialize();


  /*
 
  myList.insert(666);
  cout << myList << endl;

  myList.insert(555);
  cout << myList << endl;
  */

  
  /*
  for (int i=1; i<=10; i++)
    {
    CSLL myList('r');
    cout << myList << endl;
    }
  */

  /*
  for (int i=1; i<=10; i++)
    {
    CSLL myList(100, 200);
    cout << myList << endl;
    }
  */

  /*
  for (int i=1; i<=10; i++)
    {
    CSLL myList(10, 20, 5);
    cout << myList << endl;
    }
  */

  /*
  CSLL myList, yourList;
  cout << myList << endl << yourList << endl;

  if(myList == yourList)
    cout << "myList == yourList\n";
  else
    cout << "myList != yourList\n";

  myList.insert(5);
  yourList.insert(5);

  cout << myList << endl << yourList << endl;
  if(myList == yourList)
    cout << "myList == yourList\n";
  else
    cout << "myList != yourList\n";

  myList.insert(6);
  yourList.insert(7);

  cout << myList << endl << yourList << endl;
  if(myList == yourList)
    cout << "myList == yourList\n";
  else
    cout << "myList != yourList\n";


  myList.insert(66);
  myList.insert(56);
  yourList.insert(77);

  cout << myList << endl << yourList << endl;
  if(myList == yourList)
    cout << "myList == yourList\n";
  else
    cout << "myList != yourList\n";

  */
  }

/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
code:
test-driver:
test-data:
test-results:
*/
bool CSLL::operator == (const CSLL &list2)
  {
  if (this->n != list2.n)
    return false;

  CInfo *p1, *p2;
  
  p1 = this->first;
  p2 = list2.first;

  while (p1 != NULL)
    {
    if (p1->value != p2->value)
      return false;

    p1 = p1->next;
    p2 = p2->next;
    }

  return true;
  }


/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
code:
test-driver:
test-data:
test-results:
*/
CSLL::CSLL(int low, int high, int n)
  {
  this->initialize();

  if (low > high)
    return;

  if (n<0)
    n = -n;
  
  int m = n;

  for (int i=1; i<=m; i++)
    {
    int x = low + rand()%(high-low+1);
    this->insert(x);
    }
  }


/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
code:
test-driver:
test-data:
test-results:
*/
CSLL::CSLL(int low, int high)
  {
  this->initialize();

  if (low > high)
    return;

  int m = rand()%20;

  for (int i=1; i<=m; i++)
    {
    //int x = 1 + rand()%(10-1+1);
    //int x = 10 + rand()%(20-10+1);
    int x = low + rand()%(high-low+1);
    this->insert(x);
    }
  }


/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
code:
test-driver:
test-data:
test-results:
*/
CSLL::CSLL(char ch)
  {
  this->initialize();

  if (('r' == ch) || ('R' == ch))
    {
    int m = rand()%20;
    //this->n = m;
    for (int i=1; i<=m; i++)
      {
      int x = rand()%100;
      this->insert(x);
      }
    }
  }


/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
code:
test-driver:
test-data:
test-results:
*/
bool CSLL::insert(int x)
  {
  /*
  set agent to available block of type CInfo
  copy x to value part of new block
  set next part of new block to NULL
  set first to agent
  set last to agent
  */
  CInfo *agent;

  agent = new CInfo;
  if (agent == NULL)
    return false;

  agent->value = x;
  agent->next = NULL;

  if (this->n == 0)
    {
    this->first = this->last = agent;
    this->last  = agent;
    }
  else
    {
    this->last->next = agent;
    this->last = agent;
    }

  this->n++;
  return true;
  }


/*
name:
description:
example:
preconditions:
postcondition:
side-effect:
protype:
algorithm:
  display n
  if n=0 then exit 
  agent = list.first
  if agent == null then exit
  while agent <> null
    display agent->value or (*agent).value
    agent = agent->next
    end while

code:
test-driver:
test-data:
test-results:
*/
ostream & operator << (ostream & bob, const CSLL & list)
  {
  bob << "SLL(" << list.n << "): ";

  CInfo *agent;
  //CInfo * agent;
  //CInfo* agent;
  //CInfo*agent;

  agent = list.first;

  while (agent != NULL)
    {
    bob << agent->value << ' ';
    agent = agent->next;
    }

  return bob;
  }


/*
name:         CSLL
description:  default constructor for CSLL
example:      n/a
preconditions:list should not exist
postcondition:empty list
side-effect:  none
protype:      CSLL(void)
algorithm:    call initialize
code:         follows
test-driver:  n/a
test-data:    n/a
test-results: n/a
*/
CSLL::CSLL(void)
  {
  this->initialize();
  }


void test_CSLL_initialize(void)
  {
  cout << "======================\n";
  cout << "test_CSLL_initialize  \n";
  cout << "======================\n";
  
  for (int i=1; i<=TEST_COUNT; i++)
    {
    CSLL myList;
    cout << myList << endl;
    cout << "----------------------\n";
    }
  }

/*
name:         initialize
description:  initializes a new singly-linked list
example:      n/a
preconditions:list should not exist
postcondition:empty list
side-effect:  none
protype:      void initialize(void)
algorithm:    set n to 0, first and last to null
code:         follows
test-driver:  n/a
test-data:    n/a
test-results: n/a
*/
void CSLL::initialize(void)
  {
  //n = 0;
  //(*this).n = 0;
  this->n = 0;
  this->first = NULL;
  this->last = NULL;
  }