/求两个多项式的加法
//求两个多项式的加法。就是现将两个多项式合并后。接着根据exp进行判断
//如果两个exp的系数相反,说明他们相加后系数为0,抵消了。所以将他们的节点都free
//if节点系数相同时,则一个节点改变系数,同时释放另一个节点。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct List
{
int exp;//指数幂
int coef;//系数
struct List *next;
}NODE,*Node;
Node create_List();
void traverse_List(Node);
void add_List(Node,Node);
int main(void)
{
Node Head,head;
Head=create_List();
traverse_List(Head);
head=create_List();
traverse_List(head);
add_List(Head,head);
traverse_List(Head);
return 0;
}
Node create_List()
{
Node Head,p,s;
int exp,coef;//用来存放指数和系数
Head=(Node)malloc(sizeof(NODE));
if(!Head)
{
printf("动态内存分配失败!\n");
exit(-1);
}
Head->next=NULL;//初始化。建立一个空表头
p=Head;//始终指向尾指针。
printf("输入多项式的系统指数,列如(10,2)系数为0,0结束:");
//scanf("%d,%d",&coef,&exp);
while(scanf("%d,%d",&coef,&exp)&&coef!=0)//成功输入两个数而且系数不为0
{
s=(Node)malloc(sizeof(NODE));
if(!s)
{
printf("动态内存分配失败!\n");
exit(-1);
}
s->exp=exp;
s->coef=coef;
p->next=s;
p=s;
}
p->next=NULL;
return Head;
}
void traverse_List(Node Head)
{
Node p;
for(p=Head->next;p;p=p->next)//遍历到最后一个为节点的指针域为NULL
{
if(p->exp)//这是指数
printf("%d^%d",p->coef,p->exp);
else//如果指数为0的话,就只加系数
printf("%d",p->coef);
if(p->next)//如果下一个节点还存在的话,就'+'
printf("+");
}
printf("\n");
return ;
}
void add_List(Node Head,Node head)
{
Node p,q,r,s;
p=Head->next;
while(p->next)//p是 尾节点
{
//q=p;
p=p->next;
}
p->next=head->next;
free(head);
traverse_List(Head);
printf("多项式相加为:");
for(p=Head;p->next;p=p->next)
for(q=p->next;q->next;q=q->next)
{
if(p->next->exp==q->next->exp)//指数相同时
{
if(p->next->coef!=-(q->next->coef))//系数不相同时(1相反时 2不相反时)
{
p->next->coef+=q->next->coef;
r=q->next;
q->next=r->next;
free(r);
}
else
{
r=p->next;
p->next=r->next;
free(r);
s=q->next;
q->next=s->next;
free(s);
}
}
}
return ;
}
//求两个多项式的加法。就是现将两个多项式合并后。接着根据exp进行判断
//如果两个exp的系数相反,说明他们相加后系数为0,抵消了。所以将他们的节点都free
//if节点系数相同时,则一个节点改变系数,同时释放另一个节点。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct List
{
int exp;//指数幂
int coef;//系数
struct List *next;
}NODE,*Node;
Node create_List();
void traverse_List(Node);
void add_List(Node,Node);
int main(void)
{
Node Head,head;
Head=create_List();
traverse_List(Head);
head=create_List();
traverse_List(head);
add_List(Head,head);
traverse_List(Head);
return 0;
}
Node create_List()
{
Node Head,p,s;
int exp,coef;//用来存放指数和系数
Head=(Node)malloc(sizeof(NODE));
if(!Head)
{
printf("动态内存分配失败!\n");
exit(-1);
}
Head->next=NULL;//初始化。建立一个空表头
p=Head;//始终指向尾指针。
printf("输入多项式的系统指数,列如(10,2)系数为0,0结束:");
//scanf("%d,%d",&coef,&exp);
while(scanf("%d,%d",&coef,&exp)&&coef!=0)//成功输入两个数而且系数不为0
{
s=(Node)malloc(sizeof(NODE));
if(!s)
{
printf("动态内存分配失败!\n");
exit(-1);
}
s->exp=exp;
s->coef=coef;
p->next=s;
p=s;
}
p->next=NULL;
return Head;
}
void traverse_List(Node Head)
{
Node p;
for(p=Head->next;p;p=p->next)//遍历到最后一个为节点的指针域为NULL
{
if(p->exp)//这是指数
printf("%d^%d",p->coef,p->exp);
else//如果指数为0的话,就只加系数
printf("%d",p->coef);
if(p->next)//如果下一个节点还存在的话,就'+'
printf("+");
}
printf("\n");
return ;
}
void add_List(Node Head,Node head)
{
Node p,q,r,s;
p=Head->next;
while(p->next)//p是 尾节点
{
//q=p;
p=p->next;
}
p->next=head->next;
free(head);
traverse_List(Head);
printf("多项式相加为:");
for(p=Head;p->next;p=p->next)
for(q=p->next;q->next;q=q->next)
{
if(p->next->exp==q->next->exp)//指数相同时
{
if(p->next->coef!=-(q->next->coef))//系数不相同时(1相反时 2不相反时)
{
p->next->coef+=q->next->coef;
r=q->next;
q->next=r->next;
free(r);
}
else
{
r=p->next;
p->next=r->next;
free(r);
s=q->next;
q->next=s->next;
free(s);
}
}
}
return ;
}