一元稀疏多项式计算器

(1)设Pn(x)和Qn(x)分别为两个一元稀疏多项式,利用单链表存储Pn(x)和Qm(x)。

(2)从键盘输入一元多项式的信息,建立一元稀疏多项式Pn(x)和Qm(x),并输出。

(3)实现Pn(x)和Qm(x)相加,并输出两者的和Pn(x)+Qm(x)。

(4)实现Pn(x)和Qm(x)相减,并输出两者的差Pn(x)-Qm(x)。

(5)就地逆置两者的差Pn(x)-Qm(x)。

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

typedef struct LNode{
	int xi;//系数
	int zhi;//指数
	struct LNode *next; 
}*LinkList,LNode;

LNode * InitList(LinkList L);
LNode * ReadNum(LinkList L); 
void PrintList(LinkList L);
LNode * PnQm_Add(LinkList Pn,LinkList Qm,LinkList Pn_Qm);
LNode * PnQm_Sub(LinkList Pn,LinkList Qm,LinkList Pn_Qm);
LNode * Reserve(LinkList Pn_Qm);

int main()
{
	LinkList Pn,Qm,Pn_Qm;
	Pn = InitList(Pn);
	Qm = InitList(Qm); 
	Pn_Qm = InitList(Pn_Qm); 
	
	printf("请输入Pn(x):\n");
	ReadNum(Pn);
	printf("请输入Qm(x):\n");
	ReadNum(Qm);
	
	printf("Pn(x):\n");
	PrintList(Pn);//打印Pn 
	printf("Qm(x):\n");
	PrintList(Qm);//打印Pm 
	
	PnQm_Add(Pn,Qm,Pn_Qm);
	printf("Pn(x)+Qm(x):\n");
	PrintList(Pn_Qm);//打印Pn(x)+Qm(x) 
	
	PnQm_Sub(Pn,Qm,Pn_Qm);
	printf("Pn(x)-Qm(x):\n");
	PrintList(Pn_Qm);//打印Pn(x)-Qm(x)  
	
	Pn_Qm = Reserve(Pn_Qm);//逆置 
	printf("Pn(x)-Qm(x)逆置后:\n");
	PrintList(Pn_Qm);//打印Pn(x)-Qm(x)逆置后 
	
	return 0;
 }
 
LNode * InitList(LinkList L) 
{
	L = (LNode *)malloc(sizeof(LNode));
	L->next == NULL;
	return L; 
}

LNode * ReadNum(LinkList L)
{
	int x,z;
	LNode * p = L;
	scanf("%d %d",&x, &z);
	while(x!=999)
	{
		LNode * s = (LNode *)malloc(sizeof(LNode));
		s->xi = x;
		s->zhi = z;
		p->next = s;
		p = s;
		scanf("%d %d",&x, &z);	
	}
	p->next = NULL;
	return L;
	
}

void PrintList(LinkList L)
{
	LNode * p1 = L;
	while(p1->next!=NULL)
	{
		
			printf("%dX^%d\n",p1->next->xi,p1->next->zhi);
		
		p1 = p1->next;
	}
	
}
LNode * PnQm_Add(LinkList Pn,LinkList Qm,LinkList Pn_Qm)
{
	int intpxi,intqxi;//Pn和Qm的系数 
	int intpzhi,intqzhi;//Pn和Qm的指数
	LNode * PQnm = Pn_Qm;
	LNode * p2;//Pn
	LNode * p3;//Qm

	p2 = Pn->next;
	p3 = Qm->next;
	
	while(p2!=NULL&&p3!=NULL)
	{ 
		
		intpzhi = p2->zhi;
		intqzhi = p3->zhi;
		if(p2->zhi < p3->zhi)
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = p2->xi;
			s->xi = a;
			s->zhi = p2->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
			
			p2 = p2->next; 
		}
		else if(p2->zhi==p3->zhi)
		{	
			LNode *s = (LNode *)malloc(sizeof(LNode));
			int	a = p2->xi + p3->xi;
			if(a!=0)
			{
				s->xi = a;
				s->zhi = p2->zhi;
				PQnm->next = s;
				PQnm = s;
				PQnm->next = NULL;	
			}
			
				
			
		
			p2 = p2->next; 
			p3 = p3->next; 
		}
		else if(p2->zhi > p3->zhi)
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = p3->xi;
			s->xi = a;
			s->zhi = p3->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
		
			p3 = p3->next; 
		}
	}

	if(p2==NULL&&p3!=NULL)
	{
		while(p3!=NULL) 
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = p3->xi;
			s->xi = a;
			s->zhi = p3->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
		
			p3 = p3->next; 
		}
			
	}
	else if(p2!=NULL&&p3==NULL)
	{
		while(p2!=NULL)
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = p2->xi;
			s->xi = a;
			s->zhi = p2->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
			
			p2 = p2->next; 
		}
		
	}
	
}
	

LNode * PnQm_Sub(LinkList Pn,LinkList Qm,LinkList Pn_Qm)
{
	int intpxi,intqxi;//Pn和Qm的系数 
	int intpzhi,intqzhi;//Pn和Qm的指数
	LNode * PQnm = Pn_Qm;
	LNode * p2;//Pn
	LNode * p3;//Qm
	p2 = Pn->next;
	p3 = Qm->next;
	
	while(p2!=NULL&&p3!=NULL)
	{ 
		
		intpzhi = p2->zhi;
		intqzhi = p3->zhi;
		if(p2->zhi < p3->zhi)
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = 0 - p2->xi;
			s->xi = a;
			s->zhi = p2->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
			
			p2 = p2->next; 
		}
		else if(p2->zhi==p3->zhi)
		{	
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = p2->xi - p3->xi;
			if(a!=0)
			{
				s->xi = a;
			s->zhi = p3->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
			}
				
				
			
		
			p2 = p2->next; 
			p3 = p3->next; 
		}
		else if(p2->zhi > p3->zhi)
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = 0-p3->xi;
			s->xi = a;
			s->zhi = p3->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
		
			p3 = p3->next; 
		}
	}

	if(p2==NULL&&p3!=NULL)
	{
		while(p3!=NULL) 
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = 0 - p3->xi;
			s->xi = a;
			s->zhi = p3->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
		
			p3 = p3->next; 
		}
			
	}
	else if(p2!=NULL&&p3==NULL)
	{
		while(p2!=NULL)
		{
			LNode * s = (LNode *)malloc(sizeof(LNode));
			int a = p2->xi;
			s->xi = a;
			s->zhi = p2->zhi;
			PQnm->next = s;
			PQnm = s; 
			PQnm->next = NULL; 
			
			p2 = p2->next; 
		}
		
	}
}
LNode * Reserve(LinkList Pn_Qm)
{
	LNode * p,*q,*r;
	p = Pn_Qm;
	q =  p->next;
	
	p->next = NULL;
	r = q->next;
	while(q!=NULL)
	{
		
		q->next = p->next;
		p->next = q;
		q = r;
		if(r!=NULL)
			r = r->next;
		
	}
	return Pn_Qm;
	
}

运行示例:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值