/*-----------上面代码有个错误print声明时参数与定义是不一样,这两天改昏头了------------------*/
/*---------------------------两个一元多项式相加----------------------------------------------------*/
/*---------------------------用两个链表结构储存----------------------------------------------------*/
/*---------------------------以第一个链表为基础合并在一起实现加法----------------------------------*/
#include<iostream>
using namespace std;
//节点
struct Node{
float x;
//系数
int y;
//指数
Node *next;
};
Node *Creat(Node *p);//创建链表
Node *add(Node *p1,Node *p2);//2个链表相加
void print(Node *p);//打印链表
*p
int main()
{
Node *p1,*p2;
p1=NULL;
p2=NULL;
cout<<"请依次输入第一个一元多项式的系数和指数次数(请按指数从小到大排列输入):"<<endl;
*Creat(p1);
cout<<endl<<"请依次输入第二个一元多项式的系数和指数次数(请按指数从小到大排列输入):"<<endl;
cout<<"按下回车进入加法,并打印结果!"<<endl;
*Creat(p2);
*add(p1,p2);
print(p1);
system("pause");
return 0;
}
Node *Creat(Node *p)//创建链表
{
Node *p1,*p2;
p=NULL;
p1=new Node;
p2=p1;
cin>>p1->x>>p1->y;
while(!(p1->x=-1))
{
if(p==NULL)
p=p1;
else
p2->next=p1;
p2=p1;
p1=new Node;
cin>>p1->x>>p1->y;
}
p2->next=NULL;
delete p1;
return p;
}
Node *add(Node *p1,Node *p2)//2个链表相加
{
Node *p,*q;
p=p1;
q=p2;
while(p->next&&q->next)
//不不尾节点进入循环
{
if(p->y==q->y)
//若指数相等
{
p->x=p->x+q->x;
//则系数相加
p=p->next;
//指向下一个节点
q=q->next;
}
else if( p->y < q->y )//若指数小于
{
Node *m,*n;
m=p->next;
n=q->next;
p->next=q;
//第一个多项式p->next指向第二个多想是的q节点
q->next=m;
//修改指针指向操作
p=m;
q=n;
}
else
//若指数大于同样修改指针指向操作
{
Node *m,*n;
m=p;
n=q->next;
p=q;
q->next=m;
p=m->next;
q=n;
}
}
p=p1;
//返回第一个链表首地址
while(p->y==p->next->y)
//用循环实现消除x^2+x^3与x^1+x^2产生的x^1+x^2+x^2+x^3的情况
{
p->x=p->x+p->next->x;
p->next=p->next->next;
p=p->next;
if(p==NULL) break;
}
return p1;
}
void print(Node *p)//打印链表
{
Node *q;
q=p;
cout<<"正在打印:"<<endl;
while(q!=NULL)
{
cout<<q->x<<"x exp "<<q->y<<"次+";
q=q->next;
}
}
[
本帖最后由 s951360702 于 2013-3-28 18:45 编辑 ]