一元多项式的相加

plinknode *add(plinknode *a,plinknode *b)
{
plinknode *head,*p1,*p2,*p3,*p4;
p1=a;
head=a;
p3=b->next;
do
{
p2=p1->next;
if(p2->expn>p3->expn)
{
p1->next=p3;
p4=p3->next;
p3->next=p2;
p3=p4;
p1=p1->next;
}
if(p2->expn==p3->expn)
{
p2->coef=p3->coef+p2->coef;
if(p2->coef==0)
{
p1->next==p2->next;
free(p2);
p4=p3;
free(p3);
p3=p4->next;
p2=p1->next;
}
else
{
p4=p3;
free(p3);
p3=p4->next;
}
}
if(p2->expn<p3->expn)
{
p1=p1->next;
p2=p2->next;
}
}while(p1->next!=NULL&&p3!=NULL);
if(p2!=NULL)
{
p3->next=p2;
free(p3);
}
return (head);
}
其中plinknode已定义:
typedef struct student
{
int coef;
int expn;
struct student *next;
}
plinknode;
请知道的告诉下谢谢了
这只是程序的一小段,目的是为了实现a,b多项式的相加

这是我写的一段程序可以实现多项式的加法、减法、乘法,你可以看一看。
#include<iostream>
using namespace std;

struct node
{
double a;
int n;
node*next;
};

//创建多项式
node * create_polynomial()
{
node *head,*temp,*p,*q;
double a;
int n;
p=q=temp=NULL;
head=new node();//创建头结点
head->a=0;
head->n=0;
head->next=NULL;
cout<<"输出多项式元素的系数与指数,以系数、指数为0、0结束:"<<endl;
cin>>a>>n;
while(a!=0)
{
//创建一个新的节点
temp=new node();
temp->a=a;
temp->n=n;
temp->next=NULL;
if(head->next==NULL)//链表为空直接插在头结点后面 head->next=temp;
else //链表非空
{
p=head;
q=p->next;
while(q&&q->n>=n) //查找合适的插入点
{
p=p->next;
q=q->next;
}
if(q) //找到插入点
{
p->next=temp;
temp->next=q;
}
else //插在链表尾部
p->next=temp;
}
cin>>a>>n;
}
return head;
}
//销毁多项式,释放空间
void destroy_polynomial(node*head)
{
node*p=head->next;
node*q=NULL;
while(p)
{
q=p;
p=p->next;
delete q;
}
delete head;
}
//添加节点
void insert_node(node*head,double a,int n)
{
node*temp,*p,*q;
p=q=temp=NULL;
temp=new node();
temp->a=a;
temp->n=n;
temp->next=NULL;
if(head->next==NULL)//链表为空,直接插在头结点后面
head->next=temp;
else //链表非空
{
p=head;
q=p->next;
while(q&&q->n>=n) //查找合适的插入点
{
p=p->next;
q=q->next;
}
if(q) //找到插入点
{
p->next=temp;
temp->next=q;
}
else //插在链表尾部
p->next=temp;
}
}
//删除节点
void delete_zero(node*head)
{
node*p,*q;
p=head;
q=p->next;
while(q&&q->a!=0)//查找系数为0的节点
{
p=p->next;
q=q->next;
}
if(q)//找到节点
{
p->next=q->next;
delete q;
}
}
//查看指定系数的节点是否在链表中
bool In_Link(node*head,int n)
{
node*p=head->next;
while(p&&p->n!=n)//查找节点
p=p->next;
if(p)//找到节点
return true;
else
return false;
}
//多项式节点相加
void add_node(node*head,double a,int n)
{
node*p=head->next;
while(p->n!=n)
p=p->next;
p->a+=a;
}
//多项式相加
node*add(node*head1,node*head2)
{
node*p;
p=head2->next;
while(p)
{
if(In_Link(head1,p->n))//多项式中有相同指数的节点 add_node(head1,p->a,p->n);
else
insert_node(head1,p->a,p->n);
delete_zero(head1);//删除系数为0的节点
p=p->next;
}
destroy_polynomial(head2);
return head1;
}
//多项式相减
node*minus(node*head1,node*head2)
{
node*p;
p=head2->next;
while(p)
{
if(In_Link(head1,p->n))//多项式中有相同指数的节点
add_node(head1,-(p->a),p->n);
else
insert_node(head1,-(p->a),p->n);
delete_zero(head1);//删除系数为0的节点
p=p->next;
}
destroy_polynomial(head2);
return head1;
}
//多项式乘法
node*multiply(node*head1,node*head2)
{
node*head=NULL;//定义一个结果多项式链表
head=new node();
head->a=0;
head->n;
head->next=NULL;
double a=0;
int n=0;
node*pa,*pb;
pa=head1->next;
while(pa)
{
pb=head2->next;
while(pb)
{
a=(pa->a)*(pb->a);
n=(pa->n)+(pb->n);
if(In_Link(head,n))//结果链表中存在相同系数的节点 add_node(head,a,n);
else
insert_node(head,a,n);
delete_zero(head);//删除系数为0的节点
pb=pb->next;
}
pa=pa->next;
}
return head;
}
//打印多项式
void print_polynomial(node*head)
{
node*p=head->next;
while(p->next)
{
if(p->n==0)
cout<<p->a;
else
cout<<p->a<<"x^"<<p->n;
p=p->next;
if(p->a>0)
cout<<"+";
}
if(p->n==0)
cout<<p->a;
else
cout<<p->a<<"x^"<<p->n;
cout<<endl;
}
int main()
{
node*head1,*head2;
head1=head2=NULL;
head1=create_polynomial();
cout<<"多项式1:"<<endl;
print_polynomial(head1);
head2=create_polynomial();
cout<<"多项式2:"<<endl;
print_polynomial(head2);
head1=minus(head1,head2);
cout<<"多项式相减结果:"<<endl;
print_polynomial(head1);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-20
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
typedef struct student
{
int coef;
int expn;
struct student *next;
}
plinknode;
plinknode *creat(void)
{
plinknode *head,*p1,*p2,*p3,*p4;
int m,n;
printf("gongyoujiedianshu:");
scanf("%d",&m);
p3=(plinknode *)malloc(sizeof(plinknode));
p3->coef=0;
p3->expn=-1;
p4=p3;
head=p3;
for(n=1;n<=m;n++)
{
p3=(plinknode *)malloc(sizeof(plinknode));
printf("zhishu,xishu:");
scanf("%d%d",&p3->coef,&p3->expn);
if(p4->expn<p3->expn)
{
p4->next=p3;
p3->next=NULL;
p4=p4->next;
}
else
{
p1=head;p2=p1->next;
while(p2)
{
if(p2->expn==p3->expn)
{
p2->coef=p2->coef+p3->coef;
free(p3);
if(p2->coef==0)
{
p1->next=p2->next;
free(p2);
if(p2->next==NULL)
{
p4=p1;
}
}
break;
}

if(p2->expn>p3->expn)
{
p1->next=p3;
p3->next=p2;
break;
}
p1=p1->next;
p2=p2->next;
}
}
}
return (head);
}
void print(plinknode *p)
{
plinknode *head;
head=p;
printf("shuchude shi:");
do
{
printf("%d%d\n",head->coef,head->expn);
head=head->next;
}while(head!=NULL);
}
plinknode *add(plinknode *a,plinknode *b)
{
plinknode *head,*p1,*p2,*p3,*p4;
p1=a;
head=a;
p3=b->next;
do
{
p2=p1->next;
if(p2->expn>p3->expn)
{
p1->next=p3;
p4=p3->next;
p3->next=p2;
p3=p4;
p1=p1->next;
}
else if(p2->expn==p3->expn)
{
p2->coef=p3->coef+p2->coef;
if(p2->coef==0)
{
p1->next==p2->next;
free(p2);
p4=p3->next;
free(p3);
p3=p4;
}
else
{
p1=p1->next;
p4=p3->next;
free(p3);
p3=p4;
}
}
else
p1=p1->next;
}while(p1->next!=NULL&&p3!=NULL);
if(p3!=NULL)
{
p2->next=p3;
}
return (head);
}
void main()
{
plinknode *h1,*h2,*h3;
h1=creat();
print(h1);
h2=creat();
print(h2);
h3=add(h1,h2);
print(h3);
}
可以运行,希望对你有帮助本回答被提问者采纳
第2个回答  2010-04-16
建议用数据做!!!!!!
相似回答