#include<stdio.h>
#include<stdlib.h>
#define null 0
#define true 1
#define false 0
typedef struct /* 项的表示, 多项式的项作为LinkList的数据元素 */
{
float coef; /* 系数 */
int exp; /* 指数 */
}term, ElemType;
typedef struct LNode /* 结点类型 */
{
ElemType data; // ElemType是表示多项式中项的结构体类型
struct LNode *next;
}LNode,*LinkList;
LinkList creatpoly()//建立多项式
{
LinkList head,r,s;
float n;
int m;
head=(LinkList)malloc(sizeof(LNode));
printf("输入每项的系数和指数(输入格式为:系数,指数)注:系数输入0,则输入结束!:\n");
scanf("%f,%d",&n,&m);
r=head;
while (n!=0)
{
//尾插法建立一个单链表,完成多项式的表示
s=(LinkList)malloc(sizeof(LNode));//动态生成一个节点
s->data.coef=n;//节点初始化
s->data.exp=m;
r->next=s;//新节点插入到单链表中
r=s;
printf("input coef and exp:\n");
scanf("%f,%d",&n,&m);
}
r->next=null;
head=head->next;
return(head);
}
LinkList polyadd(LinkList ha,LinkList hb)//相加
{
LinkList hc,p,q,s,r;
float x=0.0;
p=ha;//指向链表ha的首元结点
q=hb; //指向链表hb的首元结点
hc=(LinkList)malloc(sizeof(LNode)); //创建新的链表
s=hc;
// 实现两个多项式的相加
while((p!=null)&&(q!=null))
{
if(p->data.exp==q->data.exp){
x=p->data.coef+q->data.coef;
if(x!=0){
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=p->data.exp;
r->data.coef=x;
//新链表移动指针
s->next=r;
s=r;
}
p=p->next;
q=q->next;
}
else if(p->data.exp<q->data.exp)
{
r=(LinkList)malloc(sizeof(LNode));
r->data.coef=q->data.coef;
r->data.exp=q->data.exp;
s->next=r;
s=r;
q=q->next;
}
else
{
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=p->data.exp;
r->data.coef=p->data.coef;
s->next=r;
s=r;
p=p->next;
}
}
while(p)
{
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=p->data.exp;
r->data.coef=p->data.coef;
s->next=r;
s=r;
p=p->next;
}
while(q)
{
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=q->data.exp;
r->data.coef=q->data.coef;
s=r;
q=q->next;
}
s->next=null; r=hc;
hc=hc->next; free(r);
return(hc);
}
void ployout(LinkList head)//输出一个多项式
{
LinkList p;
p=head;
int i=0;
while (p!=null)
{
if(i&&p->data.coef >= 0)
printf("+");
printf("%.3fx%d",p->data.coef,p->data.exp);
p=p->next;
i++;
}
printf("\n");
}
// 自定义一个两个链表相减的函数,实现一元多项式的相减
/********************************************/
LinkList polysub(LinkList ha,LinkList hb)//相减
{
LinkList hc,p,q,s,r;
float x = 0;
p=ha;//指向链表ha的首元结点
q=hb; //指向链表hb的首元结点
hc=(LinkList)malloc(sizeof(LNode)); //创建新的链表
s=hc;
while((p!=null)&&(q!=null)) {
if(p->data.exp==q->data.exp){
x=p->data.coef-q->data.coef;
if(x!=0){
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=p->data.exp;
r->data.coef=x;
s->next=r;
s=r;
}
p=p->next;
q=q->next;
}
else if(p->data.exp<q->data.exp)
{
r=(LinkList)malloc(sizeof(LNode));
r->data.coef=q->data.coef;
r->data.exp=q->data.exp;
s->next=r;
s=r;
q=q->next;
}
else
{
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=p->data.exp;
r->data.coef=p->data.coef;
s->next=r;
s=r;
p=p->next;
}
}
while(p)
{
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=p->data.exp;
r->data.coef=p->data.coef;
s->next=r;
s=r;
p=p->next;
}
while(q)
{
r=(LinkList)malloc(sizeof(LNode));
r->data.exp=q->data.exp;
r->data.coef=q->data.coef;
s=r;
q=q->next;
}
s->next=null; r=hc;
hc=hc->next; free(r);
return(hc);
}
/********************************************/
void main()
{
LinkList ha,hb,hc,hd;
printf("输入第一个多项式:\n");
ha=creatpoly();
ployout(ha);
printf("输入第二个多项式:\n");
hb=creatpoly();
ployout(hb);
// 完成两个多项式的相加
printf("两个多项式相加结果:\n");
hc=polyadd(ha,hb);
ployout(hc);
// 完成两个多项式的相减
printf("两个多项式相减结果:\n");
hc=polysub(ha,hb);
ployout(hc);
}