数据结构:一元多项式的表示与相加

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档