一元稀疏多项式计算器(c语言)

P(x),Q(x)分别为两个一元稀疏多项式计算器,利用单链表存储。实现相加,相减,就地逆置两者之差。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef struct term
{
	float coef;//系数
    int expn;//次方
    struct term *next;
}Position;
typedef struct
{
	Position *head;
	Position *tail;
	int len;
}Linklist;
void Initlist(Linklist *l)
{
	l->head=NULL;
	l->tail=NULL;
	l->len=0;
}
Position *create(Position *head,Linklist *l)
{
	int m,i=1;
	Position *p,*q;
	head=(Position *)malloc(sizeof(Position));
	p=q=head;
	head->next=NULL;
	printf("这个一元多项式共有几项:");
	scanf("%d",&m);
	l->head=head;
	l->len=m;
	while(i<=m)
	{
		p=(Position *)malloc(sizeof(Position));
		printf("第%d项的系数:",i);
		scanf("%f",&p->coef);
		printf("第%d项的次方:",i);
		scanf("%d",&p->expn);
		q->next=p;
		q=p;
		i++;
	}
	q->next=NULL;
	l->tail=q;
	return head;
}
void output(Position *head)
{
	Position *p;
	p=head->next;
	while(p)
	{	printf("(%.2f)X^%d",p->coef,p->expn);
		p=p->next;
		if(p)
			printf("+");
	}	
	printf("\n----------------------------\n\n");
}
Position *Calculate_add(Position *P,Position *Q,Position *add)
{
	float sum;
	int a,b;
	Position *pa,*pb,*pc,*q;
	add=(Position *)malloc(sizeof(Position));
	pa=P->next;
	pb=Q->next;
	q=pc=add;
	while(pa&&pb)
	{
		a=pa->expn;b=pb->expn;
		if(a<b)
		{
			pc=(Position *)malloc(sizeof(Position));
			pc->expn=pa->expn;
			pc->coef=pa->coef;
			pa=pa->next;
		}
		else if(b<a)
		{
			pc=(Position *)malloc(sizeof(Position));
	    	pc->expn=pb->expn;
			pc->coef=pb->coef;
			pb=pb->next;
		}
		else
		{
			sum=pa->coef+pb->coef;
			if(sum)
			{
				pc=(Position *)malloc(sizeof(Position));
				pc->coef=sum;
				pc->expn=pa->expn;
				pa=pa->next;
				pb=pb->next;
			}
			else
			{
				pa=pa->next;
				pb=pb->next;
				continue;
			}
		}
		q->next=pc;
		q=pc;
	}
	while(pa)
	{
		pc=(Position *)malloc(sizeof(Position));
		pc->expn=pa->expn;
		pc->coef=pa->coef;
		pa=pa->next;
		q->next=pc;
		q=pc;
	}
	while(pb)
	{
		pc=(Position *)malloc(sizeof(Position));
		pc->expn=pb->expn;
		pc->coef=pb->coef;
		pb=pb->next;
		q->next=pc;
		q=pc;
	}
	q->next=NULL;
	return add;
}
Position *Calculate_minus(Position *P,Position *Q,Position *minus)
{
	float sum;
	int a,b;
	Position *pa,*pb,*pc,*q;
	minus=(Position *)malloc(sizeof(Position));
	pa=P->next;
	pb=Q->next;
	q=pc=minus;
	while(pa&&pb)
	{
		a=pa->expn;b=pb->expn;
		if(a<b)
		{
			pc=(Position *)malloc(sizeof(Position));
			pc->expn=pa->expn;
			pc->coef=pa->coef;
			pa=pa->next;
		}
		else if(b<a)
		{
			pc=(Position *)malloc(sizeof(Position));
			pc->expn=pb->expn;
			pc->coef=-pb->coef;
			pb=pb->next;
		}
		else
		{
			sum=pa->coef-pb->coef;
			if(sum)
			{
				pc=(Position *)malloc(sizeof(Position));
				pc->coef=sum;
				pc->expn=pa->expn;
				pa=pa->next;
				pb=pb->next;
			}
			else
			{
				pa=pa->next;
				pb=pb->next;
				continue;
			}
		}
		q->next=pc;
		q=pc;
	}
	while(pa)
	{
		pc=(Position *)malloc(sizeof(Position));
		pc->expn=pa->expn;
		pc->coef=pa->coef;
		pa=pa->next;
		q->next=pc;
		q=pc;
	}
	while(pb)
	{
		pc=(Position *)malloc(sizeof(Position));
		pc->expn=pb->expn;
		pc->coef=pb->coef;
		pb=pb->next;
		q->next=pc;
		q=pc;
	}
	q->next=NULL;
	return minus;
}
int sort(Position *head)
{
	Position *later,*pre,*member;
	pre=head->next;
	if(!pre&&!pre->next)
		return ERROR;
	float temp;
	int t; 
	later=pre->next;
	while(pre->next)
	{
         member=pre;
			 while(later)
			 {
	        	if((member->expn) > (later->expn))
				{
			             member=later;
				}
				later=(later->next);
			 }
			 t=pre->expn;
			 pre->expn=member->expn;
			 member->expn=t;
			 temp=pre->coef;
			 pre->coef=member->coef;
			 member->coef=temp;
	      	pre=pre->next;
		   later=pre->next;
	}
	return OK;
}
void converse(Position *head)  
{  
    Position *p,*q;  
    p=head->next;  
    head->next=NULL;  
    while(p)  
    {  
        q=p;  
        p=p->next;   
        q->next=head->next;  
        head->next=q;  
    }  
}
void destroylist(Position *head)
{
	Position *p,*q;
	p=head;

	while(p)
	{
		q=p->next;
		free(p);
		p=q;
	}
	head->next=NULL;
}
void main()
{
	Linklist hp,hq;
	Position *lp=NULL,*lq=NULL,*la=NULL;
	printf("请输入P(x):\n");
	lp=create(lp,&hp);
	sort(lp);
	printf("P(x):\n");
	output(lp);
	printf("请输入Q(x):\n");
	lq=create(lq,&hq);
	sort(lq);
	printf("Q(x):\n");
	output(lq);
	la=Calculate_add(lp,lq,la);
	printf("P(x)+Q(x):\n");
	output(la);
	la=Calculate_minus(lp,lq,la);
	printf("P(x)-Q(x):\n");
	output(la);
	converse(la);
	printf("逆置P(x)-Q(x):\n");
	output(la);
	destroylist(lp);
	destroylist(lq);
	destroylist(la);
	printf("\n谢谢使用!\n\n");

}

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值