数据结构从零单排3——链表(2)

这次贴上一元多项式的问题

主要实现了一元多项式相加、相减以及相乘,直接上代码:
/*一元多项式相加和相乘*/
#include <stdio.h>
#include <stdlib.h>

typedef struct _Poly_ {
	float coef; //系数
	int expn; //指数
	struct _Poly_ *next;
}PloyNode, *PolyList;

void createPolyn(PolyList &P, int m); //创建一元多项式有序链表
void destroyPolyn(PolyList &P); //销毁一元多项式
void printPolyn(PolyList P); //打印一元多项式
int polynLength(PolyList P);
void addPolyn(PolyList &Pa, PolyList &Pb); //两个多项式相加,销毁Pb
void substractPolyn(PolyList &Pa, PolyList &Pb); //两个多项式相减,销毁Pb
void multiplyPolyn(PolyList &Pa, PolyList &Pb);//两个多项式相乘,销毁Pb
int compare(PolyList Pa, PolyList Pb); //比较两个指数值 a > b return 1,a=b return 0,a < b return -1
PolyList makeNode(float coef, int expn); //创建一个节点
int isNodeExit(PolyList PH, PolyList p); //节点在链表中是否已经存在(比较指数)
void insertFirst(PolyList &P, PolyList &pt); //插入,根据指数大小决定插入位置
void initPolyList(PolyList &P); //初始化链表
PolyList singleMultiply(PolyList &single, PolyList P); //多项式和单项式相乘


int main(void) {
	PolyList Pa, Pb;
	initPolyList(Pb);
	initPolyList(Pa);
	createPolyn(Pa, 2);
	createPolyn(Pb, 1);
	//destroyPolyn(P);
	printPolyn(Pa);
	printPolyn(Pb);
	multiplyPolyn(Pa, Pb);
	printPolyn(Pa);
	system("pause");
	return 0;
}

int polynLength(PolyList P) {
	int length = 0;
	PolyList temp = P->next;
	while(temp) {
		length++;
		temp = temp->next;
	}
	return length;
}

PolyList singleMultiply(PolyList &single, PolyList P) {
	PolyList temp = P->next;
	while(temp != NULL) {
		temp->coef *= single->coef;
		temp->expn += single->expn;
		temp = temp->next;
	}
	return P;
}

void multiplyPolyn(PolyList &Pa, PolyList &Pb) { //多项式相乘转化为多个单项式和一个多项式之积的和
	PolyList tb = Pb->next;
	PolyList tp;
	initPolyList(tp);
	while(tb) {
		PolyList m = singleMultiply(tb, Pa);
		addPolyn(tp, m);
		tb = tb->next;
	}
	Pa = tp;
	destroyPolyn(Pb);
}

	

void substractPolyn(PolyList &Pa, PolyList &Pb) {
	PolyList prevTa = Pa;
	PolyList prevTb = Pb;
	PolyList ta = Pa->next;
	PolyList tb = Pb->next;
	while(ta && tb) {
		int temp = compare(ta, tb);
		if (temp == 0) {
			ta->coef -= tb->coef;
			ta = ta->next;
			tb = tb->next;
			prevTa = prevTa->next;
			prevTb = prevTb->next;
		} else if (temp < 0) {
			ta = ta->next;
			prevTa = prevTa->next;
		} else {
			PolyList q = makeNode(-(tb->coef), tb->expn);
			insertFirst(Pa, q);
			prevTa = Pa;
			ta = Pa->next;
			tb = tb->next;
			prevTb = prevTb->next;
		}
	}
	while(tb) {
		PolyList q = makeNode(-(tb->coef), tb->expn);
		insertFirst(Pa, q);
		tb = tb->next;
	}
	destroyPolyn(Pb);
}

void addPolyn(PolyList &Pa, PolyList &Pb) {
	PolyList prevTa = Pa;
	PolyList prevTb = Pb;
	PolyList ta = Pa->next;
	PolyList tb = Pb->next;
	while(ta && tb) {
		int temp = compare(ta, tb);
		if (temp == 0) {
			ta->coef += tb->coef;
			ta = ta->next;
			tb = tb->next;
			prevTa = prevTa->next;
			prevTb = prevTb->next;
		} else if (temp < 0) { //若ta < tb将tb和下一个ta比较
			ta = ta->next;
			prevTa = prevTa->next;
		} else { //ta>tb则插在ta前面
			PolyList q = makeNode(tb->coef, tb->expn);
			insertFirst(Pa, q);
			prevTa = Pa;
			ta = Pa->next;
			tb = tb->next;
			prevTb = prevTb->next;
		}
	}
	if (tb) {
		prevTa->next = tb;
		prevTb->next = NULL;
	}
	destroyPolyn(Pb);
}

void printPolyn(PolyList P) {
	if (!P) {
		printf("0\n");
		return;
	}
	PolyList tp = P->next;
	printf("%.1fx^%d", tp->coef, tp->expn);
	tp = tp->next;
	while(tp) {
		if (tp->coef > 0) {
			printf("+%.1fx^%d", tp->coef, tp->expn);
		} else if (tp->coef < 0) {
			printf("%.1fx^%d", tp->coef, tp->expn);
		}
		
		tp = tp->next;
	}
	printf("\n");
}

void destroyPolyn(PolyList &P) {
	while(P->next) {
		PolyList tp = P;
		PolyList tq = P->next;
		while(tq->next) {
			tp = tp->next;
			tq = tq->next;
		}
		free(tq);
		tp->next = NULL;
	}
	free(P);
	P = NULL;
}

int compare(PolyList Pa, PolyList Pb) {
	return Pa->expn - Pb->expn;
}

void initPolyList(PolyList &P) {
	P = (PolyList)malloc(sizeof(PloyNode));
	if (P) {
		P->coef = 0;
		P->expn = -1;
		P->next = NULL;
	}
}

PolyList makeNode(float coef, int expn) {
	PolyList p = (PolyList)malloc(sizeof(PloyNode));
	if (p) {
		p->coef = coef;
		p->expn = expn;
	}
	return p;
}

void insertFirst(PolyList &P, PolyList &pt) {
	if (P->next == NULL) {
		pt->next = P->next;
		P->next = pt;
	} else {
		PolyList q = P->next;
		PolyList s = P;
		while(q && compare(pt, q) > 0) {
			q = q->next;
			s = s->next;
		}
		pt->next = s->next;
		s->next = pt;	
	}
}

int isNodeExit(PolyList PH, PolyList p) {
	PolyList pt = PH->next;
	while(pt) {
		if (compare(pt, p) == 0){
			return 1;
		} else {
			pt = pt->next;
		}
	}
	return 0;
}

void createPolyn(PolyList &P, int m) {
	PolyList pNode = P;
	for(int i = 0;i < m;i++) {
		float coef;
		int expn;
		scanf("%f %d",&coef, &expn);
		printf("输入%f, %d\n", coef, expn);
		PolyList pt = makeNode(coef, expn);
		if (!isNodeExit(P, pt) && pt){
			insertFirst(P, pt);
		}	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值