设计一个一元稀疏多项式简单的加减法计算器

问题描述:

设计一个一元稀疏多项式简单的加减法计算器

实现要求:

一元稀疏多项式简单计算器的基本功能是:

1)输入并建立多项式:

2)输出多项式

3)多项式AB相加,建立多项式CAB,并输出相加的结果多项式C

4)选作:多项式AB相减,建立多项式CAB,并输出相加的结果多项式D

方法说明:

1)多项式的输入与存储

用带表头结点的单链表存储多项式,链表中的每个节点分别存储多项式各项的系数和指数,即每从键盘输入多项式的一对数(系数,指数),可对应建立链表的一个结点。每个节点的结构为:

设计一个一元稀疏多项式简单的加减法计算器_第1张图片

3)主要算法

①创建两个链表,分别存放多项式1和多项式2,这两个链表中的节点是按指数降序或者升序排列的

②多项式相加或相减,下面给出多项式相加的部分实现

/*

下面的函数实现两个多项式的相加,要相加的链表分别由papb指向(其中,papb都是分配了空间的头结点)。

相加的结果直接由pa指向的链表保存,即是在pa链表中添加或删除(当系数因为相加为0的情况下)一些结点,构成结果。

这里要相加的链表中指数都是按从小到大的顺序排列好了的,是升序链表。

*/



代码实现:




#include "stdafx.h"


struct tagNode {
int coef;
int exp;
struct tagNode *next;
};
typedef struct tagNode node;
typedef struct tagNode* Pnode;


Pnode createNode() {   //创建链表函数
int coef;
int exp;
Pnode head, tail, p;
p = (Pnode)malloc(sizeof(node));
head = (Pnode)malloc(sizeof(node));
head->coef = NULL;
head->exp = NULL;
head->next = p;
while (1) {
scanf_s("%d", &coef);
scanf_s("%d", &exp);
if (coef && exp != 0) {
p->coef = coef;
p->exp = exp;
tail = (Pnode)malloc(sizeof(node));
tail->next = NULL;
p->next = tail;
p = tail;
}
else {
break;
}
}
return head;
}
Pnode addNode(Pnode pa, Pnode pb) {
Pnode p, q, pr;
p = pa->next;
pr = pa;
q = pb->next;
while (p->next != NULL && q->next != NULL) {
if (p->exp > q->exp) {  //pb链的指数小于pa链,则将pb插入到pa中
Pnode x;
x = (Pnode)malloc(sizeof(node));
x->coef = q->coef;
x->exp = q->exp;
pr->next = x;
x->next = p;


q = q->next;
p = pr->next;
}
if (p->exp < q->exp) {   //pb链当前节点的指数大于pa链的话,则pa向后移一个节点
p = p->next;
pr = pr->next;
}
if (p->exp == q->exp) {  //pb链当前节点的指数等于pa链的话,则系数相加保存在pa
float x = p->coef + q->coef;
if (x == 0) {   //pa、pb链指数相加后等于0
pr->next = p->next;
p = p->next;
q = q->next;

}else {
p->coef = x;
p = p->next;
pr = pr->next;
q = q->next;
}
}


}
if (q) {  //如果pb链还有大于pa链的,则加到pa链后面
pr->next = q;
}
return pa;
}


int main()
{
Pnode pa, pb, x;
int j=1;
printf("请输入第一个多项式,输入格式:系数 指数 例:2 2 输入0 0结束\n");
pa = createNode();
printf("请输入第二个多项式,输入格式:系数 指数 例:2 2 输入0 0结束\n");
pb = createNode();  //创建链表pa pb
pa = addNode(pa, pb);
x = pa->next;
while (x->next != NULL) {
j++;
x = x->next;
}
for (int i = 0; i < j-1; i++) {
printf("%dX^%d",pa->next->coef,pa->next->exp);
printf("+");
pa = pa->next;
}
    return 0;
}


运行截图设计一个一元稀疏多项式简单的加减法计算器_第2张图片


总结:

判断链表下一个节点是否为空时,不能直接通过节点p或者q判断,应该用p或者q的成员判断,如p->coef

你可能感兴趣的:(c)