用链表实现多项式的加法与乘法
准备工作,定义链表与结点
#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大家支持,有问题就指正!!!