一元多项式的加法和乘法运算

/*
**程序功能:一元多项式的加法和乘法操作
**存储:用数组存储多项式的所有系数,用一个整型值存储最高指数
*/

#include<stdio.h>
#include<stdlib.h>
#define COFFICIENT_MAX 1000

/*此结构用来存储一个多项式*/
struct polynomial
{
	int cofficient_array[COFFICIENT_MAX];  /*多项式的系数用数组来存储*/
	int highest_exponent;		/*指数最高项的指数*/
};

void poly_init (struct polynomial *poly)
{
	int i;
	
	for(i=0; i<COFFICIENT_MAX; i++)
		poly->cofficient_array[i] = 0;
	poly->highest_exponent = 0;
}

void poly_add( struct polynomial *poly1, struct polynomial *poly2, struct polynomial *polysum)
{
	int i;
	
	polysum->highest_exponent = 
		(poly1->highest_exponent > poly2->highest_exponent) ? poly1->highest_exponent : poly2->highest_exponent;
	
	for(i=0; i <= polysum->highest_exponent; i++)
		polysum->cofficient_array[i] = poly1->cofficient_array[i] + poly2->cofficient_array[i];
}

void poly_mul( struct polynomial *poly1, struct polynomial *poly2, struct polynomial *polymul)
{
	int i,j;
	
	polymul->highest_exponent = poly1->highest_exponent + poly2->highest_exponent;
	
	for(i=0; i <= poly1->highest_exponent; i++)
		for(j=0; j<= poly2->highest_exponent; j++)
			polymul->cofficient_array[i+j] += poly1->cofficient_array[i] * poly2->cofficient_array[j]; 
}

void poly_print(struct polynomial *poly)
{
	int i;
	
	printf("cofficients: ");
	for(i=0; i<=poly->highest_exponent; i++)
		printf("%d ",poly->cofficient_array[i]);
	printf("\nexponent= %d\n", poly->highest_exponent);
}

int main()
{
	struct polynomial *poly1, *poly2, *polysum, *polymul;
	
	poly1 = malloc( sizeof(struct polynomial));
	poly2 = malloc( sizeof(struct polynomial));
	polysum = malloc( sizeof(struct polynomial));
	polymul = malloc( sizeof(struct polynomial));
	
	poly_init(polysum);
	poly_init(polymul);
	
	poly1->cofficient_array[0] = 4;
	poly1->cofficient_array[1] = 1;
	poly1->cofficient_array[2] = 0;
	poly1->cofficient_array[3] = 3;
	poly1->highest_exponent = 3;
	poly_print(poly1);
	
	poly2->cofficient_array[0] = 1;
	poly2->cofficient_array[1] = 6;
	poly2->cofficient_array[2] = 5;
	poly2->highest_exponent = 2;
	poly_print(poly2);
	
	poly_add(poly1, poly2, polysum);
	poly_print(polysum);
	
	poly_mul(poly1, poly2, polymul);
	poly_print(polymul);
	
	return 0;
}


/*
**程序功能:一元多项式的加法和乘法操作; 
**存储:采用带表头结点的链表存储一个一元多项式,链表的每个结点存储单项的系数和指数
**注意:本程序针对的情况是:结点的顺序按照指数降序排列;
**如果结点顺序按指数升序排列,程序稍微修改就可以使用
**如果乱序存放,则算法会失败
*/

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

/* 多项式中的每个结点*/
struct item_node   
{
	int coefficient;  /*系数*/
	int exponent;   /*指数*/
	struct item_node *next;
};

/*将一个多项式存到链表中,coefs是系数数组,exps是指数数组,n是两个数组的长度*/
struct item_node * poly_store(int *coefs, int *exps, int n)
{
	struct item_node *head;
	struct item_node *curr, *new;
	
	new = malloc(sizeof(struct item_node));  /*表头结点,不存储有用的信息*/
	head = curr = new;
	
	if(n>0)
	{
		int i;
		for(i=0; i<n; i++)
		{
			new = malloc(sizeof(struct item_node));   /*创建一个新结点*/
			new->coefficient = coefs[i];
			new->exponent = exps[i];
			
			curr->next = new;     /*存到表尾*/
			curr = new;
		}
	}
	
	new->next = NULL;
		
	return head;
}

/*打印多项式*/
void poly_print(struct item_node *poly)
{
	struct item_node *curr = poly->next;   /*第一个有用结点*/
	
	printf("polynomial:");
	while(curr != NULL)
	{
		printf("(%d,%d) ",curr->coefficient, curr->exponent);
		curr = curr->next;
	}
	printf("\n");
}

/*多项式加法操作,返回结果多项式的头指针*/
struct item_node * poly_add(struct item_node *poly1, struct item_node *poly2)
{
	struct item_node *head, *new, *curr;
	struct item_node *curr1, *curr2;
	
	new = malloc(sizeof(struct item_node));  /*表头结点,不存储有用的信息*/
	head = curr = new;
	
	curr1 = poly1->next, curr2 = poly2->next;
	
	while(curr1 != NULL && curr2 != NULL)
	{
		new = malloc( sizeof(struct item_node) );   /*创建新结点,插入到结果链表中*/
		curr->next = new;
		curr = new;
		
		/*修改新结点的 系数值 和 指数值*/
		if(curr1->exponent == curr2->exponent)
		{
			curr->coefficient = curr1->coefficient + curr2->coefficient;
			curr->exponent = curr1->exponent;
			curr1 = curr1->next;
			curr2 = curr2->next;
		}
		else if(curr1->exponent > curr2->exponent)
		{
			curr->coefficient = curr1->coefficient;
			curr->exponent = curr1->exponent;
			curr1 = curr1->next;
		}
		else
		{
			curr->coefficient = curr2->coefficient;
			curr->exponent = curr2->exponent;
			curr2 = curr2->next;
		}
	}
	
	while(curr1 != NULL)   /*处理链表1中剩余的项*/
	{
		new = malloc( sizeof(struct item_node) );   /*创建新结点,插入到结果链表中*/
		curr->next = new;
		curr = new;
		curr->coefficient = curr1->coefficient;
		curr->exponent = curr1->exponent;
		curr1 = curr1->next;
	}
	while(curr2 != NULL)    /*处理链表2中剩余的项*/
	{
		new = malloc( sizeof(struct item_node) );   /*创建新结点,插入到结果链表中*/
		curr->next = new;
		curr = new;
		curr->coefficient = curr2->coefficient;
		curr->exponent = curr2->exponent;
		curr2 = curr2->next;
	}
	
	new->next = NULL;
	return head;
}

struct item_node * poly_mul(struct item_node *poly1, struct item_node *poly2)
{
	struct item_node *head, *new, *curr, *prev;
	struct item_node *curr1, *curr2;
	int coef, exp;
	
	new = malloc(sizeof(struct item_node));  /*表头结点,不存储有用的信息*/
	new->next = NULL;
	head = new;
	curr1 = poly1->next, curr2 = poly2->next;
	
	while(curr1 != NULL)
	{
		prev = head;
		curr = head->next;
		
		while(curr2 != NULL)
		{
			coef = curr1->coefficient * curr2->coefficient;
			exp = curr1->exponent + curr2->exponent;
			while(curr != NULL && curr->exponent > exp)
			{
				prev = curr;  curr = curr->next;
			}
			
			if(curr != NULL && curr->exponent == exp)    /*当存储结果的链表中有系数相同的项时,合并同类项*/
				curr->coefficient += coef;
			else  								/*否则插入创建新结点,并插入当前结点的前面,下面的代码可以处理插入表头,表尾的特殊情况*/
			{
				new = malloc(sizeof(struct item_node));
				new->coefficient = coef;
				new->exponent = exp;
				
				new->next = curr;
				prev->next = new;
				/*
				prev务必始终指向curr的前一个结点,否则插入后会丢失原来处在prev和curr之间的一个或者多个结点
				*由于这句丢失花了好长时间才找到原因
				*/
				prev = new;    
			}
			
			curr2 = curr2->next;
		}
		
		curr1 = curr1->next;
		curr2 = poly2->next;   /*每进行一次外层循环,curr2就必须指向poly2的第一项*/
	}
	
	return head;
}

int main()
{
	int coefs1[] = {4, 5};
	int exps1[] = {3, 2};
	int coefs2[] = {7, 2, 1, 11};
	int exps2[] = {4, 3, 1, 0};
	
	struct item_node *head1 = poly_store(coefs1, exps1, 2);
	struct item_node *head2 = poly_store(coefs2, exps2, 4);
	struct item_node *sum, *mul;
	
	poly_print(head1);
	poly_print(head2);
	
	sum = poly_add(head1, head2);
	poly_print(sum);
	
	mul = poly_mul(head1, head2);
	poly_print(mul);
	
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值