#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <malloc.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
typedef struct PolyNode * Polynomial;//指向结构体头结点的指针
struct PolyNode
{
int coef;//系数
int expon;//指数
Polynomial link;//链表的指针域,指向下一个节点
};
//函数声明
Polynomial ReadPoly();
void Attach(int c, int e, Polynomial * pRear);
Polynomial Add(Polynomial P1, Polynomial P2);
Polynomial Mult(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);
int main()
{
Polynomial P1, P2, PP, PS;
P1 = ReadPoly();//读入多项式,P1是链表结构体的指针
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)//传入Polynomial类型的指针,Polynomial本身就是指针。pRear也就是指针的指针;pRear是一个定义好的值,attach需要修改它的值,所以要传它的指针
//C语言中函数参数传递要改变参数值应采用传地址方式
{
Polynomial P;
//P单独一块存有c,e
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c;
P->expon = e;
P->link = NULL;
//把新申请的P放在(*pRear)指针后面,(*pRear)指向当前结果表达式尾项
(*pRear)->link= P;
*pRear = P;//*pRear指向跟P指向的同一块内存
}
Polynomial ReadPoly()
{
Polynomial P, Rear, t;
int c, e, N;
scanf("%d",&N);//读几个数
P = (Polynomial)malloc(sizeof(struct PolyNode));//链表头空节点
P->link= NULL;
Rear = P;//Rear指向目前链表结果多项式的最后一项
while (N--)//读入系数和指数
{
scanf("%d %d",&c,&e);
if (c != 0)
{
Attach(c, e, &Rear);//构造一个节点,把这个节点插到多项式尾部
}
}
//删除临时生成的头结点
t = P;
P = P->link;//P指向第一个有效非空的节点
free(t);
return P;
}
Polynomial Add(Polynomial P1, Polynomial P2)
{
Polynomial t1,t2,P,Rear,t;
t1 = P1; t2 = P2;//t1,t2指向这两个多项式
//生成新的头结点
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while (t1&&t2)/*当t1,t2都不空的时候,比较当前t1,t2的指数*/
{
if (t1->expon == t2->expon)
{
if (t1->coef + t2->coef)//系数和为0不添加在尾节点上
{
Attach(t1->coef + t2->coef, t1->expon, &Rear);
}
t1 = t1->link;
t2 = t2->link;
}
else
02-线性结构2 一元多项式的乘法与加法运算(20 分)
最新推荐文章于 2024-09-06 14:37:34 发布