#include <stdlib.h>
#include <stdio.h>
//这里的链表都是没有头结点的,虽然通过测试得了满分,但是输出格式还是有些不对,
//如输入 2 1 0 2 0
// 1 5 0
// 输出 15 0
// 6 0 2 0
// 但是 第二行输出期望却是 8 0,有兴趣可以改改,在add函数里改一下
typedef struct PolyNode* Polynomial;
struct PolyNode
{
int coef; //系数
int expon; //指数
Polynomial link;
};
void Attach(int, int, Polynomial*);
Polynomial ReadPoly();
Polynomial Mult(Polynomial, Polynomial);
void PrintPoly(Polynomial);
Polynomial Add(Polynomial, Polynomial);
int main()
{
Polynomial P1, P2, PP, PS;
P1 = ReadPoly();
P2 = ReadPoly();
PP = Mult(P1, P2);
PrintPoly(PP);
printf("\n");
PS = Add(P1, P2);
PrintPoly(PS);
return 0;
}
void Attach(int c, int e, Polynomial* pRear) //注意参数是2级指针,因为想要修改Rear指针的值,参考c,c++是值传递;
{
Polynomial p = (Polynomial)malloc(sizeof(struct PolyNode));
p->coef = c;
p->expon = e;
p->link = NULL;
(*pRear)->link = p;
(*pRear) = p;
}
Polynomial ReadPoly() //读入多项式
{
Polynomial P, Rear, temp;
int c, e, N;
scanf("%d", &N);
P = (Polynomial)malloc(sizeof(struct PolyNode)); //建立临时链表头空结点,这样问题较为简单,若不设得判断Rear初值时候为NULL,即是否是第一个节点,所以这个得分开处理
P->link = NULL;
Rear = P;
while (N--)
{
scanf("%d%d", &c, &e);
Attach(c, e, &Rear); //循环,利用这个函数将多项式一个个插入前面多项式的尾部
}
temp = P;
P = P->link;
free(temp); //释放临时生成的头结点,因为这里的链是没有头结点的那种!,下面的都是一样!!!!!!
return P;
}
Polynomial Add(Polynomial p1, Polynomial p2)
{
//多项式相加
Polynomial front, rear, temp; //front是大哥,返回用;rear是小弟,拉帮结派用
rear = (Polynomial)malloc(sizeof(struct PolyNode));
rear->link = NULL;
front = rear;
while (p1 && p2)
{
if (p1->expon == p2->expon) //指数相等时
{
int sum = p1->coef + p2->coef;
if (sum)
Attach(sum, p2->expon, &rear);
p1 = p1->link; //这里不用担心外面的p1,p2指向会改变,因为值传递是不会影响外面的值的
p2 = p2->link;
}
else if (p1->expon > p2->expon)
{
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
else
{
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
}
if (p1)
{
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
else if (p2)
{
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
temp = front;
front = front->link;
free(temp);
return front;
}
Polynomial Mult(Polynomial p1, Polynomial p2)
{
//逐项插入法,先用p1的一项乘以p2的每一项,得到一个基本的模板,乘完后p1指向当然要往后挪;再用以后的p1的每一项乘以p2每一项,往这个模板里面插~
Polynomial p, rear, t1, t2, temp;
int c, e;
p = (Polynomial)malloc(sizeof(struct PolyNode));
rear = p;
t1 = p1;
t2 = p2;
if (!p1 || !p2) return NULL; //任一多项式为空时
while (t2)
{ //生成模板
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &rear);
t2 = t2->link;
}
t1 = t1->link;
while (t1)
{ //各项相乘
t2 = p2; //重新赋值t2,因为t2在上面已经被改变
rear = p; //重新指回头结点
while (t2)
{
c = t1->coef * t2->coef;
e = t1->expon + t2->expon;
while (rear->link && rear->link->expon > e) //寻找插入位置
rear = rear->link;
if (rear->link && rear->link->expon == e) //如果系数相等,合并
{
if (rear->link->coef + c) //系数相加不为零时不为零
rear->link->coef += c;
else //系数为零,删除结点
{
temp = rear->link;
rear->link = temp->link;
free(temp);
}
}
else //系数不等
{
temp = (Polynomial)malloc(sizeof(struct PolyNode));
temp->coef = c;
temp->expon = e;
temp->link = rear->link;
rear->link = temp;
//rear = rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
//释放头结点~
temp = p;
p = p->link;
free(temp);
return p;
}
void PrintPoly(Polynomial p)
{
int flag = 0; //辅助调整输出格式用,控制输出次数....
if (!p)
{
printf("0 0");
return;
}
while (p)
{
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d", p->coef, p->expon);
p = p->link;
}
}``
02-线性结构2 一元多项式的乘法与加法运算 (20 分)
最新推荐文章于 2021-04-01 23:54:07 发布
