多项式相加(实验题2.7)

//
//polyarray.h
//

#pragma once
#include <malloc.h>
#include <stdio.h>

//
//求两个多项式相加运算,单链表实现
//譬如 4x^2+3x与-4x^2+3x^2  相加结果为3x^2+3x
//2013-9-26 23:09
//

#define MAX 20 //多项式最多项数
typedef struct  //存放多项式的数组类型
{
	float coef;
	int exp;
}PolyArray[MAX];

typedef struct pnode
{
	float coef;
	int exp;
	pnode *next;
}PolyNode;

void CreatListR(PolyNode* &L,PolyArray a,int n); //建立单链表

void DispPloy(PolyNode* L);

void Sort(PolyNode* &L); //按exp域递减排序
 
void AddPloy(PolyNode *ha,PolyNode* hb,PolyNode *&hc); //两个多项式相加


 

//
//polyarray.cpp
//

#include "polyarray.h"

void CreatListR( PolyNode* &L,PolyArray a,int n )
{
	L = (PolyNode*)malloc(sizeof(PolyNode));
	L->next = NULL;

	PolyNode* p;
	PolyNode* q = L;
	for ( int i = 0; i < n; i ++)
	{
		p = (PolyNode*)malloc(sizeof(PolyNode));
		p->coef = a[i].coef;
		p->exp = a[i].exp;
		p->next = NULL;

		q->next = p;

		q = p;
	}
}

void DispPloy( PolyNode* L )
{
	PolyNode* p = L->next;
	while ( NULL != p)
	{
		printf(" %gX^%d ",p->coef,p->exp);
		p = p->next;
	}
	printf("\n");
}

void Sort( PolyNode* &L )
{
	PolyNode* p = L;
	PolyNode *q,*r;
	if ( p->next == NULL)
	{
		return;
	}

	r = p->next->next;
	p->next->next = NULL;

	while ( r != NULL )
	{
		q = r;
		r = r->next;

		p = L;

		while ( p->next != NULL && p->next->exp > q->exp)
		{
			p = p->next;;
		}

		//此时p指向要插入位置的上一个节点
		q->next = p->next;
		p->next = q;
	}
}

void AddPloy( PolyNode *ha,PolyNode* hb,PolyNode *&hc )
{
	hc = (PolyNode*)malloc(sizeof(PolyNode));
	hc->next = NULL;

	PolyNode *pa = ha->next, *pb = hb->next;
	PolyNode *pc; //每次要创建的节点
	PolyNode *tc = hc; //总是指向hc最后一个节点的指针
	while ( pa != NULL && pb != NULL)
	{
		pc = (PolyNode*)malloc(sizeof(PolyNode));
		pc->next = NULL;

		if (pa->exp > pb->exp)
		{
			pc->exp = pa->exp;
			pc->coef = pa->coef;

			pa = pa->next;
		}
		else if ( pa->exp < pb->exp)
		{
			pc->exp = pb->exp;
			pc->coef = pb->coef;
			pb = pb->next;
		}
		else
		{
			if ( pa->coef + pb->coef == 0)
			{
				pa = pa->next;
				pb = pb->next;
				free(pc);
				continue;
			}
			pc->exp = pb->exp;
			pc->coef = pa->coef + pb->coef;
			pa = pa->next;
			pb = pb->next;
		}
		tc->next = pc;
		tc = pc;
	}

	//复制余下的节点
	if ( pb == NULL)
	{
		pb = pa;
	}

	while( pb != NULL)
	{
		pc = (PolyNode*)malloc(sizeof(PolyNode));
		pc->next = NULL;
		pc->coef = pb->coef;
		pc->exp = pb->exp;

		tc->next = pc;
		tc = pc;

		pb = pb->next;
	}
}


 

#include "polyarray.h"

int main()
{
	PolyNode* ha,*hb,*hc;
	PolyArray a = {{1.2,0},{3.2,3},{2.5,1},{-2.5,5}};
	PolyArray b = {{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};
	CreatListR(ha,a,4);
	DispPloy(ha);

	CreatListR(hb,b,5);
	DispPloy(hb);	
	Sort(ha);
	Sort(hb);
	DispPloy(ha);
	DispPloy(hb);

	//PolyNode* hc;
	AddPloy(ha,hb,hc);
	DispPloy(hc);
	return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值