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

a010655發表於2015-05-14

實驗一:一元稀疏多項式計算器

[問題描述]

設計一個一元稀疏多項式簡單計算器。

[基本要求]

一元稀疏多項式簡單計算器的基本功能是:

(1)輸出並建立多項式;

(2)輸出多項式,輸出形式為整數序列:n,c1,e1,c2,e2,...,cn,en,其中n是多項式的項數,ciei分別是第i項的係數和指數,序列按指數降序排列;

(3)多項式ab相加,建立多項式a+b;

(4)多項式ab相減,建立多項式a-b;

[測試資料]

(1)(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);

(2)(6x^(-3)-x+4.4x^2-1.2x^9)-(-6x^(-3)+5.4x^2-x^2+7.8x^15)=(-7.8x^15-1.2x^9+12x^(-3)-x);

(3)(x+x^3)+(-x-x^3)=0;

(4)(x+x^2+x^3)+0=x+x^2+x^3;

(由於篇幅原因,只選取了具有代表性的4組測試資料)

[實現提示]

用帶表頭節點的單連結串列儲存多項式。

 

 

一:程式設計流程:

1.建立兩個帶頭節點的單連結串列AB

2.將AB兩個連結串列連線成一個新連結串列 C

3.用冒泡法對C中連結串列進行排序。

4.把C連結串列中指數項相同節點合併。

二:程式原始碼:


#include "stdlib.h"
#include "string.h"
typedef struct PolyNode
{	
	float coef;            //係數
	int exp;			   //指數
	struct PolyNode *next;
} PolyNode;
typedef PolyNode *Polynomial;

Polynomial CreateList(){
	float co;
	int   ex;
	Polynomial head,p,l;
	head = (Polynomial)malloc(sizeof(PolyNode));    
	p = head;
	scanf("%f%d",&p->coef,&p->exp);			//設定頭結點,並且設定第一個節點,為了保證表不為空
	if(head->coef==0&&head->exp==0){        //如果頭結點資料元素均為0,則為單節點連結串列
	head->next=NULL;
	}else{
	p->next=(Polynomial)malloc(sizeof(PolyNode));
	p=p->next;
	while(1){
	scanf("%f%d",&co,&ex);
	if(co==0&&ex==0) break;			// x=0並且y=0 代表結束輸出
		p->coef=co;
		p->exp =ex;
		l=p;
		p->next =(Polynomial)malloc(sizeof(PolyNode));
		p=p->next;
	} 
	l->next = NULL;
	}
	return head;
}
void Sortlist(Polynomial L){ // 用冒泡法對連結串列L中的節點按指數降序排列。
	Polynomial a,b;
	float temp_co;        //設定中間變數來交換連結串列元素的值;
	int temp_ex;
	b =L;
	a =L;
	for(a;a!=NULL;a=a->next){
		b= L ;
		for(b;b->next!=NULL;b=b->next){
			if(b->exp<b->next->exp){
			temp_co=b->coef;
			temp_ex=b->exp;
			b->coef=b->next->coef;
			b->exp =b->next->exp;
			b->next->coef =temp_co;
			b->next->exp  =temp_ex;
			}
		}
	}	
	return;
}
void Display(Polynomial p){
	Polynomial Pointer;
	Pointer =p;
	do{
	printf("%.2fx^%d  ",Pointer->coef,Pointer->exp);
	Pointer=Pointer->next;
	}while(Pointer!=NULL);
}
Polynomial LinkList(Polynomial A,Polynomial B,int n)  //連結連結串列A B,在這裡設定B的頭指標為連線後的頭指標 n=1表示加法,n=2表示減法;
	{
	Polynomial tail_b,C,op_pointer;  // op_pointer 用來取反連結串列B cof 的數值。
	tail_b =B;
	op_pointer =B;
	for(op_pointer;op_pointer!=NULL;op_pointer=op_pointer->next){
		if(n==2){
		op_pointer->coef = -op_pointer->coef;
		//printf("%.2f  %d\n",op_pointer->coef,op_pointer->exp);
		}
	};

	for(tail_b;tail_b->next!=NULL;tail_b=tail_b->next);  // 連線 B A 連結串列,以B連結串列頭為合併後的表頭
	tail_b->next=A;

	C=B;
	Sortlist(C);
	return C;
	}
void MergeList(Polynomial C){      // 合併C中exp數值相同的節點.
	Polynomial C1,C2;
	C1=C;
	C2=C1->next;
	while(C2!=NULL){
		if(C1->exp == C1->next->exp){
		C1->coef=C1->next->coef+C1->coef;
		C1->next=C1->next->next;
		free(C2);
		C2=C1->next;
		}else{
		C1=C1->next;
		C2=C2->next;
		}
	}
}

void main(){
	Polynomial A,B,Com;
	int s;
	printf("\n請輸入連結串列A的資料:格式為 coeffient exp 以空格分開\n");
	A = CreateList();
	Display(A);
	printf("\n請輸入連結串列B的資料:格式為 coeffient exp 以空格分開\n");
	B = CreateList();
	Display(B);
	printf("請選擇加法還是減法\n");
	printf("輸入1代表加法\n");
	printf("輸入2代表減法\n");
	scanf("%d",&s);
	if(s==1||s==2){
		Com = LinkList(A,B,s);	
		MergeList(Com);
		Display(Com);
	}else{
		printf("輸入了非法字元\n");
	}

}

三、測試資料

1.(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);

 

2.(6x^(-3)-x+4.4x^2-1.2x^9)-(-6x^(-3)+5.4x^2-x^2+7.8x^15)=(-7.8x^15-1.2x^9+12x^(-3)-x);

 

3.(x+x^3)+(-x-x^3)=0;

 

4.(x+x^2+x^3)+0=x+x^2+x^3;

 



 


相關文章