数据结构:一元多项式的表

合集下载
  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; //p q分别后移一位

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=p->next;

}

if(p)

return(p);//当p存在时,返回p地址

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);//建立一个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");

}

相关文档
最新文档