您的位置:首页 > 其它

一元多项式的加减法

2016-04-21 23:55 309 查看
   设有两个一元多项式A(x),B(x),请完成运算A(x)+B(x)、A(x)-B(x),要求多项式采用链表进行存储。另外该任务要求具有建立多项式链表以及输出多项式到屏幕的功能。

首先确定数据结构

struct Polynomial
{
int coef;
int exp;
struct Polynomial *next;
};


然后我们需要从键盘获取多项式,所以需要一个建立多项式的函数,由于输入的指数是无序的,并且可能存在需要合并相同指数项,我们需要在这个过程中进行合并,有两种方法,第一种,会比较繁琐浪费时间,就是先一次性建立一个多项式,然后给这个多项式按照指数大小进行排序,排完序后进行合并同类项,如果发现这个同类项的系数为0,还要进行删除该项,所需要的步骤较多,不宜采用,但较相似我们人的手写计算的过程,第二种,边建边排序边合并同类项,一次最多插入一个节点,直到链表建立结束,相比第一种算法时间复杂度较小。建立A,B结束后在进行加法,减法运算。完整代码如下:

#include <stdio.h>
#include <stdlib.h>

struct Polynomial { int coef; int exp; struct Polynomial *next; };
struct Polynomial *create();//建立多项式

struct Polynomial *insert(struct Polynomial *head,struct Polynomial *p);

void add(struct Polynomial *p1,struct Polynomial *p2);//多项式相加运算

void sub(struct Polynomial *p1,struct Polynomial *p2);//多项式相减运算

void print(struct Polynomial *p);//将多项式打印到屏幕

int main()
{
struct Polynomial *p1,*p2;
printf("请输入多项式A中x的系数及指数(输入0 0表示输入结束):\n");
p1=create();
printf("请输入多项式B中x的系数及指数(输入0 0表示输入结束):\n");
p2=create();
printf("\n");
printf("A(x)=");
print(p1);
printf("\n");
printf("B(x)=");
print(p2);
printf("\n\n");
printf("A(x)+B(x)=");
add(p1,p2);
printf("\n\n");
printf("A(x)-B(x)=");
sub(p1,p2);
printf("\n\n");
return 0;
}

struct Polynomial *create()
{
struct Polynomial *p,*q,*head;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
scanf("%d%d",&p->coef,&p->exp);
head=NULL;
while(p->coef!=0||p->exp!=0)
{
head=insert(head,p);
scanf("%d%d",&p->coef,&p->exp);
}
return head;
}

struct Polynomial *insert(struct Polynomial *head,struct Polynomial *p)
{
struct Polynomial *q,*q1,*q2;
q=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->coef=p->coef;
q->exp=p->exp;
q->next=NULL;
if(head==NULL)
{
head=q;
head->next=NULL;
return head;
}
q2=q1=head;
while(q1!=NULL)
{
while(q1->exp<p->exp)
{
q2=q1;
if(q1->next==NULL)
break;
q1=q1->next;
}
if(q1->exp==p->exp)
{
q1->coef=q1->coef+p->coef;
if(q1->coef==0)
{
if(q1==head)
{
head=head->next;
break;
}
else
{
q2->next=q1->next;
}
}
else
break;
}
else if(q1->exp<p->exp)
{
q1->next=q;
break;
}
else
{
if(q2==head&&q2->exp>q->exp) //如果不加q2->exp>q->exp会出现二义性
{
q->next=head;
head=q;
break;
}
else
{
q2->next=q;
q->next=q1;
break;
}
}
}
return head;
};

void add(struct Polynomial *p1,struct Polynomial *p2)
{
struct Polynomial*p,*q,*head;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
head=q=p;
while(p1!=NULL||p2!=NULL)
{
if(p1==NULL)
{
while(p2!=NULL)
{
q=p; //p的前一节点
p->exp=p2->exp;
p->coef=p2->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p2=p2->next;
}
}
else if(p2==NULL)
{
while(p1!=NULL)
{
q=p;
p->exp=p1->exp;
p->coef=p1->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p1=p1->next;
}
}
else
{
if(p1->exp<p2->exp)
{
q=p;
p->exp=p1->exp;
p->coef=p1->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p1=p1->next;
}
else if(p1->exp==p2->exp)
{
q=p;
p->exp=p1->exp;
p->coef=p1->coef+p2->coef;
if(p->coef!=0)
{
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p1=p1->next;
p2=p2->next;
}
else
{
p1=p1->next;
p2=p2->next;
}
}
else
{
q=p;
p->exp=p2->exp;
p->coef=p2->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p2=p2->next;
}
}
}
q->next=NULL;
print(head);
};

void sub(struct Polynomial *p1,struct Polynomial *p2)
{
struct Polynomial*p,*q,*head;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
head=q=p;
while(p1!=NULL||p2!=NULL)
{
if(p1==NULL)
{
while(p2!=NULL)
{
q=p;
p->exp=p2->exp;
p->coef=-p2->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p2=p2->next;
}
}
else if(p2==NULL)
{
while(p1!=NULL)
{
q=p;
p->exp=p1->exp;
p->coef=p1->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p1=p1->next;
}
}
else
{
if(p1->exp<p2->exp)
{
q=p;
p->exp=p1->exp;
p->coef=p1->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p1=p1->next;
}
else if(p1->exp==p2->exp)
{
q=p;
p->exp=p1->exp;
p->coef=p1->coef-p2->coef;
if(p->coef!=0)
{
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p1=p1->next;
p2=p2->next;
}
else
{
p1=p1->next;
p2=p2->next;
}
}
else
{
q=p;
p->exp=p2->exp;
p->coef=-p2->coef;
p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
q->next=p;
p2=p2->next;
}
}

}
q->next=NULL;
print(head);
};

void print(struct Polynomial *p)//将多项式打
4000
印到屏幕
{
struct Polynomial *p1;
p1=p;
if(p==NULL)
{
printf("0\n");
return;
}
while(p1!=NULL)
{
if(p1==p) //头结点输出时的情况
{
printf(" %d",p1->coef);
if(p1->exp!=0)
printf("x^%d ",p1->exp);
else
printf(" ");
}
else
{
if(p1->coef>0)
{
printf("+ %d",p1->coef);
if(p1->exp!=0)
printf("x^%d ",p1->exp);
else
printf(" ");
}
else
{
printf("- %d",-p1->coef);
if(p1->exp!=0)
printf("x^%d ",p1->exp);
else
printf(" ");
}
}
p1=p1->next;
}
printf("\n");
}


在写关于指针的代码很容易发生内存溢出的错误情况,所以敲代码之前要先想好算法,在函数命名时不要和提供的函数过于相近,容易造成混淆。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: