多项式的运算之链表实现

/**************************************************************************************
  时间: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;
}
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值