数据结构:一元多项式的表
- 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; //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");
}