一元稀疏多项式计算器(加减)

题目:设Pn(x)和Qm(x)分别为两个一元稀疏多项式,利用单链表存储Pn(x)和Qm(x),简单实现Pn(x)+Qm(x),Pn(x)-Qm(x),并就地逆置Pn(x)-Qm(x)。

思路:1.首先是创建链表,再存储数据。

          2.进行多项式的运算。通过每一项的比较,判断指数是否相等,相等就进行合并,不相等就不操作并找到下一项。

这道题主要是考察了链表的操作,估计很多人都会被绕晕了,不知道指针指向了哪里。

我已开始也败在了指向问题上,在加法操作中,把pa,pb链表内存的数据元素全都改变了,又不知道哪里出问题了,后来就直接用临时变量将要操作的链表元素复制一份,这样就不会改变原有的数据。

// Poly4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "malloc.h"

typedef struct Polyment{
	int coef;//系数
	int expn;//指数
	Polyment *next;

}Polynode,*PolyList;

void PrintPolyn(PolyList L);

void InitPolyn(PolyList *L)
{
	(*L)=(PolyList)malloc(sizeof(Polynode));//头结点不能动
	(*L)->next=NULL;

}

void CreatPolyn(PolyList L)
{
	int coe,exp;//系数 指数
	PolyList p,q;

	q=L;
	L->next=NULL;
	printf("分别输入系数和指数:\n");
	scanf("%d%d",&coe,&exp);
	while(coe!=0)
	{
		p=(PolyList)malloc(sizeof(Polynode));
		p->coef=coe;
		p->expn=exp;
		p->next=NULL;
		q->next=p;
		q=p;//尾插法
		scanf("%d%d",&coe,&exp);
	}
	
}


void addPolyn(PolyList La,PolyList Lb)//加法
{
	PolyList pa,pb,pc,Lc,temp;
	int sum;

	pa=La->next;
	pb=Lb->next;

	Lc=(PolyList)malloc(sizeof(Polynode));
	pc=Lc;
	pc->next=NULL;
	
	while(pa&&pb)
	{
		if(pa->expnexpn)
		{
			temp=(PolyList)malloc(sizeof(Polynode));
			temp->coef=pb->coef;
			temp->expn=pb->expn;//用一个临时变量存储要传递的元素,保证pa,pbd的内容不变
			temp->next=NULL;
			pc->next=temp;
			pc=temp;
			pb=pb->next;
		}
		else
		{
			if(pa->expn==pb->expn)
			{
				sum=pa->coef+pb->coef;
				if(sum==0)
				{
					pa=pa->next;
					pb=pb->next;
				}
				else
				{
					temp=(PolyList)malloc(sizeof(Polynode));
					temp->coef=sum;
					temp->expn=pa->expn;
					temp->next=NULL;
					pc->next=temp;
					pc=temp;
					
					pa=pa->next;
					pb=pb->next;
				}

			}
			else
			{
				temp=(PolyList)malloc(sizeof(Polynode));
				temp->coef=pa->coef;
				temp->expn=pa->expn;
				temp->next=NULL;
				pc->next=temp;
				pc=temp;
				pa=pa->next;
			}
		}
	}
	pc->next=pa?pa:pb;//将剩下的插入pc中
	printf("\nP(x) + Q(x) = ");
	PrintPolyn(Lc);	
	
}

void inverPolyn(PolyList L1)//逆置操作
{
	PolyList pa,pb,pc,p;
	pa=L1;
	pb=pa->next;
	printf("逆置操作:\n");
	while(pb)
	{
		pc=pb->next;
		pb->next=pa;
		pa=pb;
		pb=pc;
	}
	L1->next=NULL;
	L1=pa;
	p=L1;
	printf("M(X) = ");
	while(p->next)
	{
		if(p->expn!=0)
			printf(" %dx^%d",p->coef,p->expn);
		else
			printf(" %d",p->coef);
		p=p->next;
		if(p)
		{
			if(p->coef>0)
				printf(" + ");
			
		}
			
	}
	printf("\n");

}

void minusPolyn(PolyList La,PolyList Lb)//减法
{
	PolyList pa,pb,pc,Lc,temp;
	int sum;

	pa=La->next;
	pb=Lb->next;
	Lc=(PolyList)malloc(sizeof(Polynode));
	pc=Lc;
	pc->next=NULL;
	while(pa&&pb)
	{
		if(pa->expnexpn)
		{
			temp=(PolyList)malloc(sizeof(Polynode));
			temp->coef=-1*pb->coef;
			temp->expn=pb->expn;
			temp->next=NULL;
			pc->next=temp;
			pc=temp;
			pb=pb->next;
		}
		else
		{
			if(pa->expn==pb->expn)
			{
				sum=pa->coef-pb->coef;
				if(sum==0)
				{
					pa=pa->next;
					pb=pb->next;
				
				}
				else
				{
					temp=(PolyList)malloc(sizeof(Polynode));
					temp->coef=sum;
					temp->expn=pa->expn;
					temp->next=NULL;
					pc->next=temp;
					pc=temp;
					
					pa=pa->next;
					pb=pb->next;
				}

			}
			else
			{
				temp=(PolyList)malloc(sizeof(Polynode));
				temp->coef=pa->coef;
				temp->expn=pa->expn;
				temp->next=NULL;
				pc->next=temp;
				pc=temp;
				pa=pa->next;
			}
			
		}
	}
	if(pa)
			pc->next=pa;
	else
		while(pb)
		{
			temp=(PolyList)malloc(sizeof(Polynode));
			temp->coef=-1*pb->coef;
			temp->expn=pb->expn;
			temp->next=NULL;
			pc->next=temp;
			pc=temp;
			pb=pb->next;
		}
	
	printf("\nP(x) - Q(x) = ");
	PrintPolyn(Lc);
	inverPolyn(Lc);
}

void PrintPolyn(PolyList L)//打印链表
{
	PolyList p;
	p=L->next;
	while(p)
	{
		if(p->expn!=0)
			printf(" %dx^%d",p->coef,p->expn);
		else
			printf("%d",p->coef);
		p=p->next;
		if(p)
		{
			if(p->coef>0)
				printf(" + ");
			
		}
			
	}
	printf("\n");

}


int main(int argc, char* argv[])
{
	PolyList P,Q;
	
	InitPolyn(&P);//初始化
	InitPolyn(&Q);
	printf("P:\n");
	CreatPolyn(P);
	printf("\n");
	printf("Q:\n");
	CreatPolyn(Q);
	printf("\n\n");
	printf("P(x) = ");
	PrintPolyn(P);
	printf("\n");
	printf("Q(x) = ");
	PrintPolyn(Q);

	
	addPolyn(P,Q);
	minusPolyn(P,Q);
		
	return 0;
}

实验测试数据:

一元稀疏多项式计算器(加减)_第1张图片

你可能感兴趣的:(数据结构,链表,一元稀疏多项式)