用鏈表實現多項式的加法與乘法
準備工作,定義鏈表與結點
#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大家支持,有問題就指正!!!