用鏈表實現多項式的加法與乘法

用鏈表實現多項式的加法與乘法

準備工作,定義鏈表與結點

#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大家支持,有問題就指正!!!

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