您的位置:首页 > 其它

实验2 一元多项式相加

2017-12-05 13:52 330 查看
【实验内容】

结合书上第41页的例子,采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。此一元多项式遵循多项式相加运算规则:对于两个一元多项式中存在指数相同的项时,其对应系数相加。合并后系数和为零时,删除“和多项式”中此项;合并后系数和不为零时,则构成“和多项式”中的一项。对于两个一元多项式中存在的指数不相同的项,则分别复抄到“和多项式”中去,原多项式保持不变。

【实验目的】

1、了解链式存储结构的基本知识;

2、掌握算法思想和数据结构的描述;

3、结合一元多项式相加的运算规则。

【实验步骤与要求】

1、实验前的准备

(1)了解C语言的基本概念;

(2)了解C语言的基本段落。

2、上机操作

(1)了解链式存储结构的基本知识;

(2)掌握算法思想和数据结构的描述;

(3)掌握一元多项式相加的运算规则。

代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct Elem//多项式元素
{
float coef;//系数
int expn;//指数
struct Elem *next;
}node;
typedef struct link//多项式
{
int size;
node *head;
}Polyn;
Polyn* CreatPolyn()//创建一个多项式
{
Polyn *p=malloc(sizeof(Polyn));
p->head=malloc(sizeof(node));//空的头节点
p->size=0;
p->head->coef=0;
p->head->expn=-1;
p->head->next=NULL;
return p;
}
node* find(Polyn *p,node *t)//在多项式p中寻找当前节点合适的插入位置并返回
{
node *d=p->head;
while(d->next&&d->next->expn<t->expn)//当当前节点的下一个节点的指数大于等于当前待插入节点的指数时退出
{
d=d->next;
}
return d;//返回该位置
}
void add(Polyn *p,node *t)//往一个多项式中假如一个t元素
{
node *d=find(p,t);//用find函数寻找一个合适的插入位置
if(d->next&&d->next->expn==t->expn)//如果d->next存在并且多项式元素的指数等于当前待插入元素的指数
{
if(t->coef+d->next->coef==0)//如果系数相加为0,就直接删除该节点
{
node *temp=d->next;
d->next=d->next->next;
free(temp);
p->size=p->size-1;
}
else//否则就修改多项式中的系数
{
d->next->coef=d->next->coef+t->coef;
}
}
else//表示多项式中找不到与当前待插入元素的指数相同的元素,那么直接插入该位置
{
node *temp=malloc(sizeof(node
4000
));
temp->next=d->next;
temp->coef=t->coef;
temp->expn=t->expn;
d->next=temp;
p->size=p->size+1;
}
}
void print(Polyn *p)//输出多项式内容
{
node *d=p->head->next;
if(p->size==0)//特殊处理多项式没有项的情况
{
printf("0\n");
return;
}
printf("%.2f",d->coef);//特殊处理第一项,为了不输出多余的加号
if(d->expn!=0)
{
printf("X^(%d)",d->expn);
}
d=d->next;
while(d)
{
printf("%+.2f",d->coef);
if(d->expn!=0)//指数为0的时候就不用输出X了
{
printf("X^(%d)",d->expn);
}
d=d->next;
}
printf("\n");
}
void merge(Polyn *la,Polyn *lb)
{
node *d=lb->head->next;
while(d)
{
add(la,d);
node *temp=d;
d=d->next;
free(temp);
}
}
int main()
{
int i,n,m;
node t;
Polyn *link_a=CreatPolyn();//创建一个多项式a
printf("please input the length of a:");
scanf("%d",&n);//输入多项式a的长度
t.next=NULL;
for(i=0;i<n;i++)
{
scanf("%f%d",&t.coef,&t.expn);//先输入每一项的系数再输入每一项的指数
add(link_a,&t);
}
printf("\n");
printf("the size of a is:%d\n",link_a->size);
printf("the polynomial a is:");
print(link_a);
printf("\n");
Polyn *link_b=CreatPolyn();
printf("please input the length of b:");
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%f%d",&t.coef,&t.expn);
add(link_b,&t);
}
printf("\n");
printf("the size of b is:%d\n",link_b->size);
printf("the polynomial b is:");
print(link_b);
merge(link_a,link_b);
printf("\n");
printf("after merging the polynomial a is:");
print(link_a);
free(link_a->head);
free(link_a);
free(link_b->head);
free(link_b);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: