数据结构:一元多项式的表示与相加
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一一元多项式的表示与相加
实验目的:
1.复习并熟练掌握数据结构所使用的程序设计语言——C语言;
2.学会单步跟踪、调试自己的程序;
3.加深对线性表特别是链表知识的理解和掌握,并能够运用相关知识来解决相关的具体问题,如一元多项式相加等;
程序流程:
1.定义一元多项式链表结构体类型;
2.输入多项式项数以分配存储空间;
3.输入多项式每项的系数和指数,将其插入当前多项式链表。同时判断是否有与当前节点指数相同的项,若存在,则将两项系数相加合并。此外,若存在系数为0的项,将其存储空间释放;
4.进行多项数加法时,新建一个存储结果的链表,分别将两多项式各项依次插入结果多项式即完成多项式相加运算;
5.进行多项数加法时,将减项多项式各项系数化为相反数后进行加法操作,即完成多项式相减运算;
6.对x赋值后,将x值代入多项式进行运算得到多项式的值;
7.输出多项式。
注意:进行完一次运算以后,应该及时销毁无用多项式以释放空间以便再次应用。
算法及注释:
1)定义一元多项式链表结构体类型
typedef struct Lnode{
float cof;
int exp;
struct Lnode *next;
}Lnode ,*Linklist;
2)建立多项式存储线性链表头结点
void makehead(Linklist &head){
head=(Linklist)malloc(sizeof(Lnode));
head->exp=-1;
head->next=NULL;
head->cof=1;
}
3)将输入的多项式信息存储于节点中
void makelnode(Lnode *&p){
p=(Lnode*)malloc(sizeof(Lnode));
printf("Input the cof and exp\n");
scanf("%fx%d",&p->cof,&p->exp);
p->next=NULL;
}
4)清除系数为零的多项式节点
void clear(Linklist la){
Lnode *p,*q;
p=la;
q=p->next;
while (q){
if (fabs(q->cof)<=0.000001) {
p->next=q->next;
free(q);
q=p->next;
}
else {
p=p->next;
q=q->next;
}
}
}
5)找到多项式中与当前节点同指数项位置
int locate(Linklist l,Lnode *&p,Lnode*e){
p=l;
if (!l->next)
return(0);
while(p&&e->exp!=p->exp){
p=p->next;
}
if(p)
return(1);
else {
p=l;
while (p->next&&e->exp<=p->next->exp)
p=p->next;
if (!p->next){
p=p;
return(0);
}
return(0);
}
}
6)将多项式节点插入已有多项式链表中,同时完成系数运算void caseinsert(Linklist &l,Lnode *e){
Lnode *p;
if (locate(l,p,e)){
p->cof += e->cof;
free(e);
}
else{
e->next=p->next;
p->next=e;
}
}
7)创建新的多项式链表
void creat(Linklist &head,int m){
Lnode *p;int i;
makehead(head);
for (i=1;i<=m;i++){
p=(Linklist)malloc(sizeof(Linklist));
makelnode(p);
caseinsert(head,p);
}
clear(head);
}
8)输入多项式项数并创建节点进行存储
void input(Linklist &l){
int m;
printf("Input the Poly numbers\n");
scanf("%d",&m);
creat(l,m);
}
9)输出多项式
void print(Linklist l){
Lnode *p;
p=l->next;
printf("Poly:%6fx^%d",p->cof,p->exp);
p=p->next;
while (p){
if(p->cof>0) printf("+");
if (fabs(p->cof)<=0.000001); break;
printf("%6fx^%d",p->cof,p->exp);
p=p->next;
}
printf("\n");
}
10)进行多项式加法运算
void add(Linklist la,Linklist lb,Linklist &lc)
{ Lnode *p,*q,*q1,*p1;
p=la->next;
q=lb->next;
makehead(lc);
while(p){
p1=p->next;
caseinsert(lc,p);
p=p1;
}
while(q){
q1=q->next;
caseinsert(lc,q);
q=q1;
}
}
11)将减项多项式转化为系数为相反数的多项式便于转化为加法运算void reverse(Linklist &l){
Linklist p;
p=l->next;
while(p){
p->cof*=-1;
p=p->next;
}
}
12)进行多项式减法运算
void sub(Linklist la,Linklist lb,Linklist &lc){
reverse(lb);
add(la,lb,lc);
clear(lc);
}