一元N次多项式的表示及相加

                                    线性表 — 一元n次多项式的表示与相加

这里用线性链表的基本操作来实现一元多项式的运算:

 

//一元N次多项式相加 
#include<stdio.h>
#include<stdlib.h>

typedef struct tagpolyn{
	float coef;              //系数 
	int expn;                //指数 
	struct tagpolyn *next;
}polyn,*LinkList;
//创建链表函数
void CreatPolyn(LinkList *L)
{
	LinkList q,s;
	*L=(LinkList)malloc(sizeof(polyn));
	(*L)->next=*L;
	for(;;){
		s=(LinkList)malloc(sizeof(polyn));
		scanf("%f%d",&s->coef,&s->expn);
		if(s->coef==0 && s->expn==0)break;    //当输入数据0 0时结束此循环
		else{
			q=*L;
			while((q->next != *L)&&(s->expn < q->next->expn))q=q->next; //按指数由大到小插入链表。
			s->next=q->next;
			q->next=s;
		}
	}
}
//链表连接函数
void AddPolyn(LinkList La,LinkList Lb,LinkList *Lc)
{
	*Lc=(LinkList)malloc(sizeof(polyn));
	(*Lc)->next=NULL;
	LinkList qa=La->next,qb=Lb->next,qc=*Lc;
	while(qa!=La && qb!=Lb){  //当qa与qb都没有等于头结点时,进行以下操作。
        if(qa->expn == qb->expn)
        {
        	qa->coef+=qb->coef;
        	qc->next=qa;
        	qc=qa;
        	qa=qa->next;
        	qb=qb->next;
        }
        else if(qa->expn < qb->expn)
        {
        	qc->next=qb;
        	qc=qb;
        	qb=qb->next;
        }
        else {
        	qc->next=qa;
        	qc=qa;
        	qa=qa->next;
        }
	}
	if(qa!=La){// 当Lb链表插入完后,La还有剩余数据,则将这些数据接在lc的后面。
		while(qa!=La){
			qc->next=qa;
			qc=qa;
			qa=qa->next;
		}
	}
	else{     // 当La链表结束后,Lb还有剩余数据,则将这些数据接在lc的后面。
		while(qb!=Lb){
			qc->next=qb;
			qc=qb;
			qb=qb->next;
		}
	}
	qc->next=*Lc;
}
//链表输出函数
void PrintList(LinkList *head)
{	
	polyn *p;
	p=*head;
	while(1){//因为要输出的链表都是循环链表,因此输出控制条件应该是当指针不是指向头结点时。
		printf("%.2f*x^%d",p->next->coef,p->next->expn);
		p=p->next;
		if(p->next!=*head){
		    printf(" + ");
		}
		else break;
	}
	printf("\n");
}

int main()
{
	LinkList pa,pb,pc;
	printf("请输入第一个多项式(以0 0结尾):\n"); 
	CreatPolyn(&pa);
	printf("请输入第二个多项式(以0 0结尾):\n"); 
	CreatPolyn(&pb);
	printf("f1(x) = ");
	PrintList(&pa);
	printf("f2(x) = ");
	PrintList(&pb);
	AddPolyn(pa,pb,&pc);
	printf("f1(x)+f2(x)的结果为:\nf(x) = "); 
	PrintList(&pc);
	return 0;
}

以下是演示结果:
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值