/**************************************************************************************
时间:9.19.2015 Saturday
******************************************************************************************/
#include<iostream>
using namespace std;
#include<math.h>
#include<fstream>
//#include<ifstream>
//#include<ofstream>
#define maxsize 1000
/************定义链表指针**********/
struct item
{
int num; //定义系数;
int index; //定义指数;
item *next; //指向该类结构体的指针
};
/************多项式链表新建**********/
item *item_new(item *head,int data[]) //自定义函数,新建多项式链表;
{ // 若3x^6+x^4+5x^7则data为[3 6 1 4 5 7 0 0] 补两个零
if( head==NULL)//分配头节点空间
head=new item;
head->next=NULL; //链表的头节点不存数据信息,但可以存附加信息如链表长度
item *tail=head,*temp; //tail是结构体指针,对tail操作就是对当前节点操作,流水般的操作
for(int i=0;;i++)
{
temp=new item;
temp->next=NULL;
temp->num=data[2*i];
temp->index=data[2*i+1];
tail->next=temp;
tail=temp;
if(temp->num==0&&temp->index==0){
break;
}
}
return head;
}
/************多项式打印**********/
void item_display(const item *head) //自定义函数,输出多项式链表;
{
item *temp;
temp=head->next; //输出时从头指针下一位输出;
for(temp;temp!=NULL;temp=temp->next)
{
if((temp==head->next)||(temp->num<0)) //多项式分第一项和负项,正项除第一项外要有+号
cout<<temp->num<<"x^"<<temp->index;
else
cout<<"+"<<temp->num<<"x^"<<temp->index;
}
cout<<endl;
}
/************多项式链表排序化简**********/
/*item *item_sort(item *head) //链表排序;
{
item *pt,*end,*p1,*p2,*follow;
follow=head;
for(end=NULL;end!=head;end=pt){
for(pt=head->next;pt->next!=end;pt=pt->next)
{
if(pt->index<pt->next->index) //指数不同从大到小排
{
p1=pt;
p2=pt->next;
follow->next=p2;
p1->next=p2->next;
p2->next=p1;
follow=follow->next;
pt=follow->next;
}
if(pt->index==pt->next->index)//指数相同合并同类项
{
p1=pt;
p2=pt->next;
p1->next=p2->next;
p1->num+=p2->next->num;
pt=follow->next;
}
}
}
return head;
}*/
/************多项式链表排序化简**********/
item *item_sort(item *head) //链表排序;
{
item *pt, *follow;
for(follow=head->next;follow->next!=NULL;follow=follow->next){ //像冒泡排序的外循环
for(pt=head->next;pt->next!=NULL;pt=pt->next)
{
if(pt->index<pt->next->index)//指数不同从大到小排
{
int temp1=pt->num;
int temp2=pt->index;
pt->num =pt->next->num;
pt->index=pt->next->index;
pt->next->num=temp1;
pt->next->index=temp2;
}
if(pt->index==pt->next->index)//指数相同合并同类项
{
pt->num+=pt->next->num;
pt->next =pt->next->next;
}
}
}
return head;
}
/************多项式去零项**********/
item *delezero(item *head) //删除链表中系数为0且指数不为零的项;
{
item *temp,*tail;
tail=head;
for(temp=head->next;temp->next!=NULL;temp=temp->next)
{
if(temp->num==0&&temp->index!=0)
{
tail->next=temp->next;
temp=tail; //和temp=temp->next相互结合,注意tail=temp是向后走,这里不是tail=temp
}
}
return head;
}
/************多项式复制函数**********/
item * item_copy(const item *head)
{
item *flag,*tail,*temp,*s1=head->next;
flag=new item;
flag->next =NULL;
tail=flag;
for(int i=0;;i++)
{
temp=new item;
temp->next=NULL;
temp->num=s1->num;
temp->index=s1->index;
s1=s1->next;
tail->next=temp;
tail=temp;
if(s1->next==NULL) //保持链表结构,头节点没有存有效数据,尾节点的两个零也要复制到新的链表中
{
temp=new item;
temp->next=NULL;
temp->num=s1->num;
temp->index=s1->index;
tail->next=temp;
tail=temp;
break;
}
}
return flag;
}
/************多项式加法计算**********/
item *item_add(const item *head1, const item *head2){ //计算多项式加法
item *flag1,*flag2;
flag1=item_copy(head1);
flag2=item_copy(head2);
item *temp,*p=NULL;
for(temp=flag1;temp->next!=NULL;temp=temp->next)
p=temp;
p->next=flag2->next;
flag1=item_sort(flag1);
flag1=delezero(flag1);
return flag1;
}
/************多项式减法计算**********/
item *item_sub(const item *head1,const item *head2){ //计算多项式减法;
item *flag1,*flag2;
flag1=item_copy(head1);
flag2=item_copy(head2);
item *temp;
for(temp=flag2->next;temp!=NULL;temp=temp->next){ //将第二个多项式的各项系数变为其相反数;
temp->num=(-1)*temp->num;
}
flag1=item_add(flag1,flag2); //利用加法实现减法运算;
return flag1;
}
/************多项式乘法**********/
item *item_mul(const item *head1, const item *head2){
item *temp1=head1->next,*temp2=head2->next,*head=NULL,*tail;
/*cout<<"================"<<endl;
item_display(head1);
item_display(head2);*/
if(head==NULL)//分配头节点空间
{head=new item;
head->next=NULL;
}
tail=head;
for(temp1;temp1->next!=NULL;temp1=temp1->next){
temp2=head2->next; //调试了一个多小时,终于把这句揪出来了
for(temp2;temp2->next!=NULL;temp2=temp2->next)
{
item *p;
p=new item;
p->next=NULL;
p->num=temp1->num*temp2->num;
p->index=temp1->index+temp2->index;
tail->next=p;
tail=p;
}
}
item *last;
last=new item;
last->next=NULL;
last->num=0;
last->index=0;
tail->next=last;
/*item_display(head);*/
head=item_sort(head);
head=delezero(head);
return head;
}
/************多项式求值**********/
double item_evalu(const item *head,double x)
{
double sum=0;
item *temp=head->next;
for(temp;temp->next!=NULL;temp=temp->next)
sum=sum+pow(x,temp->index)*(temp->num);
return sum;
}
/************多项式输出至文件**********/
void item_fileout(item *head)
{
item *temp=head->next;
ofstream file;
file.open("H:\\save.txt",ios::app);
if(file.fail())
{
cerr<<"文件打开失败!"<<endl;
exit(0);
}
file<<"p(x)=";
for(temp;temp->next!=NULL;temp=temp->next)
{
if(temp->num<0||temp==head->next)
file<<temp->num<<"x^"<<temp->index;
if(temp->num>0&&temp!=head->next)
file<<"+"<<temp->num<<"x^"<<temp->index;
}
file<<"\n";
file.close();
}
/************多项式输读入至系统**********/
item *item_filein(char *filename)
{
item *head=NULL;
ifstream file;
char charData[maxsize];
char ch;
file.open(filename,ios::in);
if(file.fail())
{
cerr<<"文件打开失败!"<<endl;
exit(0);
}
int i=0;
while(file.get(ch)){ //把文件中的多项式表达式读入内存charData[]中
charData[i]=ch;
i++;
}
file.close();
int data[maxsize];
int num=0,count=0,k=0;
for(int j=0;j<=i-1;) //提取多项式中有用的数字信息到内存data[]中
{
if(charData[j]=='-')
{
num=0;
k=1;
while(charData[j+k]>='0'&&charData[j+k]<='9'){
num=10*num+((int)charData[j+k]-48);
k++;
}
num=-num;
data[count]=num;
j=j+k;
count++;
continue;
}
if(charData[j]>='0'&&charData[j]<='9'){
k=0;
num=0;
while(charData[j+k]>='0'&&charData[j+k]<='9')
{
num=10*num+((int)charData[j+k]-48);
k++;
}
data[count]=num;
j=j+k;
count++;
continue;
}
j++;
}
head=item_new(head,data);
return head;
}
int main(void)
{
//**************这部分是关于文件读写的操作*********************************
/*item *head1,*head2,*head;
char *st1="head1.txt",*st2="head2.txt";
head1=item_filein(st1);
head2=item_filein(st2);
head=NULL;*/
//************************************************************
//****************简单测试代替文件操作实现*******************************
item *head1,*head2,*head;
//int data1[8]={3,6,1,4,5,7,0,0}; //3x^6+x^4+5x^7
//int data2[8]={3,4,-1,4,4,6,0,0}; //3x^4-x^4+4x^6
//另一个例子
int data1[8]={5,2,3,3,1,2,0};
int data2[8]={3,4,1,3,1,2,0};
head=NULL;
head1=item_new(head,data1);
head2=item_new(head,data2);
// item_fileout(head1);//把多项式输出到文件,注意是在哪个磁盘中
//item_fileout(head2);//这个多项式将会添加到原来创建的文件的后面,因为item_fileout是以app添加
//*************************************************************************
int chose;
do{
cout<<"&====================================&"<<endl;
cout<<"& **********多项式运算系统********** &"<<endl;
cout<<"&====================================&"<<endl;
cout<<"& ***********1.多项式求值*********** &"<<endl;
cout<<"& ***********2.多项式相加*********** &"<<endl;
cout<<"& ***********3.多项式相减*********** &"<<endl;
cout<<"& ***********4.多项式相乘*********** &"<<endl;
cout<<"& ***********0.退出此系统*********** &"<<endl;
cout<<"& ********* 其他任意数字可以退出 *** &"<<endl;
cout<<"&====================================&"<<endl;
cout<<"请选择操作:";
cin>>chose;
switch(chose)
{
case 0:
break;
case 1:
double x;
cout<<"多项式p1(x)=";
item_display(head1);
cout<<"x=";
cin>>x;
cout<<"p1("<<x<<")="<<item_evalu(head1,x);
cout<<endl; //换行才不会影响到导航菜单,因为调用的函数中输出时没有处理换行
break;
case 2:
cout<<endl<<"多项式p1(x)=";
item_display(head1);
cout<<endl<<"多项式p2(x)=";
item_display(head2);
head=item_add(head1,head2);
cout<<endl<<"p1(x)+p2(x)=";
item_display(head);
break;
case 3:
cout<<endl<<"多项式p1(x)=";
item_display(head1);
cout<<endl<<"多项式p2(x)=";
item_display(head2);
head=item_sub(head1,head2);
cout<<endl<<"p1(x)-p2(x)=";
item_display(head);
break;
case 4:
cout<<endl<<"多项式p1(x)=";
item_display(head1);
cout<<endl<<"多项式p2(x)=";
item_display(head2);
head=item_mul(head1,head2);
cout<<endl<<"p1(x)*p2(x)=";
item_display(head);
break;
default:
break;
}
}while(chose>=0&&chose<=4);
system("pause");
return 0;
}
时间:9.19.2015 Saturday
******************************************************************************************/
#include<iostream>
using namespace std;
#include<math.h>
#include<fstream>
//#include<ifstream>
//#include<ofstream>
#define maxsize 1000
/************定义链表指针**********/
struct item
{
int num; //定义系数;
int index; //定义指数;
item *next; //指向该类结构体的指针
};
/************多项式链表新建**********/
item *item_new(item *head,int data[]) //自定义函数,新建多项式链表;
{ // 若3x^6+x^4+5x^7则data为[3 6 1 4 5 7 0 0] 补两个零
if( head==NULL)//分配头节点空间
head=new item;
head->next=NULL; //链表的头节点不存数据信息,但可以存附加信息如链表长度
item *tail=head,*temp; //tail是结构体指针,对tail操作就是对当前节点操作,流水般的操作
for(int i=0;;i++)
{
temp=new item;
temp->next=NULL;
temp->num=data[2*i];
temp->index=data[2*i+1];
tail->next=temp;
tail=temp;
if(temp->num==0&&temp->index==0){
break;
}
}
return head;
}
/************多项式打印**********/
void item_display(const item *head) //自定义函数,输出多项式链表;
{
item *temp;
temp=head->next; //输出时从头指针下一位输出;
for(temp;temp!=NULL;temp=temp->next)
{
if((temp==head->next)||(temp->num<0)) //多项式分第一项和负项,正项除第一项外要有+号
cout<<temp->num<<"x^"<<temp->index;
else
cout<<"+"<<temp->num<<"x^"<<temp->index;
}
cout<<endl;
}
/************多项式链表排序化简**********/
/*item *item_sort(item *head) //链表排序;
{
item *pt,*end,*p1,*p2,*follow;
follow=head;
for(end=NULL;end!=head;end=pt){
for(pt=head->next;pt->next!=end;pt=pt->next)
{
if(pt->index<pt->next->index) //指数不同从大到小排
{
p1=pt;
p2=pt->next;
follow->next=p2;
p1->next=p2->next;
p2->next=p1;
follow=follow->next;
pt=follow->next;
}
if(pt->index==pt->next->index)//指数相同合并同类项
{
p1=pt;
p2=pt->next;
p1->next=p2->next;
p1->num+=p2->next->num;
pt=follow->next;
}
}
}
return head;
}*/
/************多项式链表排序化简**********/
item *item_sort(item *head) //链表排序;
{
item *pt, *follow;
for(follow=head->next;follow->next!=NULL;follow=follow->next){ //像冒泡排序的外循环
for(pt=head->next;pt->next!=NULL;pt=pt->next)
{
if(pt->index<pt->next->index)//指数不同从大到小排
{
int temp1=pt->num;
int temp2=pt->index;
pt->num =pt->next->num;
pt->index=pt->next->index;
pt->next->num=temp1;
pt->next->index=temp2;
}
if(pt->index==pt->next->index)//指数相同合并同类项
{
pt->num+=pt->next->num;
pt->next =pt->next->next;
}
}
}
return head;
}
/************多项式去零项**********/
item *delezero(item *head) //删除链表中系数为0且指数不为零的项;
{
item *temp,*tail;
tail=head;
for(temp=head->next;temp->next!=NULL;temp=temp->next)
{
if(temp->num==0&&temp->index!=0)
{
tail->next=temp->next;
temp=tail; //和temp=temp->next相互结合,注意tail=temp是向后走,这里不是tail=temp
}
}
return head;
}
/************多项式复制函数**********/
item * item_copy(const item *head)
{
item *flag,*tail,*temp,*s1=head->next;
flag=new item;
flag->next =NULL;
tail=flag;
for(int i=0;;i++)
{
temp=new item;
temp->next=NULL;
temp->num=s1->num;
temp->index=s1->index;
s1=s1->next;
tail->next=temp;
tail=temp;
if(s1->next==NULL) //保持链表结构,头节点没有存有效数据,尾节点的两个零也要复制到新的链表中
{
temp=new item;
temp->next=NULL;
temp->num=s1->num;
temp->index=s1->index;
tail->next=temp;
tail=temp;
break;
}
}
return flag;
}
/************多项式加法计算**********/
item *item_add(const item *head1, const item *head2){ //计算多项式加法
item *flag1,*flag2;
flag1=item_copy(head1);
flag2=item_copy(head2);
item *temp,*p=NULL;
for(temp=flag1;temp->next!=NULL;temp=temp->next)
p=temp;
p->next=flag2->next;
flag1=item_sort(flag1);
flag1=delezero(flag1);
return flag1;
}
/************多项式减法计算**********/
item *item_sub(const item *head1,const item *head2){ //计算多项式减法;
item *flag1,*flag2;
flag1=item_copy(head1);
flag2=item_copy(head2);
item *temp;
for(temp=flag2->next;temp!=NULL;temp=temp->next){ //将第二个多项式的各项系数变为其相反数;
temp->num=(-1)*temp->num;
}
flag1=item_add(flag1,flag2); //利用加法实现减法运算;
return flag1;
}
/************多项式乘法**********/
item *item_mul(const item *head1, const item *head2){
item *temp1=head1->next,*temp2=head2->next,*head=NULL,*tail;
/*cout<<"================"<<endl;
item_display(head1);
item_display(head2);*/
if(head==NULL)//分配头节点空间
{head=new item;
head->next=NULL;
}
tail=head;
for(temp1;temp1->next!=NULL;temp1=temp1->next){
temp2=head2->next; //调试了一个多小时,终于把这句揪出来了
for(temp2;temp2->next!=NULL;temp2=temp2->next)
{
item *p;
p=new item;
p->next=NULL;
p->num=temp1->num*temp2->num;
p->index=temp1->index+temp2->index;
tail->next=p;
tail=p;
}
}
item *last;
last=new item;
last->next=NULL;
last->num=0;
last->index=0;
tail->next=last;
/*item_display(head);*/
head=item_sort(head);
head=delezero(head);
return head;
}
/************多项式求值**********/
double item_evalu(const item *head,double x)
{
double sum=0;
item *temp=head->next;
for(temp;temp->next!=NULL;temp=temp->next)
sum=sum+pow(x,temp->index)*(temp->num);
return sum;
}
/************多项式输出至文件**********/
void item_fileout(item *head)
{
item *temp=head->next;
ofstream file;
file.open("H:\\save.txt",ios::app);
if(file.fail())
{
cerr<<"文件打开失败!"<<endl;
exit(0);
}
file<<"p(x)=";
for(temp;temp->next!=NULL;temp=temp->next)
{
if(temp->num<0||temp==head->next)
file<<temp->num<<"x^"<<temp->index;
if(temp->num>0&&temp!=head->next)
file<<"+"<<temp->num<<"x^"<<temp->index;
}
file<<"\n";
file.close();
}
/************多项式输读入至系统**********/
item *item_filein(char *filename)
{
item *head=NULL;
ifstream file;
char charData[maxsize];
char ch;
file.open(filename,ios::in);
if(file.fail())
{
cerr<<"文件打开失败!"<<endl;
exit(0);
}
int i=0;
while(file.get(ch)){ //把文件中的多项式表达式读入内存charData[]中
charData[i]=ch;
i++;
}
file.close();
int data[maxsize];
int num=0,count=0,k=0;
for(int j=0;j<=i-1;) //提取多项式中有用的数字信息到内存data[]中
{
if(charData[j]=='-')
{
num=0;
k=1;
while(charData[j+k]>='0'&&charData[j+k]<='9'){
num=10*num+((int)charData[j+k]-48);
k++;
}
num=-num;
data[count]=num;
j=j+k;
count++;
continue;
}
if(charData[j]>='0'&&charData[j]<='9'){
k=0;
num=0;
while(charData[j+k]>='0'&&charData[j+k]<='9')
{
num=10*num+((int)charData[j+k]-48);
k++;
}
data[count]=num;
j=j+k;
count++;
continue;
}
j++;
}
head=item_new(head,data);
return head;
}
int main(void)
{
//**************这部分是关于文件读写的操作*********************************
/*item *head1,*head2,*head;
char *st1="head1.txt",*st2="head2.txt";
head1=item_filein(st1);
head2=item_filein(st2);
head=NULL;*/
//************************************************************
//****************简单测试代替文件操作实现*******************************
item *head1,*head2,*head;
//int data1[8]={3,6,1,4,5,7,0,0}; //3x^6+x^4+5x^7
//int data2[8]={3,4,-1,4,4,6,0,0}; //3x^4-x^4+4x^6
//另一个例子
int data1[8]={5,2,3,3,1,2,0};
int data2[8]={3,4,1,3,1,2,0};
head=NULL;
head1=item_new(head,data1);
head2=item_new(head,data2);
// item_fileout(head1);//把多项式输出到文件,注意是在哪个磁盘中
//item_fileout(head2);//这个多项式将会添加到原来创建的文件的后面,因为item_fileout是以app添加
//*************************************************************************
int chose;
do{
cout<<"&====================================&"<<endl;
cout<<"& **********多项式运算系统********** &"<<endl;
cout<<"&====================================&"<<endl;
cout<<"& ***********1.多项式求值*********** &"<<endl;
cout<<"& ***********2.多项式相加*********** &"<<endl;
cout<<"& ***********3.多项式相减*********** &"<<endl;
cout<<"& ***********4.多项式相乘*********** &"<<endl;
cout<<"& ***********0.退出此系统*********** &"<<endl;
cout<<"& ********* 其他任意数字可以退出 *** &"<<endl;
cout<<"&====================================&"<<endl;
cout<<"请选择操作:";
cin>>chose;
switch(chose)
{
case 0:
break;
case 1:
double x;
cout<<"多项式p1(x)=";
item_display(head1);
cout<<"x=";
cin>>x;
cout<<"p1("<<x<<")="<<item_evalu(head1,x);
cout<<endl; //换行才不会影响到导航菜单,因为调用的函数中输出时没有处理换行
break;
case 2:
cout<<endl<<"多项式p1(x)=";
item_display(head1);
cout<<endl<<"多项式p2(x)=";
item_display(head2);
head=item_add(head1,head2);
cout<<endl<<"p1(x)+p2(x)=";
item_display(head);
break;
case 3:
cout<<endl<<"多项式p1(x)=";
item_display(head1);
cout<<endl<<"多项式p2(x)=";
item_display(head2);
head=item_sub(head1,head2);
cout<<endl<<"p1(x)-p2(x)=";
item_display(head);
break;
case 4:
cout<<endl<<"多项式p1(x)=";
item_display(head1);
cout<<endl<<"多项式p2(x)=";
item_display(head2);
head=item_mul(head1,head2);
cout<<endl<<"p1(x)*p2(x)=";
item_display(head);
break;
default:
break;
}
}while(chose>=0&&chose<=4);
system("pause");
return 0;
}