继上一篇多项式加法带来多项式减法以及多项式乘法的实现。同时修复了上篇文章的一个bug
在建立链表的时候上篇文章有一个分类如下
else if(xnum[0]!=0&&xnum[0]!=1)
此时会带来以下的问题,即当输入的第一项的系数为十以内的正整数时无法正常运行
此时,我们只需将此行代码改为
else if((xnum[0]!=0&&jiajian[0]!=0)||(xnum[0]!=0&&xnum[0]!=1))
问题就被完美解决了,是不是一个good ball了呢(野球帝王师傅乱串bushi)
接着我们来看减法,减法与加法的思路一样,唯一要注意的一点就是在减法的时候区分减数和被减数,废话不多说,我们直接放代码
SLNode* pnodeSUT(SLNode* pnodeA, SLNode* pnodeB){
SLNode *pnodeC,*p,*q,*r,*s;
float x;
p=pnodeA;
q=pnodeB;
pnodeC=(SLNode*)malloc(LEN);
r=pnodeC;
while(p!=NULL&&q!=NULL){
if(p->exp==q->exp){
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
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){
s=(SLNode *)malloc(LEN);
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
while(q!=NULL) { /*复制pnodeA余下的部分*/
s=(SLNode*)malloc(LEN); /*新开辟的一个内存单元,复制一个结点s*/
s-> coef=(q-> coef)*(-1);
s-> exp=q-> exp;
r-> next=s;
r=s;
q=q-> next; /*p指向下一个结点*/
}
r->next=NULL;
s=pnodeC; /*删除pnodeC的头结点*/
pnodeC=pnodeC-> next;
free(s); /*释放s所指向的内存空间*/
return(pnodeC);
}
接着我们来看乘法,首先思路是把两个多项式依次乘起来,先不进行合并同类项,接着写一个函数用于系数的排序,最后合并同类项即可。
我们先来看交换的代码(指的是值交换,而非结点的交换)
void change(SLNode*p,SLNode*q){
float ct;
int et;
ct = p->coef;
p->coef = q->coef;
q->coef = ct;
et = p->exp;
p->exp = q->exp;
q->exp = et;
}
接着是合并
SLNode* pnodeMULT(SLNode* pnodeA, SLNode* pnodeB){
SLNode *pnodeC,*p,*q,*r,*s;
float x,y;
p=pnodeA;
pnodeC=(SLNode*)malloc(LEN);
r=pnodeC;
while(p!=NULL){
q=pnodeB;//这里要注意q的位置要放在两个while之间,这样才能完全遍历两个多项式的乘法
while(q!=NULL){
x=(p->coef)*(q->coef);
y=(p->exp)+(q->exp);
s=(SLNode*)malloc(LEN);
s->coef=x;
s->exp=y;
r->next=s;
r=s;
q=q->next;
}
p=p->next;
}
r->next=NULL;
s=pnodeC; /*删除pnodeC的头结点*/
pnodeC=pnodeC-> next;
free(s);
SLNode*p1;
p1 = pnodeC;
while ((p1->next) != NULL) {
if ((p1->exp) < (p1->next->exp)) {
change(p1, p1->next);
}
p1 = p1->next;
}
SLNode *q1;
for (q1 = pnodeC; q1 != NULL&&q1->next != NULL;){
if ((q1->exp) == (q1->next->exp)) {
q1->coef += q1->next->coef;
q1->next = q1->next->next;
}
else q1 = q1->next;
}
return(pnodeC);
}
先排序再合并同类项的目的在于能够大大简化合并时的代码实现的难度
最后附上这次实验的完整代码
#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);
SLNode* pnodeSUT(SLNode* pnodeA, SLNode* pnodeB);
SLNode* pnodeMULT(SLNode* pnodeA, SLNode* pnodeB);
void main(void)
{
SLNode* pnodeA,*pnodeB,*pnodeC,*pnodeD,*pnodeE;/*定义三个SLNode结构体型的指针变量*/
printf( "Add two univariate polynomials\n ");
printf( "Substruct two univariate polynomials\n ");
printf( "Multiplication 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,实现一元多项式相加*/
pnodeD=pnodeSUT(pnodeA,pnodeB);
pnodeE=pnodeMULT(pnodeA,pnodeB);
printf( "\nAdd two polynomials:\n ");
print(pnodeC); /*调用函数print(),输出相加结果pondeC*/
printf("\n");
printf( "\nSubtract two polynomials:\n ");
print(pnodeD);
printf( "\n ");
printf("\nMultiplication two polynomials:\n");
print(pnodeE);
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&&jiajian[0]!=0)||(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);
}
SLNode* pnodeSUT(SLNode* pnodeA, SLNode* pnodeB){
SLNode *pnodeC,*p,*q,*r,*s;
float x;
p=pnodeA;
q=pnodeB;
pnodeC=(SLNode*)malloc(LEN);
r=pnodeC;
while(p!=NULL&&q!=NULL){
if(p->exp==q->exp){
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
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){
s=(SLNode *)malloc(LEN);
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
while(q!=NULL) { /*复制pnodeA余下的部分*/
s=(SLNode*)malloc(LEN); /*新开辟的一个内存单元,复制一个结点s*/
s-> coef=(q-> coef)*(-1);
s-> exp=q-> exp;
r-> next=s;
r=s;
q=q-> next; /*p指向下一个结点*/
}
r->next=NULL;
s=pnodeC; /*删除pnodeC的头结点*/
pnodeC=pnodeC-> next;
free(s); /*释放s所指向的内存空间*/
return(pnodeC);
}
void change(SLNode*p,SLNode*q){
float ct;
int et;
ct = p->coef;
p->coef = q->coef;
q->coef = ct;
et = p->exp;
p->exp = q->exp;
q->exp = et;
}
SLNode* pnodeMULT(SLNode* pnodeA, SLNode* pnodeB){
SLNode *pnodeC,*p,*q,*r,*s;
float x,y;
p=pnodeA;
pnodeC=(SLNode*)malloc(LEN);
r=pnodeC;
while(p!=NULL){
q=pnodeB;
while(q!=NULL){
x=(p->coef)*(q->coef);
y=(p->exp)+(q->exp);
s=(SLNode*)malloc(LEN);
s->coef=x;
s->exp=y;
r->next=s;
r=s;
q=q->next;
}
p=p->next;
}
r->next=NULL;
s=pnodeC; /*删除pnodeC的头结点*/
pnodeC=pnodeC-> next;
free(s);
SLNode*p1;
p1 = pnodeC;
while ((p1->next) != NULL) {
if ((p1->exp) < (p1->next->exp)) {
change(p1, p1->next);
}
p1 = p1->next;
}
SLNode *q1;
for (q1 = pnodeC; q1 != NULL&&q1->next != NULL;){
if ((q1->exp) == (q1->next->exp)) {
q1->coef += q1->next->coef;
q1->next = q1->next->next;
}
else q1 = q1->next;
}
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);
}
感谢您的观看,有用的话希望点赞收藏加关注呀!谢谢大家