I am trying to built the program for handling polynomial... using linklist.... and so far i tried to implement in the Class to add the 2 polynomial using the operator overloading i got messed up with the some objects.... i have commented the parts please help.....
#include<iostream>
using namespace std;
#define Linux //Remove this for running in windows
#ifdef Linux
#define cls system("clear")
#include <termios.h>
#include <unistd.h>
int getch();
int getch()
{
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt= oldt;
newt.c_lflag &= ~(ICANON| ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch= getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
#else
#include<conio.h>
#define cls system("cls")
#endif
#include<stdio.h>
//#include<string.h>
#include<math.h>
typedef struct node *Nodeptr;
struct node
{
int cof;
int pow;
node *link;
};
struct polptr
{
Nodeptr front,
rear;
};
class Polynomial
{
private:
polptr pptr;
void add_rear(int, int);
public:
Polynomial();
void feed();
void display();
//char pol_modi(, int,int);
Polynomial operator + (Polymonial P2);
};
Polynomial::Polynomial()
{
pptr.front=NULL;
pptr.rear=NULL;
}
void menu();
int main()
{
menu();
return 0;
}
#define Extra_Options1 case 'f': case 'F':
void menu()
{
Polynomial P1, P2;
for(;;)
{
cls;
cout<<"Polynomial Puppetting\n"
<<"\n1. Feed P1"
<<"\n2. Feed P2"
<<"\n3. Display P1"
<<"\n4. Display P2"
<<"\n5. Add P1=P1+P2"
<<"\n6. Analyse"
<<"\n7. Solve"
<<"\n8. Plot"
<<"\n\nEnter your choice: ";
switch(getch())
{
case '1': Extra_Options1;
cls;
P1.feed();
break;
case '2':
cls;
P2.feed();
break;
case '3': case 'd': case 'D':
cls;
P1.display();
getch();
break;
case '4':
cls;
P2.display();
getch();
break;
case '5':
cls;
//add(P1, P2);
break;
case 27: return;
}
}
}
void Polynomial::add_rear(int info=0, int pow=0)
{
if(info==0)
{
cout<<"Error: add_rear>>info feed=NULL";
return;
}
Nodeptr temp=new node;
temp->cof=info;
temp->pow=pow;
temp->link=NULL;
if(pptr.front==NULL) pptr.front=temp;
else pptr.rear->link=temp;
pptr.rear=temp;
}
/*
Building later.. on
char pol_modi(char pos, int info=0, int pow=0)
{
switch(pos)
{
case 'r':
rear->cof=info;
rear->pow=pow;
break;
case 'p': //info=default
rear->pow=pow;
return 0;
}
return 0;
}
*/
void Polynomial::feed()
{
char str[30], catchy[6], flag_pow=0;
int no=0, sign=+1, i;
cout<<"Enter the expression: ";
scanf("%s",&str);
for(i=0; str[i]!='\0'; i++)
{
if(str[i]>='0' && str[i]<='9')
{
no=no*10+(str[i]-48);
continue;
}
/*
//building it later after it completes....
if(strcmp(catchy,"ln"));
if(strcmp(catchy,"log"));
if(strcmp(catchy,"sin"));
if(strcmp(catchy,"sin"));
if(strcmp(catchy,"cos"));
if(strcmp(catchy,"tan"));
if(strcmp(catchy,"cot"));
if(strcmp(catchy,"sec"));
if(strcmp(catchy,"cosec"));
*/
switch(str[i])
{
case 'x': case 'y': case 'z':
if(no==0) no=1;
add_rear(sign*no,1);
no=0;
break;
case '^':
flag_pow='p';
no=0;
break;
case 'e': break;
case '-':
case '+':
if(no!=0)
{
if(flag_pow=='p')
{
pptr.rear->pow=no;
flag_pow=0;
}
else add_rear(sign*no);
no=0;
}
if(str[i]=='-') sign=-1;
else sign=+1;
break;
};
}
if(str[i]=='\0' && no!=0)
{
if(flag_pow=='p')
{
pptr.rear->pow=no;
flag_pow=0;
}
else add_rear(sign*no);
}
}
//Problem... in this
Polynomial operator + (Polymonial P2);
{
if(pptr.front==NULL && P2.pptr.front==NULL)
{
cout<<"Polynomial are empty !!";
getch();
return Polynomial; //Temporary Instance
}
else
if(pptr.front==NULL && P2.pptr.front!=NULL)
{
cout<<"P2 is void";
getch();
return P2; //pointer copied not address so
}
else
if(pptr.front!=NULL && P2.pptr.front==NULL)
{
//Problem in it how to return the same objects.....
cout<<"P1 is void";
getch();
return ;
}
else
{
//Not yet corrected
Nodeptr temp1, temp2, store;
for(temp1=P1.front; temp1!=NULL; temp1=temp1->link)
{
for(store=temp2=P2.front; temp2!=NULL; temp2=temp2->link)
{
if(temp1->pow==temp2->pow)
{
temp1->cof=temp1->cof+temp2->cof;
//comparition if its the first node or not
if(temp2==P2.front) P2.front->link=temp2->link;
else store->link=temp2->link;
delete temp2;
break;
}
store=temp2;
}
temp2=P2.front;
}
while(temp2!=NULL)
{
P1.rear->link=temp2;
temp2=temp2->link;
}
cout<<"Polynomial successfully added";
getch();
}
}
void Polynomial::display()
{
if(pptr.front==NULL)
{
cout<<"Data feed void!!!";
return;
}
Nodeptr temp=pptr.front;
while(temp!=NULL)
{
if(temp->cof>0) cout<<'+';
switch(temp->pow)
{
case 0: cout<<temp->cof; break;
case 1:
if(temp->cof!=1) cout<<temp->cof;
cout<<'x';
break;
default:
if(temp->cof!=1) cout<<temp->cof;
cout<<"x^"<<temp->pow;
}
temp=temp->link;
}
}