# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
typedef struct PolyNode
{
int coef; //数据域
int exp;
struct PolyNode* next; //指针域
}node;
node* CreatePoly(void)
{
node* h, * tail, * s; //定义:头节点,尾节点,一般节点
int coef, exp; //系数,指数
h = (node*)malloc(sizeof(node)); //分配地址
if (!h) //h为0,(链表的检测)
{
exit(-1);
}
h->next = NULL; //链表清空
tail = h;
printf("请输入每一项额系数和指数(中间以逗号隔开):\n");
printf(" coef, exp");//
scanf_s("%d,%d", &coef, &exp);
while (coef)
{
s = (node*)malloc(sizeof(node)); //分配地址
if (!s) //s为空
{
exit(-1);
}
s->coef = coef; //将数存到结构体的coef中
s->exp = exp;
s->next = tail->next;
tail->next = s;
tail = s; //创建链表
printf("coef, exp ");//
scanf_s("%d,%d", &coef, &exp); //每次输入系数,直至系数为0
}
return h; //单向链表都要返回头结点
}
void PolyAdd(node* polya, node* polyb)
{
node* p, * q, * pre, * temp;
int sum = 0;
p = polya->next; //利用指针域,进行while循环 ,f(x1)
q = polyb->next; //f(x2)
pre = polya; //把第一个多项式赋值给pre
while (p && q) //链表未到尾结点
{
if (p->exp < q->exp) //结点成员比较大小
{
pre->next = p; //将p赋给pre
pre = p;
p = p->next; //p的下一个结点给p
}
else if (p->exp > q->exp)
{
pre->next = q;
pre = q;
q = q->next; //同上
}
else
{
sum = p->coef + q->coef;
if (sum)
{
p->coef = sum; //对结点成员进行赋值
pre->next = p;
pre = p;
p = p->next;
temp = q->next;//只把q的指针域赋给q,确保可以输入负系数
q = temp;
}
else
{
temp = p->next;
p = temp;
temp = q->next;
q = temp;
}
}
}
pre->next = p ? p : q;
}
void PolyAds(node* polya, node* polyb) //同上,算减法
{
node* p, * q, * pre, * temp;
int sum = 0;;
p = polya->next;
q = polyb->next;
pre = polya;
while (p && q)
{
if (p->exp < q->exp)
{
pre->next = p;
pre = p;
p = p->next;
}
else if (p->exp > q->exp)
{
pre->next = q;
pre = q;
q = q->next;
}
else
{
sum = p->coef - q->coef;
if (sum)
{
p->coef = sum;
pre->next = p;
pre = p;
p = p->next;
temp = q->next;
free(q);
q = temp;
}
else
{
temp = p->next;
free(p);
p = temp;
temp = q->next;
free(q);
q = temp;
}
}
}
pre->next = p ? p : q;
}
int Prin(node* h)
{
node* p = h->next;
while (p)
{
printf("%d*x^%d ", p->coef, p->exp);
p = p->next; //帮助输出整个链表
}
printf("\n");
return 1;
}
int main(void)
{
node* polya, * polyb;
int a; //运算符不能作为变量传递
printf("请输入第一个一元多项式的系数和指数(假定以输入系数为0来结束):\n");
polya = CreatePoly();
printf("请输入的第一个一元多项式为:\n");
Prin(polya);
printf("请输入第二个一元多项式的系数和指数(假定以输入系数为0来结束):\n");
polyb = CreatePoly();
printf("请输入的第二个一元多项式为:\n");
Prin(polyb);
printf("请输入1为+或2为-\n");
scanf_s("%d", &a);
if (a ==1 )
{
printf("这两个一元多项式相加后的结果为:\n");
PolyAdd(polya, polyb),
Prin(polya);
}
else
{
printf("这两个一元多项式相减后的结果为:\n"),
PolyAds(polya, polyb),
Prin(polya);
}
system("pause");
return 1;
}