链表实现多项式乘法



基于链式存储结构实现两个多项式的乘法问题,
例如多项式A = 2x3 + 3x + 1,多项式B = 5x4 + 2x3 - 3x2 – 3,
则A * B = 10x7 + 4x6 + 9x5 + 11x4 -13x3 – 3x2 – 9x – 3。




#include <iostream>
#define ok 1
#define error 0

using namespace std;

typedef int status;
typedef int ElemType;

//定义 
typedef struct PNode
{
	float coef;                                     //系数
	int expn;                                       //指数
	struct PNode *next;                             //指针域 
}PNode, *Polynomial;

//声明
status InitList(Polynomial &P);
status CreatePolyn(Polynomial &P);
status Mult_Poly(Polynomial Pa, Polynomial Pb,Polynomial &P);
status sort(Polynomial &P);
status merge(Polynomial &P);
status del_coef(Polynomial &P);
status DispList(Polynomial P);
void Link(Polynomial P );

//主函数 
int main()
{
	int n;
	float coef;
	int expn;
	
	Polynomial P;          
	InitList(P);
	Polynomial Pa;
	Polynomial Pb;
	InitList(Pa);
	InitList(Pb);
	
	cout << "请输入多项式A (以0 0结束):" << endl;
	CreatePolyn(Pa);
	cout << endl;
	
	cout << "请输入多项式B (以0 0结束):" << endl;
	CreatePolyn(Pb);
	cout << endl;

    cout << "多项式Pa和Pb相乘后的结果是:" << endl;
    Mult_Poly(Pa, Pb,P);
    DispList(P);
    cout << endl;
    
    cout << "按指数排序后的结果是:" << endl;
    sort(P);
    DispList(P);
    cout << endl;
    
    cout << "合并重复项后的结果是:" << endl;
    merge(P);
    DispList(P);
    cout << endl;
    
    cout << "删除系数为0的项后的结果是:" << endl;
    del_coef(P);
    DispList(P);
    
	return 0; 
}

//初始化
status InitList(Polynomial &P)
{
    P = new PNode;                                    //先建立一个带头结点的单链表
	P->next = NULL;                                   //初始化单链表next域置空 
	return ok;	
} 

//创建
status CreatePolyn(Polynomial &P)
{ 
	PNode *p = P;                                       //指针p指向头结点 
	int i = 1;                                          //i记录第几项 
	float coef;                                         //系数 
	int expn;                                           //指数 
	while (1)
	{
		cout << "请输入第" << i << "项的系数和指数:"   << endl;
		cin >> coef >> expn ;                           //输入系数和指数 
		 
		if (coef == 0 && expn == 0)                     //以0 0结束 
		   break;
		   
		else
		{
		 
	    	PNode *s = new PNode;                       //生成新结点 
	        s->coef = coef;                             //将输入的系数存放在新结点的系数域 
	    	s->expn = expn;                             //将输入的指数存放在新结点的指数域 
	        p->next = s;                                //将新结点链接在头结点之后 
	        s->next = NULL;                             //新结点next域置空 
	        p = s;                                      //p指向新结点s 
	        i++;
	    }  
    }
    return ok;
} 

//乘法

status Mult_Poly(Polynomial Pa, Polynomial Pb,Polynomial &P)
{ //第一个多项式的每一项分别乘第二个多项式的每一项 

	PNode *p1 = Pa->next;	                              //p1指向Pa的首元结点 
	PNode *p= P;                                          //p指向头结点 
	p->next = NULL;                                       //p的next域置空     
	           
	while (p1 != NULL)                                    //如果p1不为空 
	{
		PNode *p2 = Pb->next;                             //p2指向Pb的首元结点 
	    while (p2 != NULL)
	    {
	        PNode *q = new PNode;                         //生成新结点q,用来存放相乘后的结点          
        	q->next = NULL;  	    	
	    	q->coef = (p1->coef) * (p2->coef);            //系数相乘 
	        q->expn = (p1->expn) + (p2->expn);            //指数相加 
	        
	        p->next = q;                                  //将相乘后的新结点q存放在p的next域中 
	        p = q;                                        //p指向q 
	        p2 = p2->next;                                //p2后移
		}
		p1 = p1->next;                                    //p2为空,内层循环结束,进入外循环,p1后移 
	}
	return ok;	
}

//排序
status sort(Polynomial &P)
{
    float coef;
    int expn;
	PNode *p = P->next;                            //p指向首元结点 
	while (p->next)           
	{
		PNode *q = p->next;                        //q指向p的后继结点 
	    while (q)
        {
	      if (p->expn < q->expn)                   //如果后继结点比当前结点的指数大,就交换结点值 
	       {
                coef = p->coef;
                expn = p->expn;
	           	p->coef = q->coef;
	           	p->expn = q->expn;
	    	    q->coef = coef;
			    q->expn= expn; 	
	       }
	    	q = q->next;                           //后继结点q后移 
	    }
    	p = p->next;                               //内层循环结束当前结点p后移 
     }
	return ok;	
} 

//合并同类项
status merge(Polynomial &P)
{
	sort(P);                                      //排序 
	PNode *p = P->next;                           //p指向首元结点 
	float sum;                                    //用来保存指数相同时的,两个结点的系数 
	PNode *q = p->next;                           //q指向p的后继      
	while (p->next)
	{
		if (p->expn == q->expn)                   //指数相等 
		{
			sum = (p->coef + q->coef);            //指数相加 
		    p->coef = sum;                        //将相加后的系数赋给首元结点的系数域 
		    
			PNode *r = q;                         //生成新结点r指向q 
		    q = q->next;                          //q后移 
			p->next = q;                          //将q链接在p的后面 
			delete r;                             //删除q 
		}
		else                                      //指数不相等 
		{
	    	p = q;
		    q = q->next;
		} 
	}
	return ok;
}

//删除系数为0的项的结果是
status del_coef(Polynomial &P)
{
    PNode *p = P->next;
	while (p != NULL)
	{
	    if (p->coef == 0)                        //如果系数等于0 
		{ 
		    PNode *q = p->next;                  //删除当前结点 
		    delete p;
		    p = q;
		}
		else                                     //否则,p指针后移 
	    	p = p->next;	
	}	
} 
 
//输出
status DispList(Polynomial P)
{
	PNode *p = P->next;
	while (p->next)
	{
		if (p->coef > 0)
	    {
	    	if (p->expn == 0)
	    	   cout << "(" << p->coef << ")" << ' '<< "*" << ' ' <<  "x^" << p->expn << ' ' << "+" << ' ';
	    	else
	    	   cout << "(" << p->coef << ")" << ' ' <<"*" << ' ' <<  "x^" << p->expn << ' ' << "+" << ' ';
		}
		if (p->coef < 0)
		{
			if (p->expn == 0)
			   cout << "(" << p->coef << ")" << ' '<< "*" << ' ' <<  "x^" << p->expn << ' ' << "+" << ' ';
			else
			   cout << "(" << p->coef << ")" << ' '<< "*" << ' ' << "x^" << p->expn << ' ' << "+" << ' ';
		}
        p = p->next;
	}
	cout << "(" << p->coef << ")" << ' '<< "*" << ' ' << "x^" << p->expn << ' ' ;
		
	return ok;
} 

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值