天天看點

C語言實作——一進制多項式運算器

/*
程式簡介:
功能:對多項式求值,求導,兩多項式相加,相減,相乘等運算
作者:xuqg
時間:2019.9.19 
*/

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

typedef struct NodeType{
	int id;//系數 
	int index;//指數 
	struct NodeType *next;
}Nodetype;

NodeType *CreatList();//建立一個人連結清單,用來存放一個多項式,傳回一個頭指針 
void PrintList(NodeType *pHead);//輸出函數,輸出多項式的表達式 
int Evaluation(NodeType *la,int x);//輸入x,求表達式的值 
NodeType *TwoListAdd(NodeType *la,NodeType *lb);//兩個多項式求和 
NodeType *MultipTwoList(NodeType *la,NodeType *lb);//兩個多項式求相減 
NodeType *TwoListSubtract(NodeType *la,NodeType *lb);//兩個多項式相乘 
NodeType *ListQiuDao(NodeType *la);//多項式求導 

//主要是資料的測試
int main(){
	
	NodeType *la;
	printf("\n---------------------請輸入第一個多項式---------------------\n");
	la = CreatList();
	printf("第一個多項式的資訊為:");
	PrintList(la);
	
	NodeType *lb;
	printf("\n---------------------請輸入第二個多項式---------------------\n");
	lb = CreatList();
	printf("第二個多項式的資訊為:");
	PrintList(lb);
	
	int x;
	int a,b;
	printf("請輸入x的值:");
	scanf("%d",&x);
	
	/*
	a=Evaluation(la,x);
	printf("suma=%d\n",a);
	b=Evaluation(lb,x);
	printf("sumb=%d\n",b);
	printf("suma*sumb=%d\n",a*b);*/
	
	NodeType *lf;
	lf=MultipTwoList(la,lb);
	printf("---------------------第一個與第二個多項式的乘法為---------------------\n");
	PrintList(lf);/*
	printf("第一個多項式的資訊為:\n");
	PrintList(la);
	printf("第二個多項式的資訊為:\n");
	PrintList(lb);
	a=Evaluation(lf,x);
	printf("sumMU=%d\n",a);*/
	
	NodeType *lc;
	lc=TwoListAdd(la,lb);
	printf("---------------------第一個與第二個多項式的和為---------------------\n");
	PrintList(lc);
	/*printf("第一個多項式的資訊為:\n");
	PrintList(la);
	printf("第二個多項式的資訊為:\n");
	PrintList(lb);*/
	

	NodeType *ld;
	ld=TwoListSubtract(la,lb);
	printf("第一個與第二個多項式的差為:\n");
	PrintList(ld);
	/*printf("第一個多項式的資訊為:\n");
	PrintList(la);
	printf("第二個多項式的資訊為:\n");
	PrintList(lb);*/
	
	NodeType *le=ListQiuDao(la);
	printf("第一個求導的後的值為:\n");
	PrintList(le);
	/*printf("第一個多項式的資訊為:\n");
	PrintList(la);
	*/ 
	
	return 0;
}

//建立一個人連結清單,用來存放一個多項式,傳回一個頭指針
//建立一個帶有頭結點的單連結清單,本代碼中的連結清單都是帶有頭結點的  
NodeType *CreatList(){
	
	NodeType *pNew,*pEnd;
	NodeType *pHead = (NodeType *)malloc(sizeof(NodeType));
	pHead->next = NULL;
	pEnd = pHead;
	
	printf("————注意要将指數按從小到大依次輸入————");
	printf("請依次交叉輸入表達式id(系數)和index(指數)(id=0時退出):");
	while(1){
		
		int id,index;
		pNew = (NodeType *)malloc(sizeof(NodeType));
		scanf("%d",&id);
		if(id == 0)  break;
		scanf("%d",&index);
		pNew->id=id;
		pNew->index=index;
		
		pEnd->next = pNew;	
		pNew->next = NULL;
		pEnd = pNew;		
	}
	return pHead;			
}

//輸出函數,輸出多項式的值 
void PrintList(NodeType *pHead){
	
	NodeType *pTemp = pHead->next;

	while(pTemp!=NULL){
		
		//當一個一進制多項式的系數(-1\1或其他)和指數(0或其他)不同時,輸出的格式不同 
		if(pTemp->id==1&&pTemp->index!=0)        printf("x^%d",pTemp->index);
		else if(fabs(pTemp->id)==1&&pTemp->index==0)	 printf("%d",pTemp->id);
		else if(fabs(pTemp->id)==1&&pTemp->index!=0)   printf("x^%d",pTemp->index);
		else 	printf("%dx^%d",pTemp->id,pTemp->index);
		
		pTemp = pTemp->next;
		
		//輸出适當的+号和- 
		if(pTemp!=NULL&&pTemp->id>0) 		printf("+");
	}	
}

//兩個多項式求和 
NodeType *TwoListAdd(NodeType *la,NodeType *lb){
 	
 	NodeType *pa;
 	NodeType *pb;
 	NodeType *pc,*qc;
 	
 	pa=la->next;
 	pb=lb->next;
 	NodeType *lc=(NodeType *)malloc(sizeof(NodeType));//建立一個帶頭結點的單連結清單用來存放來年各個多項式和的值 
 	lc->next=NULL; 
 	
 	pc=lc;
 	
 	//pa,pb不為NULL時,比較指數大小進行…… 
 	while(pa!=NULL&&pb!=NULL){//while{}
 		
 		qc=(NodeType *)malloc(sizeof(NodeType));
 		if(pa->index<pb->index){
 			qc->id=pa->id;
 			qc->index=pa->index;
 			
 			pa=pa->next;
 			pc->next=qc;
 			qc->next=NULL;
 			pc=qc;
		 }
		 
		else if(pa->index>pb->index){
		 	qc->id=pb->id;
 			qc->index=pb->index;
 			
 			pb=pb->next;
 			pc->next=qc;
 			qc->next=NULL;
 			pc=qc;
		 }
		
		else{
		 	
		 	qc->index=pa->index;
		 	qc->id=pa->id+pb->id;
		 	
		 	if(qc->id==0){
		 		free(qc);	
			 }
			 
		 	else{	
		 	pc->next=qc;
 			qc->next=NULL;
 			pc=qc;	
			 }
			 
			pa=pa->next;
			pb=pb->next; 	
		 }
 		}//while{}
 		
 		
 		while(pa!=NULL){
 			qc=(NodeType *)malloc(sizeof(NodeType));
 			qc->id=pa->id;
 			qc->index=pa->index;
 			
 			pa=pa->next;
 			pc->next=qc;
 			qc->next=NULL;
 			pc=qc;
 			
		 }
 		
 		
 		while(pb!=NULL){
 			qc=(NodeType *)malloc(sizeof(NodeType));
 			qc->id=pb->id;
 			qc->index=pb->index;
 			
 			pb=pb->next;
 			pc->next=qc;
 			qc->next=NULL;
 			pc=qc;
		 }
 		

 	return lc;
 	
 }

//兩個多項式求相減 
NodeType *TwoListSubtract(NodeType *la,NodeType *lb){

 	NodeType *pb;
 	NodeType *ld;
 	pb=lb->next;
	 
	//将減數多項式lb系數變成相反數-lb,在求和就是兩個多項式相減 
	while(pb!=NULL){
		pb->id=-pb->id;
		pb=pb->next;
	} 
	
	ld=TwoListAdd(la,lb);
	
	//将pb指向頭指針,将lb的符号變回來 
	pb=lb->next;
	while(pb!=NULL){
		pb->id=-pb->id;
		pb=pb->next;
	} 
	
	return ld;
	} 

//多項式求導 
NodeType *ListQiuDao(NodeType *la){
	
	NodeType *le=(NodeType *)malloc(sizeof(NodeType));
	NodeType *pe,*qe;
	NodeType *pa=la->next;
	
	le->next=NULL;
	pe=le;
	
	while(pa!=NULL){	
		
		//常數項的導數為零 
		if(pa->index!=0){	
			qe=(NodeType *)malloc(sizeof(NodeType));
			qe->id=pa->id*pa->index;
			qe->index=pa->index-1;
			
 			pe->next=qe;
 			qe->next=NULL;
 			pe=qe;
		}
		pa=pa->next;
	}
	
	return le;	
}

//兩個多項式相乘 
NodeType *MultipTwoList(NodeType *la,NodeType *lb){
	
	NodeType *lf=(NodeType *)malloc(sizeof(NodeType));
	lf->next=NULL;
	NodeType *pa=la->next;
	NodeType *pb;
	
	//用一個多項式的一項分别乘以另一個多項式每一項,然後相加 
	while(pa!=NULL){
		pb=lb->next;
		NodeType *lalb=(NodeType *)malloc(sizeof(NodeType));
		NodeType *pab,*qab;
		lalb->next=NULL;
		pab=lalb;
		
		while(pb!=NULL){
			qab=(NodeType *)malloc(sizeof(NodeType));
			qab->id=pa->id*pb->id;
			qab->index=pa->index+pb->index;
			
			pab->next=qab;
			pab->next->next=NULL;
			pab=qab;
			pb=pb->next;
		}
			
		lf=TwoListAdd(lf,lalb);
		pa=pa->next;
	}
	return lf;
}

//輸入x,求表達式的值 
int Evaluation(NodeType *la,int x){
	NodeType *pa=la->next;
	int sumla=0;
	int sum;
	
	while(pa!=NULL){
		sum=1;
		for(int i=0;i<pa->index;i++){
			sum=sum*x;
		}
		sumla=sumla+pa->id*sum;	
		pa=pa->next; 	
	}
	return sumla;
}

https://mp.csdn.net/postedit/101036340
           

繼續閱讀