C语言 --- 一元稀疏多项式运算

题目要求

输入并建立多项式;
输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列;
多项式A和B相加,建立多项式A+B,输出相加的多项式;
多项式A和B相减,建立多项式A-B,输出相减的多项式;
多项式A和B相乘,建立多项式A×B,输出相乘的多项式;
设计一个菜单,至少具有上述操作要求的基本功能。

功能设计

在这里插入图片描述

结构体设计

typedef struct polynomial//多项式的每一项结构
{
double coefficient;//系数
int index;//指数
struct polynomial *next;//连接指针
}node;

部分原代码

以下为部分重要函数代码,仅供参考.

// 创建多项式链表
struct polynomial *create()
{
	node *head=NULL,*p1,*p2=NULL;
	int n;//项数
	int i;
	count++;
	printf(" 请输入多项式");
	if(count==1)printf(" A ");
	else printf(" B ");
	printf("的 <项数>:");
	scanf("%d",&n);
	head = (struct polynomial*)malloc(sizeof(struct polynomial));//动态创建链表
	for(i=1;i<=n;i++)
	{
		if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL)
		{
			printf("ERROR");
			exit(0);
		}
		p1->next =NULL;
		printf(" 请输入多项式");
		if(count==1)printf(" A ");
		else printf(" B ");
		printf("的第 %d 项系数和指数:",i);
		scanf("%lf",&p1->coefficient);
		scanf("%d",&p1->index );
		if(i==1)head->next =p1;//输入是第一项时,头节点指针指向第一项
		else p2->next = p1;//连接链表
		p2 = p1;
	}
	printf(" 多项式");
	if(count==1)printf(" A = ");
	else printf(" B = ");
	sort(head);
	display(head);
	printf(" ━━━━━━━━━━━━━━━━━━━━\n");
	return head;
}
// 多项式排序
void sort(struct polynomial *head)
{
	node *p1,*curr,*pre,*p2;//新建链表
	p1 = head->next  ;//p1指针所指向的结点要逐个取出作为插入结点
	head->next = NULL;//head指针带头结点,初始为空链表
	while(p1 != NULL)//p1指针不为空时循环
	{
		curr = head->next  ;
		pre = head ;
		//定位插入位置,退出循环时,pre指针向要插入节点的位置
		while(curr != NULL && curr->index >= p1->index )
		{
			pre = curr ;
			curr = curr->next ;
		}
		p2 = p1; //p2指针指向要插入结点的位置
		p1 = p1->next ;//p1指针指向下一个结点
		//p2指针所指结点插入pre指针所指结点后
		p2->next = pre->next ;
		pre->next = p2;
	}
}
// 多项式加法和减法
void add_subtract(struct polynomial *head1,struct polynomial *head2)
{
	node *head=NULL;//新建链表储存相加后多项式
	node *p1=NULL;//中间变量
	node *p2=NULL;//保留前一个结点
	node *p=NULL;//第一个多项式的循环变量
	node *pp=NULL;//第二个多项式的循环变量
	if((head=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
		printf("ERROR");
		exit(0);
	}
	head->next=NULL;
	for(pp=head2->next;pp!=NULL;pp=pp->next){//复制第二个多项式链表
		if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
			printf("ERROR");
			exit(0);
		}
		p1->next=NULL;
		if(count==2)p1->coefficient=pp->coefficient;//加法直接复制
		if(count==3||count==4)p1->coefficient=(-1.0)*pp->coefficient;//减法取相反数
		p1->index=pp->index;
		if(head->next==NULL)head->next=p1;
		else p2->next=p1;
		p2=p1;
	}
	for(p=head1->next;p!=NULL;p=p->next){//循环多项式的每一项
		for(pp=head->next,p2=head; pp!=NULL; ){
			if(p->index == pp->index){//指数相等
				pp->coefficient=p->coefficient+pp->coefficient;//系数相加
				if(pp->coefficient==0){
					pp=pp->next;
					p2->next=pp;
				}
				else{
					pp=pp->next;
					p2=p2->next;
				}
				break;
			}
			if(pp->next==NULL){//没有相同指数项,创建添加
				if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
					printf("ERROR");
					exit(0);
				}
				p1->next =NULL;
				p1->coefficient=p->coefficient;//多余项添加到新建链表
				p1->index=p->index;
				p1->next=head->next;
				head->next=p1;

				pp=pp->next;
				p2=p2->next;
				break;
			}
			pp=pp->next;
			p2=p2->next;
		}
	}
	if(count==2)printf(" A + B = ");
	if(count==3)printf(" A - B = ");
	if(count==4)printf(" B - A = ");
	sort(head);
	display(head);
	printf(" ━━━━━━━━━━━━━━━━━━━━\n");
}
// 多项式乘法
void multiplication(struct polynomial *head1,struct polynomial *head2)
{
	node *head=NULL;//相乘后的多项式所有项的链表头节点
	node *p1=NULL;//中间变量
	node *p2=NULL;//保留前一个结点
	node *p=NULL;//第一个多项式的循环变量
	node *pp=NULL;//第二个多项式的循环变量
	if((head=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
		printf("ERROR");
		exit(0);
	}
	head->next=NULL;
	//两个循环建立多项式相乘后所有项的存储链表
	for(p=head1->next;p!=NULL;p=p->next){
		for(pp=head2->next; pp!=NULL ; pp=pp->next){
			if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
				printf("ERROR");
				exit(0);
			}
			p1->next=NULL;
			p1->coefficient=p->coefficient*pp->coefficient;//系数相乘
			p1->index=p->index+pp->index;//指数相加
			if(head->next==NULL)head->next=p1;//添加到新建链表
			else p2->next=p1;
			p2=p1;
		}
	}
	for(p=head->next;p!=NULL;p=p->next){//合并多项式,相同指数项合并
		for(pp=p->next,p2=p;pp!=NULL;pp=pp->next,p2=p2->next){
			if(p->index==pp->index){
				p->coefficient=p->coefficient+pp->coefficient;
				pp=pp->next;
				p2->next=pp;
			}
		}
	}
	if(count==5)printf(" A * B = ");
	sort(head);
	display(head);
	printf(" ━━━━━━━━━━━━━━━━━━━━\n");
}

功能实现截图

输入
加法
减法
乘法

报告

目录

报告+全部源码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值