链表 实现多项式相加相乘polynomial

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


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct poly_node * polynomial;
struct poly_node{
int coef;
int expon;
polynomial link;
};
polynomial read_poly();
void attack(int c, int e, polynomial * rear);
void print_poly(polynomial p);
polynomial add_poly(polynomial p1, polynomial p2);
polynomial mult_poly(polynomial p1, polynomial p2);


int main(int argc, char *argv[]) {
polynomial p1, p2, pp, ps;

p1 = read_poly();
p2 = read_poly();
ps = add_poly(p1, p2);
pp = mult_poly(p1, p2);
print_poly(p1);
print_poly(p2);
print_poly(ps);
print_poly(pp);
return 0;
}


polynomial read_poly()
{
int n, c, e;
scanf("%d", &n);

polynomial p, temp, rear;
p = (polynomial)malloc(sizeof(struct poly_node));
rear = p;
p->link = NULL;
while(n--)
{
scanf("%d%d", &c, &e);
attack(c, e, &rear);
}
temp = p;
p = p->link;
free(temp);

return p; 



void attack(int c, int e, polynomial * rear)
{
polynomial p;
p = (polynomial)malloc(sizeof(struct poly_node));
p->coef = c;
p->expon = e;
p->link = NULL;        ///!!!忘记 
(*rear)->link = p;精髓 
(*rear) = p;精髓 
}


void print_poly(polynomial p)
{
int flag = 0;
if(!p)
{
printf("0 0\n");
return;


while(p)
{
if(!flag)
flag = 1;
else
printf("   ");
printf("%d %d", p->coef, p->expon);
p = p->link;
}
printf("\n");
}


polynomial add_poly(polynomial p1, polynomial p2)
{
polynomial t1, t2, ps, rear, temp;
t1 = p1;
t2 = p2;
int sum;
ps = (polynomial)malloc(sizeof(struct poly_node));
ps->link = NULL;
rear = ps;

while(t1 && t2)
{
if(t1->expon == t2->expon)
{
sum = t1->coef + t2->coef;
if(sum)
attack(sum, t1->expon, &rear);
t1 = t1->link;
t2 = t2->link;
}
else if(t1->expon > t2->expon)
{
attack(t1->coef, t1->expon, &rear);
t1 = t1->link;
}
else if(t1->expon < t2->expon)
{
attack(t2->coef, t2->expon, &rear);
t2 = t2->link;
}
}
while(t1)
{
attack(t1->coef, t2->expon, &rear);
t1 = t1->link;
}
while(t2)
{
attack(t2->coef, t2->expon, &rear);
t2 = t2->link; 
}
temp = ps;
ps = ps->link;
free(temp);

return ps;
}


polynomial mult_poly(polynomial p1, polynomial p2)
{
if(!p1 || !p2)
return NULL;

polynomial t1, t2, pp, rear, temp;
int c, e;
t1= p1;
t2 = p2;
pp = (polynomial)malloc(sizeof(struct poly_node));
pp ->link =NULL;
rear = pp;

while(t2)
{              ///首先用t1 的第一项 乘以 t2的所有项,得到一个表达式 
attack(t1->coef*t2->coef, t1->expon+t2->expon, &rear);
t2 = t2->link;
}
t1 = t1->link;   ///t1 指向第二项 

while(t1)
{
t2 = p2;  ///每当t1 移向下一个, t2重头开始循环 
rear = pp;  ///rear 指向表达式的前一个空位置 
while(t2)
{
c = t1->coef * t2->coef;
e = t1->expon + t2->expon;
while(rear->link && rear->link->expon > e)  ///当rear 后还有项时,且指数大于e 
{
rear = rear->link;
}
if(rear->link && rear->link->expon == e)  ///指数相等时 
{
if(rear->link->coef + c)       ///检查系数是否为 0 
rear->link->coef += c;
else
{
temp = rear->link;
rear->link = temp->link;     
free(temp); ///系数为0,释放 
}
}
else            
{          ///rear下一项 的指数小于e, 开辟空间添加进表达式中 
temp = (polynomial)malloc(sizeof(struct poly_node));

temp->coef = c;
temp->expon = e;
temp->link = rear->link;
rear->link = temp;
}
t2 = t2->link;
}
t1 = t1->link;
}

temp = pp;
pp = pp->link;
free(temp);

return pp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值