1. 程式人生 > >一元稀疏多項式計算器(加減)

一元稀疏多項式計算器(加減)

題目:設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->expn<pb->expn)
		{
			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->expn<pb->expn)
		{
			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;
}

實驗測試資料:

測試資料