把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
1. 工作指针p、q初始化;
2. while(p存在且q存在)执行下列三种情形之一
2.1 如果p->exp<q->exp,则指针p后移;
2.2 如果p->exp>q->exp,则
2.2.1 将结点q插入到结点p之前;
2.2.2 指针q指向原指结点的下一个结点;
2.3 如果p->exp=q->exp,则
2.3.1 p->coef =p->coef+q–>coef;
2.3.2 如果p->coef ==0,则执行下列操作,否则,指针p后移;
2.3.2.1 删除结点p;
2.3.2.2 使指针p指向它原指结点的下一个结点;
2.3.3 删除结点q;
2.3.4 使指针q指向它原指结点的下一个结点;
3. 如果q不为空,将结点q链接在第一个单链表的后面;
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct Poly
{
int coef;//表示系数
int exp;//表示次数(指数)
struct Poly *next;
}poly;
void createlist (poly *&l,int *a,int n)//头插法创建
{
poly *s;
l=(poly*)malloc(sizeof(poly));//创建头结点
l->next=NULL;
for(int i=n-1;i>=0;i--)//循环建立数据结点,因为是头插法,要使数组排列顺序不变,我们逆序输入
{
s=(poly*)malloc(sizeof(poly));
s->coef=a[i];
s->exp=i;
s->next=l->next;//头插
l->next=s;
}
}
void display(poly *l)//把多项式显示出来
{
poly *temp;//temp是临时结点,用于释放被删结点
poly *p;//p是活动指针
p=l;
while(p!=NULL&&p->next!=NULL)//删除零系数结点
{
if(p->next->coef==0)
{
temp=p->next;
p->next=temp->next;
free(temp);
}
p=p->next;
}
p=l->next;
while(p!=NULL)
{
if(p->next==NULL||p->next->coef<0)//最后一项和负项不加+
{
printf("%dx^%d",p->coef,p->exp);
}
else
{
printf("%dx^%d+",p->coef,p->exp);
}
p=p->next;
}
printf("\n");
}
void sum(poly *&L1,poly *&L2)//多项式求和
{
poly *p,*q;
poly *temp;//temp是临时结点,用于释放被删结点
p=L1;
q=L2;
while(p->next!=NULL&&q->next!=NULL)
{
if(p->next->exp < q->next->exp)//如果次数不匹配则后移p指针
{
p=p->next;
}
if(p->next->exp > q->next->exp)//如果次数不匹配 将结点q插入到结点p之前
{
poly *mtemp=(poly*)malloc(sizeof(poly));//创建并复制新节点插入
mtemp->coef=q->next->coef;
mtemp->exp=q->next->exp;
mtemp->next=p->next;
p->next=mtemp;
q=q->next;//指针q指向原指结点的下一个结点;
}
if(p->next->exp==q->next->exp)//如果次数一样则相加
{
p->next->coef=p->next->coef+q->next->coef;//加到p上
p=p->next;
q=q->next;
}
}
if(q!=NULL)//如果q的某一项次数比p的所有项次数都大则衔接再后面
{
p=q->next;
}
while(p!=NULL && p->next!=NULL)//删除零系数结点
{
if(p->next->coef==0)
{
temp=p->next;
p->next=temp->next;
free(temp);
}
p=p->next;
}
}
int main()
{
int n;
printf("请输入最高次数:");
scanf("%d",&n);
int *p,*q;
p=(int*)malloc(sizeof(int)*n);//创建数组p,数组下标为次数,元素为系数
q=(int*)malloc(sizeof(int)*n);//创建数组q,数组下标为次数,元素为系数
printf("请输入多项式p的系数:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
printf("请输入多项式q的系数:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
poly *l1,*l2;
createlist(l1,p,n);
createlist(l2,q,n);
printf("多项式p为:\n\n");
display(l1);
printf("多项式q为:\n\n");
display(l2);
sum(l1,l2);
printf("\n\n\n");
printf("求和为:\n");
display(l1);
system("pause");
}

0 条评论