用链表实现多项式的加法与乘法

用链表实现多项式的加法与乘法

准备工作,定义链表与结点

#include<stdio.h>
#include<stdlib.h>
typedef struct pNode {                          //定义多项式结点
	int coef;                                   //定义系数
	int exp;                                    //定义次数
	struct pNode* link;    
}PNode;
typedef struct polynominal {                    //定义多项式带表头的循环的单链表
	PNode* head;
}Polynominal;

多项式的创建

void Create(Polynominal* p) {                   //创建一个存储多项式的循环单链表 
	printf("\n生成一个多项式:\n");
	PNode* pn, * pre, * q;
	p->head = (PNode*)malloc(sizeof(PNode));
	p->head->exp = -1;
	p->head->link = p->head;                    //实现循环
	for (;;) {
		pn = (PNode*)malloc(sizeof(PNode));
		printf("系数coef:");
		scanf_s("%d", &pn->coef);
		printf("次数exp:");
		scanf_s("%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;
		}
		pre->link = pn;
		pn->link = q;
	}
}                              

多项式的加法

void Add(Polynominal* px, Polynominal* qx) {   //实现多项式加法
	PNode* q, * q1 = qx->head, * p, * p1, * temp;
	p = px->head->link;
	q = q1->link;
	while (p->exp >= 0) {
		while (p->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{                                           //p->exp>q->exp
			temp = (PNode*)malloc(sizeof(PNode));
			temp->coef = p->coef;
			temp->exp = p->exp;
			temp->link = q1->link;
			q1->link = temp;
			q1 = q1->link;
			p = p->link;	
		}
	}
}

多项式的乘法

void multiply(Polynominal* px, Polynominal* qx) {
	Polynominal qx1, qx2;
	PNode* q1, * q2, * q3, * q4, * temp;
	temp = (PNode*)malloc(sizeof(PNode));
	qx1.head = (PNode*)malloc(sizeof(PNode));         //生成新的多项式 
	qx1.head->exp = -1;
	qx1.head->link = qx1.head;                        //qx1为循环单链表
	q1 = px->head->link;                              //q1指向px的第一项
	q2 = qx->head->link;                              //q2指向qx的第二项 
	while (q2->exp != -1) {
		q3 = (PNode*)malloc(sizeof(PNode));
		q3->coef = q1->coef * q2->coef;
		q3->exp = q1->exp + q2->exp;
		if (qx1.head->link->exp == -1) {
			q3->link = qx1.head->link;
			qx1.head->link = q3;
			temp = qx1.head->link;
		}
		else {
			q3->link = qx1.head;
			temp->link = q3;
			temp = temp->link;
		}
		q2 = q2->link;
	}
	q1 = q1->link;
	while (q1->exp != -1) {
		q2 = q2->link;
		qx2.head = (PNode*)malloc(sizeof(PNode));
		qx2.head->exp = -1;
		qx2.head->link = qx2.head;
		while (q2->exp != -1) {
			q4 = (PNode*)malloc(sizeof(PNode));
			q4->coef = q1->coef * q2->coef;
			q4->exp = q1->coef + q2->exp;
			if (qx2.head->link->exp == -1) {
				q4->link = qx2.head->link;
				qx2.head->link = q4;
				temp = qx2.head->link;
			}
			else{
				q4->link = qx2.head;
				temp->link = q4;
				temp = temp->link;
			}
			q2 = q2->link;
		}
		Add(&qx2, &qx1);
		q1 = q1->link;
	}
	Output(&qx1);
	return;
}

多项式的输出

void Output(Polynominal *p) {
	pNode* pp = p->head->link;
	int flag = 1;                    //判断是否为第一项
	if (!pp) {
		return;
	}
	while (pp!= p->head) { 
		if (flag != 1 && pp->coef > 0) printf("+");     //不是第一项的正系数前“+”
		flag = 0;                                       //flag为0,表示不是第一项
		if (pp->coef == 0) {                            //系数为0,打印结束
			return;
		}
		printf("%d", pp->coef);                         //打印系数
		switch (pp->exp) {
		case 0:break;
		case 1:printf("x"); break;
		default:printf("x^%d", pp->exp); break;
		}
		pp = pp->link;                                  //指针指向下一结点
	}
	printf("\n");
	return;
}

主函数测试函数

int main() {
	Polynominal px, qx;                               //定义两个链表px,qx
	Create(&px);                                      //创建链表px
	printf("px=");
	Output(&px); 
	Create(&qx);                                      //创建链表qx
	printf("qx=");
	Output(&qx);
	printf("请选择要执行的功能:\n");
	printf("功能1:两多项式相加\n");
	printf("功能2:两多项式相乘\n");
	int a;
	scanf_s("%d", &a);
	switch (a) {
	case 1:printf("相加后多项式为:\n");
		Add(&px, &qx);
		Output(&qx);
		break;
	case 2:printf("相乘后多项式为:\n");
		multiply(&px, &qx);
		break;
	default:printf("请输入1或者2:\n");
	}
	return 0;
}

ball ball大家支持,有问题就指正!!!

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