多项式求和

不想上班的一天又一天 2020-04-04 10:25:44

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Polynode)

//节点类型定义
typedef struct Polynode{
int coef;
int expn;
struct Polynode * next;
}Polynode,*Polylist;//开辟列表


//建立一元多项式链表,尾插法
Polylist PolyCreate(){
Polynode *head,*rear,*s;
int coef,expn;//系数,指数
head=(Polynode *) malloc (sizeof(Polynode));//建立头结点
rear=head;
scanf("请输入多项式的系数和指数项:%d,%d",&coef,&expn);
while (coef!=0){
s=(Polynode *)malloc(sizeof(Polynode));//申请新的结点
s->coef=coef;
s->expn=expn;
rear->next=s;//在当前表尾做插入
rear=s;
scanf("%d,%d",&coef,&expn);
}
rear->next=NULL;
return(head);

}

/*
遍历表p,每一个结点与s比较指数(查找)
若相同,q指向相同指数项的结点,返回1
若不相同,根据s所指指数大小在链表p中的位置来确定q的指向结点,返回0
*/
int LocateElem(Polylist p,Polylist s,Polylist &q){
Polylist p1=p->next;
Polylist p2=p;//存储每一个多项式
while(p1){
if(s->expn > p1->expn){
p1=p1->next;
p2=p2->next;
}else if(s->expn==p1->expn){
q=p1;
return 1;
}else{
q=p2;
return 0;
}
}
if(!p1){
q=p2;
return 0;
}
return 0;
}

//创建带头结点的链表
void CreatePoly(Polylist &p,int m){
Polylist s,q;
int i;
p=(Polylist )malloc(LEN);
p->next=NULL;
for(i=0;i<m;i++){
s=(Polylist ) malloc (LEN);
printf("请输入系数和指数(以空格隔开):");
scanf("%d %d",&s->coef,&s->expn);
if(!LocateElem(p,s,q)){
s->next=q->next;
q->next=s;
}else{
q->coef+=s->coef;
}
}
}

//比较两结点指数大小,根据情况返回不同的值
int cmp(Polylist pa,Polylist pb){
if(pa->expn < pb->expn) return -1;
else if(pa->expn == pb->expn) return 0;
else return 1;
}

//两个多项式相加得一个新多项式,并且返回新多项式的头结点的指针
//指数递增
Polylist AddPoly(Polylist pa,Polylist pb){ //pa,pb均指向头结点
Polylist newP,p,q,s,pc;
int sum;
p=pa->next;
q=pb->next;
newP=(Polylist)malloc(LEN);
pc=newP;
while(p&&q){
switch(cmp(p,q)){
case -1:
s=(Polylist)malloc(LEN);//申请一个新结点
s->coef=p->coef;
s->expn=p->expn;
pc->next=s; //在新表中插入结点
pc=s;
p=p->next;//指针移动
break;
case 0:
sum=p->coef+q->coef;
if(sum!=0){
s=(Polylist)malloc(LEN);
s->coef=sum;
s->expn=p->expn;
pc->next=s;
pc=s;
}
p=p->next;
q=q->next;
break;
case 1:
s=(Polylist)malloc (LEN);
s->coef=q->coef;
s->expn=q->expn;
pc->next=s;
pc=s;
q=q->next;
break;
}
}
pc->next=p?p:q;
return newP;
}

//打印输出一元多项式PL
void PrintPoly(Polylist PL){
Polylist s;
s=PL->next;
while(s){
printf("%d X^%d",s->coef,s->expn);
s=s->next;
if(s!=NULL)
if(s->coef>=0) printf(" +");
}
printf("\n");
}

int main(){
Polylist PA,PB,PC;
int la,lb;
printf("请输入第一个多项式PA的项数:");
scanf("%d",&la);
CreatePoly(PA,la);
printf("第一个多项式为:");
PrintPoly(PA);

printf("请输入第二个多项式PB的项数:");
scanf("%d",&lb);
CreatePoly(PB,lb);
printf("第二个多项式为:");
PrintPoly(PB);

printf("两个多项式相加: ");
PC=AddPoly(PA,PB);
PrintPoly(PC);

return 0;
}


...全文
169 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复


  • 打赏
  • 举报
回复
引用 1 楼 智者知已应修善业 的回复:


65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧