一元多项式求和(c语言实现)
把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int coef; // 系数
int exp; // 指数
struct LNode* next;
} LinkNode;
void Create(LinkNode*& head) // 创建多项式
{
int n, coef, exp;
LinkNode* index, * node;
head = (LinkNode*)malloc(sizeof(LinkNode)); // 创建头节点
index = head; // 辅助指针,使 index 指向最后一个节点,没次新增加一个节点,index就后移
printf("请输入多项式的项数:");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
printf("请输入第%d项的系数和指数", i);
scanf("%d %d", &coef, &exp);
node = (LinkNode*)malloc(sizeof(LinkNode)); // 创建新的节点
node->coef = coef;
node->exp = exp;
index->next = node; // 将新创建的加入到链表中
index = node; // index指向新的节点
}
index->next = NULL;
}
void Display(LinkNode* L) // 输出多项式
{
L = L->next; // 让 指向第一个节点
while (L != NULL) // 如果 p 不为空(链表不为空),则输出
{
printf("%dX^%d", L->coef, L->exp); // 输出系数 和 指数
if (L->next != NULL) // 如果 p 的下一个节点不为空,这就输出一个 + 号(防止多输出一个 + 号)
{
printf("+");
}
L = L->next;
}
printf("\n");
}
LinkNode* ListAdd(LinkNode* p, LinkNode* q) // 多项式相加
{
p = p->next;
q = q->next;
LinkNode* addL, * index, * node = NULL; // 用 addL存储相加后的二项式, index 为辅助指针,node为新节点
addL = (LinkNode*)malloc(sizeof(LinkNode));
index = addL;
while (p != NULL && q != NULL) // 目的是为了让两个多项式为空去比较
{
if (p->exp > q->exp) // 如果 p 的指数大于 q 的指数就把 p 的该项做为新节点,让后让 p 后移一位
{
node = (LinkNode*)malloc(sizeof(LinkNode));
node->coef = p->coef;
node->exp = p->exp;
index->next = node;
index = node;
p = p->next;
}
else if (p->exp == q->exp) // 如果 p 的指数等于 q 的指数,就把 p 和 q 的系数相加作为新节点,让后让 p 和 q 后移一位
{
node = (LinkNode*)malloc(sizeof(LinkNode));
node->coef = p->coef + q->coef;
node->exp = p->exp;
if (node->coef == 0)
{
free(node);
}
else
{
index->next = node;
index = node;
}
p = p->next;
q = q->next;
}
else // 如果 q 的指数大于 p 的指数就把 q 的该项做为新节点,让后让 q 后移一位
{
node = (LinkNode*)malloc(sizeof(LinkNode));
node->coef = q->coef;
node->exp = q->exp;
index->next = node;
index = node;
q = q->next;
}
}
if (p != NULL) // 如果 p 不为空,说明 q 为空了,就可以直接将 p 后面的节点给 node
{
node->next = p->next;
}
else if (q != NULL) // 如果 q 不为空,说明 p 为空了,就可以直接将 q 后面的节点给 node
{
node->next = q->next;
}
else // 如果执行这个则所民 p 和 q 都为空了,就让node指向的最后的节点指向空
{
node->next = NULL;
}
return addL;
}
int main(int argc, char const* argv[])
{
LinkNode* P, * Q;
printf("请输入第一个多项式");
Create(P);
Display(P);
printf("请输入第二个多项式");
Create(Q);
Display(Q);
LinkNode* List = ListAdd(P, Q);
printf("相加后的多项式为:");
Display(List);
return 0;
}
|
请发表评论