c語言實現一元多項式的創建和相加

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
struct pNode{
	int coef; //係數
	int exp;//指數
	struct pNode* link;
};
typedef struct{//此處是將結構體重命名爲 polynomial,方便後面用其定義變量 
	int n;
	struct pNode *head;
} polynomial;
void Create(polynomial *p) {//生成表頭結點
	pNode *pn,*pre,*q;
	p->head=(pNode*)malloc(sizeof(pNode));
	p->head->exp=-1;
	p->head->link=NULL;
	p->n=0;
	for(;;)	{
		pn=(pNode*)malloc(sizeof(pNode));
		printf("coef:\n");
		scanf("%d",&pn->coef); //輸入項的係數
		printf("exp:\n");
		scanf("%d",&pn->exp); //輸入項的指數
		if (pn->exp<0) break; //若輸入項指數負數,結果輸入
		pre=p->head;
		q=p->head->link;	
		while(q&&q->exp>pn->exp) {//插入項並保證多項式的各項爲降冪排列
			pre=q;
			q=q->link;
		}
		pn->link=q;
		pre->link=pn;
		p->n++;
	}
}
void Add(polynomial *px,polynomial *qx)  {  //相加操作
	pNode *q,*q1=qx->head,*p,*temp; //q1指向表頭結點	
	p=px->head->link; //p指向多項式px的第一個結點
	q=q1->link; //q1是q的前驅
	while(p&&q)	{
		while(p->exp<q->exp){ //跳過q->exp大的項
			q1=q;
			q=q->link;
		}
		if(p->exp==q->exp){
			q->coef=q->coef+p->coef;
			if(q->coef==0){
				q1->link=q->link ;
				free(q);
				q=q1->link;
				p=p->link;
			}else{
				q1=q;
				q=q->link;
				p=p->link;
			}
		}else{
			temp=(pNode*)malloc(sizeof(pNode)); //生成新的一維數組
			temp->coef=p->coef;
			temp->exp=p->exp;
			temp->link=q1->link;
			q1->link=temp;
			p=p->link;
		}
	}
}
int Output(polynomial list1){
	int i=0;
	pNode *pn;
	if(!list1.head)
		return ERROR;
	pn=list1.head;
	for(i=0; i<list1.n; i++){
		pn=pn->link;
		printf("%d,%d",pn->coef,pn->exp);
	}
	return OK;
}
void output(polynomial *p) {//多項式輸出函數
	pNode *q;
	if(!p->head->link) //判斷多項式是否爲空
		return ;
	q=p->head->link; //單獨輸出第一項
	printf("%d*x^%d",q->coef,q->exp);
	q=q->link;
	while(q){
		if(q->exp==0) //對常數項的輸出
			if(q->coef>0) //常數係數>0的情況
				printf("+%d",q->coef);
			else printf("%d",q->coef); //常數係數<0的情況
		else if(q->coef>0) //非常數項項係數>0情況
			printf("+%d*x^%d",q->coef,q->exp);
		else //非常數項係數<0的情況
			printf("%d*x^%d",q->coef,q->exp);
		q=q->link;
	}
}
int main(){
	polynomial list1;
	polynomial list2;
	Create (&list1);	
	printf("\nthe linklist is:");	
	Output(list1);
	Create (&list2);
	printf("\nthe linklist is:");
	Output(list2);
	Add(&list1,&list2);	
	printf("\nthe result is:\n");
	output(&list2);
}

這種解法是不改變多項式1,同時把結果保存在多項式2。

數據結構嚴蔚敏版的解法是逐一比較兩個多項式,通過連接多項式1和2中的節點,把結果保存在多項式1,同時將用完的節點都刪除掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章