实现多项式运算 部分计算器能够支持多项式的计算 ,本次实验中,要求你所实现的计算器也能够完成多项式运 算。 具体地,针对任意一个多项式,在 语言中,我们常通过一个链表存储其每一项的次数和系数, 即能完成一个多项式的存储。本次实验中,要求你将输入的多项式以链表形式存储,并通过操作链 表完成多项式的 加法 、 减法 和 乘法 。 实验中规定,多项式以字符串形式读取,如 ,你应该以 3x^3+2x^2-5x+1 的 形式输入,当其与多项式 5x^4-3x^3+5x+10 相加后,输出 5x^4+2x^2+11 。
思路:分别用xnum,jiajian,chengf(名称就直接借鉴那位博主了)三个数组标记不同符号的位置,再将所有类型的多项式进行分类,根据不同的类型的特点通过尾插法建立链表,分别用coef和exp表示系数和指数,这样就可以实现多项式的打印了,接着就是加法就好了,over!
给我1000首歌的时间!!!Wooo oh!这次的代码真的写了好久,因为不会高级的工具,就疯狂的分类。
思路借鉴了另一位大神博主的文章,但多项式的实现完全是自己一点一点细分出来的,实现结果如下图
话不多说,上代码!
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define LEN sizeof(SLNode)
typedef struct Node{
int coef;
int exp;
struct Node* next;
}SLNode;
SLNode* creat(void);
void print(SLNode* head);
SLNode* pnodeADD(SLNode* pnodeA, SLNode* pnodeB);
void main(void)
{
SLNode* pnodeA,*pnodeB,*pnodeC;/*定义三个SLNode结构体型的指针变量*/
printf( "Add two univariate polynomials\n ");
printf( "Please enter the first polynomial\n ");
pnodeA=creat(); /*调用函数creat(),输入一元多项式pnodeA*的系数和指数,建立链表*/
printf( "First polynomial:\n ");
print(pnodeA); /*调用函数print(), 输出一元多项式pnodeA*/
printf( "\nPlease enter the second polynomial:\n ");
pnodeB=creat(); /*调用函数creat(),输入一元多项式pnodeB*的系数和指数,建立链表*/
printf( "Second polynomial:\n ");
print(pnodeB); /*调用函数print(),输出一元多项式pnodeB*/
pnodeC=pnodeADD(pnodeA,pnodeB); /*调用函数pnodeADD,实现一元多项式相加*/
printf( "\nAdd two polynomials:\n ");
print(pnodeC); /*调用函数print(),输出相加结果pondeC*/
printf( "\n ");
}
SLNode*creat(void){
SLNode*head,*p1,*p2; /*定义SLNode结构体类型的指针变量*/
int n=0,xnum[100],xx=0,jiajian[100],jj=0,chengf[100],cc=0; /*n初始为0*/
p1=p2=(SLNode*)malloc(LEN);
char a[1000];
gets(a);
head=NULL; /*把头指针定义为空*/
while(a[n]) /*系数不为空时,执行循环*/
{
if(a[n]=='x') {xnum[xx]=n; xx++;}
if(a[n]=='+'||a[n]=='-') {jiajian[jj]=n; jj++;}
if(a[n]=='^') {chengf[cc]=n; cc++;}
n++;
}
//对于第一项
if(xnum[0]==0)
p1-> coef=1;
if(jiajian[0]==0&&xnum[0]==1)
p1-> coef=-1;
else if(xnum[0]!=0&&xnum[0]!=1)
{
for(int ll=0;ll<xnum[0];ll++)
{
if(ll==0)
{
if(a[ll]>='0'&&a[ll]<='9') p1-> coef=a[ll]-'0';
if(a[ll]=='+') p1-> coef=0;
if(a[ll]=='-') p1-> coef=0;
}
else p1-> coef= (p1-> coef)*10+a[ll]-'0';
}
if(a[0]=='+') p1-> coef=(p1-> coef)*1;
if(a[0]=='-') p1-> coef=(p1-> coef)*(-1);
}
int jiajian1;
if((a[0]>='0'&&a[0]<='9')||xnum[0]==0) jiajian1=jiajian[0];
else jiajian1=jiajian[1];
for(int ll=chengf[0]+1;ll<jiajian1;ll++)
{
if(ll==chengf[0]+1) p1-> exp=a[ll]-'0';
else p1-> exp= (p1-> exp)*10+a[ll]-'0';
}
head=p1;
p2=p1;
p1=(SLNode*)malloc(LEN);
//对于中间的项
for(int tt=1;tt<xx-1;tt++)
{
int jiajian2;
if(a[0]=='+'||a[0]=='-') jiajian2=jiajian[tt]; //判断第一个输入的是否是加减符号
else jiajian2=jiajian[tt-1];
if(jiajian2+1==xnum[tt])
p1-> coef=1;
else{
for(int lt=jiajian2+1;lt<xnum[tt];lt++)
{
if(lt==jiajian2+1) p1-> coef=a[lt]-'0';
else p1-> coef= (p1-> coef)*10+a[lt]-'0';
}
}
if(a[0]>='0'&&a[0]<='9')
{
if(a[jiajian[tt-1]]=='+') p1->coef= (p1->coef)*1;
if(a[jiajian[tt-1]]=='-') p1->coef= (p1-> coef)*(-1);
}
else
{
if(a[jiajian[tt]]=='+') p1-> coef= (p1-> coef)*1;
if(a[jiajian[tt]]=='-') p1-> coef= (p1-> coef)*(-1);
}
int jiajianmidexp;
if(a[0]=='+'||a[0]=='-') jiajianmidexp=jiajian[tt+1]; //判断第一个输入的是否是加减符号
else jiajianmidexp=jiajian[tt];
for(int lt=chengf[tt]+1;lt<jiajianmidexp;lt++)
{
if(lt==chengf[tt]+1) p1-> exp=a[lt]-'0';
else p1-> exp= (p1-> exp)*10+a[lt]-'0';
}
p2-> next=p1;
p2=p1;
p1=(SLNode*)malloc(LEN);
}
//对于最后一项
//-x^5+x^4+x^3+x^2 is able
int jiajian3;
if((a[0]>='0'&&a[0]<='9')||xnum[0]==0) jiajian3=jiajian[xx-2];
else jiajian3=jiajian[xx-1];
if(jiajian3+1==xnum[xx-1])
p1-> coef=1;
else{
for(int lt=jiajian3+1;lt<xnum[xx-1];lt++)
{
if(lt==jiajian3+1) p1-> coef=a[lt]-'0';
else p1-> coef= (p1-> coef)*10+a[lt]-'0';
}
}
if(a[jiajian3]=='+') p1-> coef = (p1-> coef)*1;
if(a[jiajian3]=='-') p1-> coef = (p1-> coef)*(-1);
if(jj==xx-1||(jiajian[0]==0&&jj==xx)){
if(cc==xx){
for(int lt=chengf[xx-1]+1;lt<n;lt++)
{
if(lt==chengf[xx-1]+1) p1-> exp=a[lt]-'0';
else p1-> exp= (p1-> exp)*10+a[lt]-'0';
}
}
else p1->exp=1;
p2-> next=p1;
p2=p1;
//p1=(SLNode*)malloc(LEN);
p2-> next=NULL; /*置结束标志为NULL*/
return(head);
}
if(jj==xx+1||(jj==xx&&jiajian[0]!=0)){
if(cc==xx){
for(int lt=chengf[xx-1]+1;lt<jiajian[jj-1];lt++)
{
if(lt==chengf[xx-1]+1) p1-> exp=a[lt]-'0';
else p1-> exp= (p1-> exp)*10+a[lt]-'0';
}
}
else p1->exp=1;
p2-> next=p1;
p2=p1;
p1=(SLNode*)malloc(LEN);
p1->exp=0;
for(int ww=jiajian[jj-1]+1;ww<n;ww++){
if(ww==jiajian[jj-1]+1) p1->coef=a[ww]-'0';
else p1->coef=(p1->coef)*10+a[ww]-'0';
}
if(a[jiajian[jj-1]]=='+') p1-> coef = (p1-> coef)*1;
if(a[jiajian[jj-1]]=='-') p1-> coef = (p1-> coef)*(-1);
p2->next=p1;
p2=p1;
p2-> next=NULL; /*置结束标志为NULL*/
return(head);
}
}
/*返回值为头指针的地址*/
SLNode* pnodeADD(SLNode* pnodeA,SLNode* pnodeB){
SLNode*pnodeC,*p,*q,*s,*r; /*定义SLNode结构体类型的指针变量*/
float x;
p=pnodeA; /*p指向pnodeA的头结点*/
q=pnodeB; /*q指向pnodeB的头结点*/
pnodeC=(SLNode*)malloc(LEN); /*pnodeC指向新开辟的内存单元*/
r=pnodeC;
while(p!=NULL&&q!=NULL){
if(p-> exp==q-> exp) { /*两结点指数相等时,将两系数相加生成新结点插入C中 */
x=p-> coef+q-> coef; /*系数相加*/
if(x!=0){
s=(SLNode*)malloc(LEN);
s-> coef=x;
s-> exp=p-> exp;
r-> next=s;
r=s;
}
p=p-> next;
q=q-> next;
}
else /*两结点的指数不相等时,将其中较小系数的结点复制成一个新的结点插入C中*/
if(p-> exp> q-> exp)
{
s=(SLNode *)malloc(LEN);
s-> coef=p-> coef;
s-> exp=p-> exp;
r-> next=s;
r=s;
p=p-> next;
}
else {
s=(SLNode*)malloc(LEN);
s-> coef=q-> coef;
s-> exp=q-> exp;
r-> next=s;
r=s;
q=q-> next;
}
}
while(p!=NULL) { /*复制pnodeA余下的部分*/
s=(SLNode*)malloc(LEN); /*新开辟的一个内存单元,复制一个结点s*/
s-> coef=p-> coef;
s-> exp=p-> exp;
r-> next=s;
r=s;
p=p-> next; /*p指向下一个结点*/
}
while(q!=NULL) { /*复制pnodeA余下的部分*/
s=(SLNode*)malloc(LEN); /*新开辟的一个内存单元,复制一个结点s*/
s-> coef=q-> coef;
s-> exp=q-> exp;
r-> next=s;
r=s;
q=q-> next; /*p指向下一个结点*/
}
r-> next=NULL; /*置结束标志为NULL*/
s=pnodeC; /*删除pnodeC的头结点*/
pnodeC=pnodeC-> next;
free(s); /*释放s所指向的内存空间*/
return(pnodeC);
}
void print(SLNode* head){
SLNode* p; /*定义SLNode结构体类型的指针变量*/
p=head; /*把头指针的地址赋给p*/
if(head!=NULL){
if(p-> coef==1&&p-> exp!=0&&p-> exp!=1)
printf( "x^%d",p-> exp);
if(p-> coef==-1&&p-> exp!=0&&p-> exp!=1)
printf( "-x^%d",p-> exp);
if(p-> coef==1&&p-> exp==0)
printf( "1");
if(p-> coef==-1&&p-> exp==0)
printf( "-1");
if(p-> coef==-1&&p-> exp==1)
printf( "-x");
if(p-> coef==1&&p-> exp==1)
printf( "x");
if(p-> coef!=-1&&p-> coef!=1&&p-> exp==0)
printf( "%d",p-> coef);
if(p-> coef!=1&&p-> coef!=-1&&p-> exp==1)
printf( "%dx",p-> coef);
if(p-> coef!=1&&p-> coef!=-1&&p-> coef!=0&&p-> exp!=0&&p-> exp!=1&&p-> exp!=-1)
printf( "%dx^%d",p-> coef,p-> exp);
p=p-> next;
}
do{
if(p-> coef> 1)
printf("+");
if(p-> coef==1&&p-> exp!=0&&p-> exp!=1)
printf( "+x^%d",p-> exp);
if(p-> coef==1&&p-> exp==0)
printf( "1");
if(p-> coef==-1&&p-> exp!=0&&p-> exp!=1)
printf( "-x^%d",p-> exp);
if(p-> coef==-1&&p-> exp==1)
printf( "-x");
if(p-> coef==1&&p-> exp==1)
printf( "+x");
if(p-> coef==-1&&p-> exp==0)
printf( "-1");
if(p-> coef!=-1&&p-> coef!=1&&p-> exp==0)
printf( "%d",p-> coef);
if(p-> coef!=1&&p-> coef!=-1&&p-> exp==1)
printf( "%dx",p-> coef);
else if(p-> coef!=1&&p-> coef!=-1&&p-> coef!=0&&p-> exp!=0&&p-> exp!=1)
printf( "%dx^%d",p-> coef,p-> exp);
p=p-> next;
}while(p!=NULL);
}
多项式的减法和乘法手打中,敬请期待呀!
如果觉得有用请点赞+关注呀!感谢感谢 !