数据结构(二)笔记

多项式的乘法与加法运算

多项式的表示

仅表示非零项
数组:

编程简单、调试容易
需要实现确定数组大小

链表:

动态性强
编程略为复杂、调试比较困难

一种比较好的实现方法是:动态数组

数据结构设计
typedef struct PolyNode *Polynomial;
struct PolyNode{
	int coef;//系数
	int expon;//指数
	Polynomial link;//指向下一个节点的指针
程序框架搭建
int main()
{
	读入多项式1
	读入多项式2
	乘法运算并输出
	加法运算并输出
	return 0;
}
需要设计的函数

读一个多项式
两多项式相乘
两多项式相加
多项式输出

int main()
{
	Polynomial P1,P2,PP,PS;

	P1 = ReadPoly();
	P2 = ReadPoly();
	PP = Mult(P1,P2);
	PrintPoly(PP);
	PS = Add(P1,P2);
	PrintPoly(PS);
	return 0;
如何读入多项式

先读项数,再一对一对的读指数和系数

Polynomial ReadPoly()
{
	……
	scanf("%d",&N);
	……
	while(N--)
	{
		scanf("%d %d",&c,&e);
		Attach(c,e,&Rear);
	}
	……
	return P;
}

Rear初值是多少?
两种处理方法:
1.Rear初值为NULL
在Attach函数中根据Rear是否为NULL做不同处理
2.Rear指向一个空结点

void Attach(int c,int e,Polynomial *pRear)//pRear是指针的指针
{
	Polynomial P;
	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,t;
	int c,e,N;
	scanf("%d",&N);
	P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->link = NULL;
	Rear = P;
	while(N--)
	{
		scanf("%d %d",&c,&e);
		Attach(c,e,&Rear);
	}
	t = P;
	P = P->link;
	free(t);
	return P;
}
如何将两个多项式相加
Polynomial Add(Polynomial P1,Polynomial P2)
{
	……
	t1 = P1;
	t2 = P2;
	P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->link = NULL;
	Rear = P;
	while(t1 && t2){
			if(t1->expon == t2->expon){
					……
			}
			else if(t1->expon>t2->expon){
					……
			}
			else {
					……
			}
	}
	while(t1)
	{
	……
	}
	while(t2)
	{
	……
	}
	……
	return P;
}
如何将两个多项式相乘

方法1.将乘法运算转换为加法运算
将P1当前项(ci,ei)乘P2多项式,再加到结果多项式里

t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(t2){
		Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
		t2 = t2->link;
}

方法2.逐项插入
将P1当前项(c1i,e1i)乘P2当前项(c2i,e2i),并插入到结果多项式中,关键是要找到插入位置。
初始结果多项式可由P1第一项乘P2获得

如何将多项式输出
void PrintPoly( 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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值