• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 258
  • Last Modified:

Can anyone tell me why the overloaded += operator is not advancing through the linked lists if the lists have a different number of nodes?

I am trying to figure this out. I need to get this done pronto so any help is appreciated.
Here is the outline of my assignment:
Define and implement a class named Polynomial that has operators for creating a polynomial, reading a polynomial, and adding and subtracting polynomials. Its partial declaration is given below (you can add some other auxiliary member functions to the class, if necessary).

struct TermType
{
      int coefficient;
      int exponent;

      TermType* next;            
};

class Polynomial            
{
private:
      TermType* head;      

public:
      // default constructor: create an empty polynomial
      Polynomial();                        

// copy constructor: use the content of p1 to create a polynomial
      Polynomial(const Polynomial& p1);            

      // destructor
// release dynamic memory related to the polynomial
      ~Polynomial();                        

      // overloaded assignment operator
// assign the content of p1 to a polynomial
      void operator=(const Polynomial& p1);

      // overloaded += operator
// add a polynomial
      void operator+=(const Polynomial& p1);

      // overloaded -= operator
// subtract a polynomial
      void operator-=(const Polynomial& p1);

      // read a polynomial
      bool read();

      // output a polynomial
      void print();
};
0
scuzzo
Asked:
scuzzo
  • 8
  • 8
1 Solution
 
AndyAinscowFreelance programmer / ConsultantCommented:
I guess you aren't moving throught the lists in your code.

(ps. It sounds wierd what you say you are doing - are you adding two lists of polynomials to result in ONE final polynomial ?)
0
 
scuzzoAuthor Commented:
I can't see that my source code got posted. Here it is.
#include <string>
#include <iostream>
using namespace std;
struct TermType
{
      int coefficient;
      int exponent;
      bool NegCoef;

      TermType* next;            
};

class Polynomial            
{
private:
      TermType* head;
      
public:
      // default constructor: create an empty polynomial
      Polynomial();                        

// copy constructor: use the content of p1 to create a polynomial
      Polynomial(const Polynomial& p1);            

      // destructor
// release dynamic memory related to the polynomial
      //~Polynomial();                        

      // overloaded assignment operator
// assign the content of p1 to a polynomial
      void operator=(const Polynomial& p1);

      // overloaded += operator
// add a polynomial
      void operator+=(const Polynomial& p1);

      // overloaded -= operator
// subtract a polynomial
      void operator-=(const Polynomial& p1);

      // read a polynomial
      void read();

      // output a polynomial
      void print();

      //new input function
      void insertTerm(bool,int,int);
};

Polynomial::Polynomial()
{
      head=NULL;
}
void Polynomial::operator+=(const Polynomial& p1)
{
      TermType* poly1=head;
      TermType* poly2=p1.head;
      while (poly1!=NULL&&poly2!=NULL)
      {
            if (poly1->exponent==poly2->exponent)
            {
                  cout<<poly1->coefficient+poly2->coefficient<<"x^"<<poly1->exponent;
            }
            if (poly1->exponent>poly2->exponent)
            {
                  cout<<poly1->coefficient<<"x^"<<poly1->exponent;
            }
            if (poly2->exponent>poly1->exponent)
            {
                  cout<<poly2->coefficient<<"x^"<<poly2->exponent;
            }
            if (poly2==NULL)
                  cout<<poly1->coefficient<<"x^"<<poly1->exponent;
            if (poly1==NULL)
                  cout<<poly2->coefficient<<"x^"<<poly2->exponent;
            if (poly1!=NULL)
                  poly1=poly1->next;
            if (poly2!=NULL)
                  poly2=poly2->next;
      }
}
void Polynomial::insertTerm(bool negCoef, int coef, int exp)
{
      cout << "begin insert!" << endl;
      cout << negCoef << "    " << coef << "    " << exp << endl;

      TermType* newTerm = new TermType;
      if (negCoef == 1)
            newTerm->coefficient = 0 - coef;
      else
            newTerm->coefficient = coef;
      newTerm->exponent = exp;
      newTerm->next = NULL;

      TermType* current = head;
      if (head == NULL)
            head = newTerm;
      else
      {
            while (current->next != NULL)
            current=current->next;
            current->next = newTerm;
      }
      cout << "end insert!" << endl;
}
//read a polynomial
void Polynomial::read()
{
      string s;
      cout << "Enter a term (ex: +4x^3): ";
      cin >> s;
      int index = 0;
      bool firstTerm = 1;
      bool nowExp = 0;
      bool negativeCoef = 0;
      int coef = 0;
      int exp = 0;

      while (s[index] != '#')
      {
            cout << "char : " << s[index] << endl;
            if (s[index] == '+' || s[index] == '-')
            {
                  cout << "+-" << endl;
                  if (firstTerm == 0)
                        {
                              if (coef != 0)
                              insertTerm(negativeCoef, coef, exp);
                        }
                  else
                  {
                        firstTerm = 0;
                  }
                  nowExp = 0;
                  if (s[index] == '-')
                        negativeCoef = 1;
                  else
                              negativeCoef = 0;
                        coef = 0;
                        exp = 0;
                  }
                  else if (s[index] == 'x')
                  {
                        cout << "x" << endl;
                        if (s[index+1] != '^')
                              {
                                    cout << "Incorrect formula!" << endl;
                                    head = NULL;
                                    break;
                              }
                  }
                  else if (s[index] == '^')
                  {
                        cout << "^" << endl;
                        nowExp = 1;
                  }
                  else if (s[index]>='0' && s[index]<='9')
                  {
                        cout << "number" << endl;
                        if (nowExp == 0)
                        coef = coef*10 + (s[index]-48);
                        else
                        exp = exp*10 + (s[index]-48);
                  }
                  else
                  {
                        cout << "The formula contains invalid characters: " << s[index] << endl;
                        head = NULL;
                        break;
                  }
                  index++;
            }
            if (coef != 0)
            insertTerm(negativeCoef, coef, exp);
            cout << "done!"<< endl;
}
void Polynomial::print()
{
      TermType* newTerm=head;
      while (newTerm != NULL)
      {
            cout<<newTerm->coefficient<<"x^"<<newTerm->exponent;
            newTerm=newTerm->next;
      }
      cout << endl;
}
int main()
{
      Polynomial p, p1;      
      p.read();
      cout<<"Second Term:"<<endl;
      p1.read();
      //p.print();
      //p1.print();
      p+=(p1);
      system ("pause");
      return 0;
}
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
while (poly1!=NULL&&poly2!=NULL)

just for safety
while ((poly1!=NULL) && (poly2!=NULL))

otherwise it should loop through both lists.  (I don't understand what it should be doing though)
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
scuzzoAuthor Commented:
It is to bring in two linked lists and then add them together. The linked lists are to represent polynomials. So what I have are two linked lists that have values for coefficient and exponents.  Then I need to be able to add the polynomials together and output the result.
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
aha, so that is what it does.

As I said - it looks like it should process both lists.  Have you tried single stepping through the code.  (Maybe the lists aren't what they should be)
0
 
scuzzoAuthor Commented:
I've tried everything I know but I've been working for about 48 hrs trying to get this up and running and I'm running out of steam.
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
This is all I can think of - use this instead of the one you have (without brackets)

while ((poly1!=NULL) && (poly2!=NULL))
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
(duh - I was going to say that first but then thought for some reason that it was what you wanted to do).  
You want OR not AND in the check

while ((poly1!=NULL) || (poly2!=NULL))
0
 
scuzzoAuthor Commented:
I tried using || but the problem is that I throw an Unhandled exception at this line:
while ((poly1!=NULL)||(poly2!=NULL))
      {
            if (poly1->exponent==poly2->exponent)
            {
->->->->                  cout<<poly1->coefficient+poly2->coefficient<<"x^"<<poly1->exponent;
            }
            if (poly1->exponent>poly2->exponent)
            {
                  cout<<poly1->coefficient<<"x^"<<poly1->exponent;
            }
            if (poly2->exponent>poly1->exponent)
            {
                  cout<<poly2->coefficient<<"x^"<<poly2->exponent;
            }
            if (poly2==NULL)
                  cout<<poly1->coefficient<<"x^"<<poly1->exponent;
            if (poly1==NULL)
                  cout<<poly2->coefficient<<"x^"<<poly2->exponent;
            if (poly1!=NULL)
                  poly1=poly1->next;
            if (poly2!=NULL)
                  poly2=poly2->next;
      }
}
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
only compare poly1 and poly2 components if both are NOT null
0
 
scuzzoAuthor Commented:
I'm not following you, I thought that while ((poly1!=NULL)||poly2!=NULL)) was comparing if both were not NULL
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
while ((poly1!=NULL)||(poly2!=NULL))
      {
            if (poly1->exponent==poly2->exponent)

but what happens here if poly1 is null for example ? - Crash.
0
 
scuzzoAuthor Commented:
First of all you are getting big points for helping me this far and I want you to know I appreciate it. Secondly I've managed to get the code refined a little and now for some reason I'm getting stuck in an infinite loop using the operloaded += operator. Any ideas?
#include <string>
#include <iostream>
using namespace std;
struct TermType
{
      int coefficient;
      int exponent;
      bool NegCoef;

      TermType* next;            
};

class Polynomial            
{
private:
      TermType* head;
      
public:
      // default constructor: create an empty polynomial
      Polynomial();                        

// copy constructor: use the content of p1 to create a polynomial
      Polynomial(const Polynomial& p1);            

      // destructor
// release dynamic memory related to the polynomial
      //~Polynomial();                        

      // overloaded assignment operator
// assign the content of p1 to a polynomial
      void operator=(const Polynomial& p1);

      // overloaded += operator
// add a polynomial
      void operator+=(const Polynomial& p1);

      // overloaded -= operator
// subtract a polynomial
      void operator-=(const Polynomial& p1);

      // read a polynomial
      void read();

      // output a polynomial
      void print();

      //new input function
      void insertTerm(bool,int,int);
};

Polynomial::Polynomial()
{
      head=NULL;
}
void Polynomial::operator+=(const Polynomial& p1)
{
      cout<<"Start print"<<endl;
      TermType* poly1=head;
      TermType* poly2=p1.head;
      int counter=0;
      while ((poly1!=NULL)||(poly2!=NULL))
      {
            counter++;
            if (poly2==NULL)
                  cout<<poly1->coefficient<<"x^"<<poly1->exponent;
            
            if (poly1==NULL)
                  cout<<poly2->coefficient<<"x^"<<poly2->exponent;
            if (poly1!=NULL&&poly2!=NULL)
            {
                  if (poly1->exponent==poly2->exponent)
                        {
                              cout<<poly1->coefficient+poly2->coefficient<<"x^"<<poly1->exponent;
                                          if (poly1!=NULL)
                                                poly1=poly1->next;
                                          if (poly2!=NULL)
                                                poly2=poly2->next;
                                          continue;
                        }
                  if (poly1->exponent>poly2->exponent)
                        {
                              cout<<poly1->coefficient<<"x^"<<poly1->exponent;
                              if (poly2!=NULL)
                                    poly2=poly2->next;
                              continue;
                        }
                  if (poly2->exponent>poly1->exponent)
                        {
                              cout<<poly2->coefficient<<"x^"<<poly2->exponent;
                              if (poly1!=NULL)
                                    poly1=poly1->next;                        
                              continue;
                        }                                                
                  
            }
      }
}
void Polynomial::insertTerm(bool negCoef, int coef, int exp)
{
      cout << "begin insert!" << endl;
      cout << negCoef << "    " << coef << "    " << exp << endl;

      TermType* newTerm = new TermType;
      if (negCoef == 1)
            newTerm->coefficient = 0 - coef;
      else
            newTerm->coefficient = coef;
      newTerm->exponent = exp;
      newTerm->next = NULL;

      TermType* current = head;
      if (head == NULL)
            head = newTerm;
      else
      {
            while (current->next != NULL)
            current=current->next;
            current->next = newTerm;
      }
      cout << "end insert!" << endl;
}
//read a polynomial
void Polynomial::read()
{
      string s;
      cout << "Enter a term (ex: +4x^3): ";
      cin >> s;
      int index = 0;
      bool firstTerm = 1;
      bool nowExp = 0;
      bool negativeCoef = 0;
      int coef = 0;
      int exp = 0;

      while (s[index] != '#')
      {
            cout << "char : " << s[index] << endl;
            if (s[index] == '+' || s[index] == '-')
            {
                  cout << "+-" << endl;
                  if (firstTerm == 0)
                        {
                              if (coef != 0)
                              insertTerm(negativeCoef, coef, exp);
                        }
                  else
                  {
                        firstTerm = 0;
                  }
                  nowExp = 0;
                  if (s[index] == '-')
                        negativeCoef = 1;
                  else
                              negativeCoef = 0;
                        coef = 0;
                        exp = 0;
                  }
                  else if (s[index] == 'x')
                  {
                        cout << "x" << endl;
                        if (s[index+1] != '^')
                              {
                                    cout << "Incorrect formula!" << endl;
                                    head = NULL;
                                    break;
                              }
                  }
                  else if (s[index] == '^')
                  {
                        cout << "^" << endl;
                        nowExp = 1;
                  }
                  else if (s[index]>='0' && s[index]<='9')
                  {
                        cout << "number" << endl;
                        if (nowExp == 0)
                        coef = coef*10 + (s[index]-48);
                        else
                        exp = exp*10 + (s[index]-48);
                  }
                  else
                  {
                        cout << "The formula contains invalid characters: " << s[index] << endl;
                        head = NULL;
                        break;
                  }
                  index++;
            }
            if (coef != 0)
            insertTerm(negativeCoef, coef, exp);
            cout << "done!"<< endl;
}
void Polynomial::print()
{
      TermType* newTerm=head;
      while (newTerm != NULL)
      {
            cout<<newTerm->coefficient<<"x^"<<newTerm->exponent;
            newTerm=newTerm->next;
      }
      cout << endl;
}
int main()
{
      Polynomial p, p1;      
      p.read();
      cout<<"Second Term:"<<endl;
      p1.read();
      //p.print();
      //p1.print();
      p+=(p1);
      system ("pause");
      return 0;
}
0
 
scuzzoAuthor Commented:
I've posted in another topic, if you have time I can really use some more help. Either way, thanks for everything so far.
0
 
scuzzoAuthor Commented:
Lots of work here, every bit was a help.
0
 
AndyAinscowFreelance programmer / ConsultantCommented:
Glad to be of help - pity I didn't post that comment about the OR originally.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 8
  • 8
Tackle projects and never again get stuck behind a technical roadblock.
Join Now