一元多项式加法、乘法链表实现

       一元多项式的实现包含链表的定义,读入,插入,输出等基本操作,是学习链表基本操作的好实例。这里对一元多项式的加法、乘法分开分析和实现,其中多项式是按指数递减存储的。两个代码都经过调试是正确的,由于使用的是C++编译的,输入函数使用scanf()函数有安全问题,所以使用的是scanf_s()函数,但scanf_s()函数在C中调试会编译错误,需要改回scanf()函数。

  1. 一元多项式的加法

      对一个多项式通过链表实现加法,需要建立链表结构体,读入链表,链表插入(指数比较系数相加),结果输出等几个步骤。这里输出时若多项式相加为零多项式,输出为“0 0”。

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


//定义结构体
struct PolyNode
{
	int coef;	//系数
	int expon;	//指数
	struct PolyNode *link;	//指向下一个节点指针
};
typedef struct PolyNode *Polynomial;	

//多项式读入函数
Polynomial PolyRead();

//比较函数
int Compare(int , int );

//添加结点函数
void Attach(int , int , Polynomial* );

//多项式求和函数
Polynomial PolyAdd(Polynomial , Polynomial );

//链表输出
void PrintPoly(Polynomial P);

int main()
{
	Polynomial P1, P2, R_Add, R_Mult;
	P1 = PolyRead();
	P2 = PolyRead();

	R_Add = PolyAdd(P1, P2);
	PrintPoly( R_Add);

	system("pause");

	return 0;
}

//多项式读入函数,直接读入
Polynomial PolyRead()	
{
	int N;
	scanf_s("%d", &N);
	Polynomial Head , Rear, Tmp; //定义的应该是指针,需要分配空间才能使用

	Rear = (Polynomial) malloc(Len);	//分配空间
	Rear->link = NULL;	//表头空结点
	Head = Rear;

	for(int i=0; i< N; i++)	//创建链表
	{
		Tmp = (Polynomial) malloc( Len);	//申请新结点
		Tmp->link = NULL;
		scanf_s("%d", &Tmp->coef );
		scanf_s("%d", &Tmp->expon );
		Rear->link = Tmp;	//新结点插入尾部
		Rear = Tmp;

	}
	Tmp = Head;
	Head = Head->link;
	free(Tmp);	//删除临时空的头结点

	return Head;
}

//比较函数
int Compare(int e1, int e2)
{
	//比较两项指数e1和e2,根据大、小、等三种情况分别返回1,-1,0
	if(e1 > e2) return 1;
	else if(e1 < e2) return -1;
	else return 0;

}


//添加结点函数
void Attach(int coef, int expon, Polynomial *PtrRear)
{
	//本函数需要改变当前结果表达式的尾指针的值
	//函数传递进来的是尾项指针的地址
	Polynomial P;

	//申请新结点并赋值
	P=(Polynomial) malloc(sizeof(struct PolyNode));
	P->coef = coef;
	P->expon = expon;
	P->link = NULL;

	//将P指向新结点插入到当前结果表达式尾项后面
	(*PtrRear) ->link = P;
	*PtrRear = P;	//修改PtrRear值
}


//多项式求和函数
Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{
	Polynomial front, rear, temp;
	int sum;
	//为方便表头插入,先产生一个临时空结点作为结果多项式链表头
	rear = (Polynomial) malloc(sizeof(struct PolyNode));
	front = rear;	//由front记录结果多项式的表头
	while(P1 && P2)
	{
		switch( Compare(P1->expon, P2->expon))
		{
		case 1:
			Attach(P1->coef, P1->expon, &rear);
			P1 = P1->link;
			break;
		case -1:
			Attach(P2->coef, P2->expon, &rear);
			P2 = P2->link;
			break;
		case 0:
			sum = P1->coef + P2->coef;
			if(sum) Attach(sum, P1->expon, &rear);
			P1 = P1->link;
			P2 = P2->link;
			break;
		}
	}
	//将为处理完的另一项多项式的所有结点依次复制到结果多项式中
	for(; P1; P1=P1->link) Attach(P1->coef, P1->expon, &rear);
	for(; P2; P2=P2->link) Attach(P2->coef, P2->expon, &rear);
	rear->link = NULL;
	temp = front;
	front = front->link;	//front指向结果多项式第一非零项

	free(temp);	//删除临时空的头结点
	return front;

}

//链表输出
void PrintPoly(Polynomial P)
{
	//输出多项式
	int flag = 0;
	
	if(P ==NULL) printf("0 0");
	while(P)
	{
		if(!flag) flag = 1;	//头结点为空不输出
		else 
			printf(" ");
		printf("%d %d", P->coef, P->expon);

		P = P->link ;
		
	}
	printf("\n");
	
}

2.一元多项式的乘法

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

//定义结构体
struct PolyNode
{
	int coef;	//系数
	int expon;	//指数
	struct PolyNode *link;	//指向下一个节点指针
};
typedef struct PolyNode *Polynomial;	

//多项式读入函数
Polynomial PolyRead();

//添加结点函数
void Attach(int , int , Polynomial* );

//多项式求乘积函数
Polynomial PolyMultiply(Polynomial , Polynomial);

//链表输出
void PrintPoly(Polynomial P);

int main()
{
	Polynomial P1, P2, R_Add, R_Mult;
	P1 = PolyRead();
	P2 = PolyRead();

	R_Mult = PolyMultiply(P1, P2);	
	PrintPoly(R_Mult);

	system("pause");    //VS中调试结果输出暂停

	return 0;
}

//多项式读入函数
Polynomial PolyRead()	
{
	Polynomial P,Rear,t;
	int c, e, N;
	scanf_s("%d", &N);	//读入结点个数
	P =(Polynomial) malloc(sizeof(struct PolyNode));
    P->link = NULL;
	Rear = P;	//指向同一空头结点

	while(N--)
	{
		scanf_s("%d %d", &c, &e);	
		Attach(c, e, &Rear);
	}
	t= P; P= P->link; free(t);	//删除临时空的头结点

	return P;
}

//添加结点函数
void Attach(int coef, int expon, Polynomial *PtrRear)
{
	//本函数需要改变当前结果表达式的尾指针的值
	//函数传递进来的是尾项指针的地址
	Polynomial P;

	//申请新结点并赋值
	P=(Polynomial) malloc(sizeof(struct PolyNode));
	P->coef = coef;
	P->expon = expon;
	P->link = NULL;

	//将P指向新结点插入到当前结果表达式尾项后面
	(*PtrRear) ->link = P;
	*PtrRear = P;	//修改PtrRear值
}

//多项式求乘积函数
Polynomial PolyMultiply(Polynomial P1, Polynomial P2)
{
	Polynomial P, Rear, t1, t2, t;
	int c, e;

	if(!P1 || !P2) return NULL;
	t1= P1; t2 = P2;
	P=(Polynomial) malloc(sizeof(struct PolyNode));		//P为输出的乘积指针
	P->link = NULL;
	Rear = P;

	while(t2)	//先将t1第一项和t2相乘并加入Rear
		{	
			//t1,t2系数相乘,指数相加	
			Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
			t2= t2->link;
	}
	t1= t1->link;

	while(t1)
	{
		t2 = P2;	Rear = P;	//指针从头循环
		while(t2)
		{
			c = t1->coef * t2->coef;	//t1,t2系数相乘,指数相加
			e = t1->expon + t2->expon;

			while(Rear->link && Rear->link->expon >e)
				Rear = Rear->link;
			if(Rear->link && Rear->link->expon == e)
			{
				Rear->link->coef += c; 
				if(Rear->link->coef == 0)
				{
					t = Rear->link;
					Rear->link = t->link;
					free(t);	//删除指数为0结点
				}
			}
			else
			{
				t =(Polynomial) malloc(sizeof(struct PolyNode));
				t->coef =c;
				t->expon = e;
				t->link = Rear->link;
				Rear->link = t;	//插入t
				Rear = Rear->link;	//t2还在循环,需要继续往后移动

			}

			t2= t2->link;
		}
		t1= t1->link;
	}
	t = P; 
	P= P->link;
	free(t);  
	return P;
}


//链表输出
void PrintPoly(Polynomial P)
{
	//输出多项式
	int flag = 0;
	
	if(P ==NULL) printf("0 0");
	while(P)
	{
		if(!flag) flag = 1;	//头结点为空不输出
		else 
			printf(" ");
		printf("%d %d", P->coef, P->expon);

		P = P->link ;	
	}
	printf("\n");
	
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值