用单链表表示【多项式加法】

  • 测试用的多项式
p1 = 2x^2 + 3x + 1
p2 = -2x + 3
p1 + p2 可以得到:  2x^2 + x + 4
  • 节点定义
struct ployNode{
	int coef; // 系数
	int expon; // 指数
	struct ployNode *next;  // 指向下一个指针
};

typedef struct ployNode ploynomial;
  • 思路
主要是看指数的大小,进行对应项的合并。有下面三种情况: 
p1->expon == p2->expon : 将对应的系数相加(不为零的话),得到新节点存入pResult , p1,p2后移一个节点
p1->expon > p2->expon : p1 存入pResult,p1后移, p2不动
p1->expon < p2->expon : p2 存入pResult,p2后移, p1不动

当p1和p2其中一个全部遍历完成之后,将另一个直接连到新链表的最后即可

多项式相加的核心函数:ploynomial* ployAdd(ploynomial *p1, ploynomial *p2)
input:p1,p2【两个多项式指针】 。返回相加之后的多项式指针。

ploynomial* ployAdd(ploynomial *p1, ploynomial *p2) {
	ploynomial *front,*rear;
	front = (ploynomial*)malloc(sizeof(ploynomial));
	if(!front){
		printf("malloc error!!\n");
	}
	rear = front; // 存储结果链表当中首尾指针
	int sum;
	while(p1 && p2){
		switch(compare(p1->expon , p2->expon)){
			case 1:	
				// 大于的情况
				append(p1->coef,p1->expon,&rear);
				p1 = p1->next;
				break;
			case 0: 
				// 等于的情况
				sum = p1->coef + p2->coef;
				if(sum != 0) append(sum,p1->expon,&rear);
				p1 = p1->next;
				p2 = p2->next;
				break;
			case -1: 
				// 小于的情况
				append(p2->coef , p2->expon,&rear);
				p2 = p2->next;
				break;
		}
	}
	// 处理剩余项
	for( ; p1; p1 = p1->next) 
		append(p1->coef,p1->expon,&rear);
	for( ; p2; p2 = p2->next)
		append(p2->coef,p2->expon,&rear);

	rear->next = NULL;
	return front->next;
}

// 处理存入pResult的节点
void append(int coef,int expon, ploynomial **rear){
	ploynomial *p = (ploynomial*)malloc(sizeof(ploynomial));
	if(!p) printf("malloc error!! line71\n");
	p->coef = coef;
	p->expon = expon;
	p->next = NULL;
	// rear 是指针的地址
	// (*rear) 和 p是等价的
	(*rear)->next = p;
	*rear = p;
}
int compare(int a, int b){
	if(a == b) return 0;
	return a>b?1:-1;
}
int main(){
	ploynomial *p1 ;
	ploynomial item1 = {2,2,NULL};
	ploynomial item2 = {3,1,NULL};
	ploynomial item3 = {1,0,NULL};
	item1.next = &item2;
	item2.next = &item3;
	
	p1 = &item1;

	ploynomial *p2 ;
	ploynomial item4 = {-2,1,NULL};
	ploynomial item5 = {3,0,NULL};
	item4.next = &item5;
	p2 = &item4;

	ploynomial *result =  ployAdd(p1,p2);
	for(; result; result = result->next){
		printf("coef: %d, expon: %d\n",result->coef,result->expon);
	}

	return 0;
}

学习的是mooc上的浙江大学数据结构课程 链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值