一、实验目的:
1.掌握用 C语言调试程序的基本方法。
2.掌握链表的建立、多项式的加减法。
二、实验题目设计一个一元稀疏多项式的加减运算。
如:,
三、实验要求 1. 通过键盘输入两个任意多项式。
先输入第一个多项式,然后输入第二个多项式。
对每个多项式,先输入“项数”、分别输入各个元素的“指数”、“ 系数”。
2. 形如以下输出:A(x)=:7x^0+3x^1+9x^8+5x^17B(x)=:8x^1+22x^7-9x^8 A(x)+B(x)=:7x^0+11x^1+22x^7+5x^17A(x)*B(x)=:对于空多项式请输出:0。
其中系数为1的项照样数1,指数为0、1照样把指数和系数输出来。四、实验方法 可以通过链表实现。结点结构可以是:
typedef struct Lnode
{ int coef;//多项式系数
int expo n;//多项式指数
struct Lnode *next;//下一个结点
}poly_node,* polynomial;
请输入第1个多项式系数,和指数:
coef,exp= 3 3
请输入第2个多项式系数,和指数:
coef,exp= -2 2
请输入第3个多项式系数,和指数:
coef,exp= 5 0
请输入第4个多项式系数,和指数:
coef,exp= 4 4
请输入多项式的项数:n=
5
请输入第1个多项式系数,和指数:
coef,exp= -1 1
请输入第2个多项式系数,和指数:
coef,exp= 2 2
请输入第3个多项式系数,和指数:
coef,exp= 4 4
请输入第4个多项式系数,和指数:
coef,exp= 3 3
请输入第5个多项式系数,和指数:
coef,exp= 4 0
A(x)=:4x^4+3x^3-2x^2+5B(x)=:4x^4+3x^3+2x^2-1x^1+4
A(x)+B(x)=:8x^4+6x^3-1x^1+9
Process returned 0 (0x0) execution time : 38.428 s
#include <iostream>
#include<stdlib.h>
#define ElemType1 int
#define ElemType2 int
using namespace std;
typedef struct Lnode{
ElemType1 coef;//多项式系数
ElemType2 n;//多项式指数
struct Lnode *next;//下一个结点
}poly_node,* polynomial;
void InitPoly_node(polynomial &L)
{
L=(poly_node*)malloc(sizeof(poly_node));
if(L==NULL)
{
cout<<"分配空间失败"<<endl;
return;
}
L->next=NULL;
}
void InputPolynominal(polynomial &L) //n位多项式的项数
{
cout<<"请输入多项式的项数:n="<<endl;
int n;
cin>>n;
poly_node *p=L;
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个多项式系数,和指数:"<<endl;
ElemType1 coef;
ElemType2 exp;
cout<<"coef,exp="<<'\t';
cin>>coef;
cin>>exp;
poly_node *s=(poly_node*)malloc(sizeof(poly_node));
if(s==NULL)
{
cout<<"分配空间失败"<<endl;
return;
}
s->coef=coef;
s->n=exp;
s->next=p->next;
p->next=s;
p=s;
}
}
void BubbleSortPolynominal(polynomial &L)
{
int i,count = 0,num;//count记录链表结点的个数,num进行内层循环,
poly_node *p,*q,*tail;//创建三个指针,进行冒泡排序
p = L;
while(p->next != NULL)//计算出结点的个数
{
count++;//注释①
p = p->next;
}
for(i=0;i < count - 1;i++)//外层循环,跟数组冒泡排序一样
{
num = count - i - 1;//记录内层循环需要的次数,跟数组冒泡排序一样,
q=L->next;//令q指向第一个结点
p=q->next;//令p指向后一个结点
tail=L;//让tail始终指向q前一个结点,方便交换,也方便与进行下一步操作
while(num--)//内层循环 次数跟数组冒泡排序一样
{
if(q->n < p->n)//如果该结点的值大于后一个结点,则交换
{
q->next=p->next;
p->next=q;
tail->next=p;
}
tail = tail->next;//注释②
q=tail->next;//注释②
p=q->next;//注释②
}
}
}
void PrintPolynominal(polynomial L)
{
L=L->next;
if(L->n==0) cout<<L->coef;
else cout<<L->coef<<"x^"<<L->n;
L=L->next;
while(L!=NULL)
{
if(L->n==0){
if(L->coef>0)
cout<<'+'<<L->coef;
else if(L->coef<0)
cout<<L->coef;
else{}
}
else{
if(L->coef>0)
cout<<'+'<<L->coef<<"x^"<<L->n;
else if(L->coef<0)
cout<<L->coef<<"x^"<<L->n;
else{}
}
L=L->next;
}
cout<<endl;
}
polynomial AdditionPolynomial(polynomial a,polynomial b)
{
polynomial c=(poly_node*)malloc(sizeof(poly_node));
if(c==NULL)
{
cout<<"分配空间失败"<<endl;
return NULL;
}
c->next=NULL;
poly_node *pa=a->next,*pb=b->next,*pc=c;
while(pa&&pb){
if(pa->n<pb->n){
poly_node * s=(poly_node*)malloc(sizeof(poly_node));
s->n=pb->n;
s->coef=pb->coef;
s->next=pc->next;
pc->next=s;
pc=s;
pb=pb->next;
}
else if(pa->n>pb->n){
poly_node * s=(poly_node*)malloc(sizeof(poly_node));
s->n=pa->n;
s->coef=pa->coef;
s->next=pc->next;
pc->next=s;
pc=s;
pa=pa->next;
}
else{
ElemType1 sum=pa->coef+pb->coef;
if(sum!=0){
poly_node * s=(poly_node*)malloc(sizeof(poly_node));
s->coef=sum;
s->n=pa->n;
s->next=pc->next;
pc->next=s;
pc=s;
pa=pa->next;
pb=pb->next;
}
else{
pa=pa->next;
pb=pb->next;
}
}
}
if(pa == NULL &&pb== NULL)
pc->next = NULL;
if(pa!=NULL){
pc->next = pa;
}
if(pb!=NULL){
pc->next = pb;
}
return c;
}
int main()
{
polynomial La,Lb;
InitPoly_node(La);
InputPolynominal(La);
BubbleSortPolynominal(La);
InitPoly_node(Lb);
InputPolynominal(Lb);
BubbleSortPolynominal(Lb);
polynomial Lc=AdditionPolynomial(La,Lb);
cout<<"A(x)=:";
PrintPolynominal(La);
cout<<'\n';
cout<<"B(x)=:";
PrintPolynominal(Lb);
cout<<'\n';
cout<<"A(x)+B(x)=:";
PrintPolynominal(Lc);
cout<<'\n';
return 0;
}
如果要想项数时递增排列,直接修改冒泡排序的
if(q->n < p->n)//如果该结点的值大于后一个结点,则交换