编写一个以O(M2N)时间执行乘法的程序,其中M是具有较少项数的多项式的项数

数据结构与算法分析练习3.7 编写一个函数将两个多项式相乘,用链表实现

本题解题思路可借鉴添加链接描述

#include<stdio.h>
#include<malloc.h>
#include<Error.h>
#include<stdlib.h>
#include<Windows.h>


//节点定义
struct Node
{
	int Coefficient;	//系数
	int Exponent;		//指数
	Position Next;
};
typedef struct Node *PtrToNode;
typedef PtrToNode Polynomial;		//以次幂(指)数降序排序的多项式
typedef PtrToNode Position;			//节点

//链表移动
Position Advance(Position P)
{
	return P->Next;
}

//多项式项数
int NumberOfPolynomialTerms(Polynomial Py)
{
	Position Tmp;
	int Num = 0;

	if(Py == NULL)
		return Num;

	Tmp = Py->Next;
	while(Tmp != NULL)
	{
		Tmp = Advance(Tmp);
		Num++;
	}

	return Num;
}

void Insert(int Coefficient,int Exponent, Polynomial L, Position P)
{
	Position TmpCell;

	TmpCell = (Position)malloc(sizeof(struct Node));
	if(TmpCell == NULL)
	{
		perror("Out of space");
		exit(1);
	}

	TmpCell->Coefficient = Coefficient;
	TmpCell->Exponent = Exponent;
	TmpCell->Next = P->Next;
	P->Next = TmpCell;
}

Polynomial UnionOfLinkList(Polynomial L1, Polynomial L2)
{
	Polynomial TmpPoly;
	Position P,Polyi,Polyj;
	
	TmpPoly = (struct Node*)malloc(sizeof(struct Node));
	if(TmpPoly == NULL)
	{
		perror("Out of Space");
		exit(1);
	}

	TmpPoly->Next = NULL;
	P = TmpPoly;
	Polyi = L1->Next;
	Polyj = L2->Next;
	
	while(Polyi && Polyj)
	{
		if(Polyi->Exponent > Polyj->Exponent)
		{
			PFL;
			Insert(Polyi->Coefficient,Polyi->Exponent,TmpPoly,P);
			Polyi = Advance(Polyi);
	
			P = Advance(P);
		}
		else if(Polyi->Exponent < Polyj->Exponent)
		{
			Insert(Polyj->Coefficient,Polyj->Exponent,TmpPoly,P);
			Polyj = Advance(Polyj);
	
			P = Advance(P);
		}
		else
		{
			Insert(Polyi->Coefficient+Polyj->Coefficient,Polyj->Exponent,TmpPoly,P);
	
			Polyi = Advance(Polyi);
			Polyj = Advance(Polyj);
	
			P = Advance(P);
		}
	}//end while
	
	while(Polyi != NULL)
	{
		Insert(Polyi->Coefficient,Polyi->Exponent,TmpPoly,P);
		Polyi = Advance(Polyi);
	
		P = Advance(P);
	}
	while(Polyj != NULL)
	{
		Insert(Polyj->Coefficient,Polyj->Exponent,TmpPoly,P);
		Polyj = Advance(Polyj);
	
		P = Advance(P);
	}

	return TmpPoly;
}

//多项式相乘       算法时间复杂度 O(M^2N),其中M是具有较小项数的多项式的项数
Polynomial MulPolynomialM2N(Polynomial P1,Polynomial P2)
{
	Polynomial Tmp1,Tmp2,TmpPoly;
	Position Pre;

	int Num = NumberOfPolynomialTerms(P1);
	struct Node **PolyProd = (struct Node **)malloc(sizeof(struct Node*)*Num);

	//选取较小项数的多项式
	if(NumberOfPolynomialTerms(P1)>NumberOfPolynomialTerms(P2))
		return MulPolynomialM2N(P2,P1);

	Tmp1 = P1->Next;
	for(int i=0;Tmp1 != NULL;i++)            //以较小项数的多项式每一项分别乘以较大项数的多项式   (乘法时间)O(MN)
	{
		//申请内存
		PolyProd[i] = (struct Node *)malloc(sizeof(struct Node));
		if(PolyProd[i] == NULL)
		{
			perror("Out of Space");
			exit(1);
		}

		PolyProd[i]->Next = NULL;
		Pre = PolyProd[i];					//移动节点
		Tmp2 = P2->Next;
		while(Tmp2 != NULL)
		{
			Insert(Tmp1->Coefficient*Tmp2->Coefficient,Tmp1->Exponent + Tmp2->Exponent,PolyProd[i],Pre);
			Pre = Advance(Pre);
			Tmp2 = Advance(Tmp2);
		}
		Tmp1 = Advance(Tmp1);
	}

	TmpPoly = (struct Node*)malloc(sizeof(struct Node));
	if(TmpPoly == NULL)
	{
		perror("Out of Space");
		exit(1);
	}

	TmpPoly->Next = NULL;

	for(int i=0;i<Num;i++)			//(求并时间)O((N+N)+(2N+N)+(3N+N)+……+(MN+N)) = O(M^2N)
	{
		TmpPoly = UnionOfLinkList(TmpPoly,PolyProd[i]);
	}
	return TmpPoly;
}

void PrintfPolynomial(Polynomial P)
{
	Position Ps = P->Next;
	while(Ps->Next != NULL)
	{
		if(Ps->Next->Coefficient<0)
			printf("%d*X^%d",Ps->Coefficient,Ps->Exponent);
		else
			printf("%d*X^%d+",Ps->Coefficient,Ps->Exponent);		//格式输出

		Ps=Advance(Ps);
	}

	if(Ps->Exponent == 0)
	{
		printf("%d",Ps->Coefficient);		//格式输出
	}
	else
	{
		printf("%d*X^%d",Ps->Coefficient,Ps->Exponent);		//格式输出
	}
}

Polynomial CreatePolynomial(int n)
{
	Polynomial head=(struct Node *)malloc(sizeof(struct Node)),p,pre=head;//head指向头结点,p指向新开辟的节点
	int coef; //系数
	int exp;	//指数
	if(NULL==head)
	{
		printf("开辟头结点失败\n");
		exit(-1);
	}
	head->Next=NULL;
	for(int i=0;i<n;i++)
	{
		if(NULL==(p=(struct Node *)malloc(sizeof(struct Node))))
		{
			printf("新结点malloc失败\n");
			exit(-1);
		}
		printf("请输入第%d个系数:",i+1);
		scanf("%d",&coef);
		printf("请输入第%d个指数:",i+1);
		scanf("%d",&exp);
		
		p->Coefficient=coef;
		p->Exponent=exp;  //更新节点数据
		p->Next=NULL;
		//插入节点
		pre->Next=p;
		pre=p;	
	}
	return  head;	//这里是返回堆的内存区 不是局部变量
}

int main()
{
	printf("  链表实现多项式的乘法   \n");
	printf("----by senly----\n\n");
	
	int n;
	
	printf("请输入A(X)的项数(降幂排列)\n");
	scanf("%d",&n);
	Polynomial head_a=CreatePolynomial(n);
	printf("A(X)=");
	PrintfPolynomial(head_a);

	printf("\n请输入B(X)的项数(降幂排列)\n");
	scanf("%d",&n);
	Polynomial head_b=CreatePolynomial(n);
	printf("B(X)=");
	PrintfPolynomial(head_b);
	printf("\n");

	Polynomial head_e=MulPolynomialM2N(head_a,head_b);
	printf("\nE(X)=A(X)*B(X)=");
	PrintfPolynomial(head_e);
	printf("\n");
	
	system("pause");
	return 0;
}
发布了1 篇原创文章 · 获赞 0 · 访问量 15

猜你喜欢

转载自blog.csdn.net/oXinYueShenHua/article/details/103966262