多项式加法用 C 语言实现
目录
用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括系数(coef
)和指数(exp
)两个数据域以及一个指针域(next
)。对应的数据结构定义为:
-
typedef struct Node
-
{
-
int coef; // 系数
-
int exp; // 指数
-
struct Node* next;
-
}Node, *Link;
一个多项式可以表示成由这些节点链接起来的单链表。
一、多项式的初始化
单向非循环链表可以分为以下两种:
-
不设头结点的单向非循环链表
-
设头结点的单向非循环链表
本次程序采用第二种。
-
void InitPoyln(Link* phead)
-
{
-
assert(phead); // phead 是指向头指针的指针,是一个二级指针
-
*phead = (Node*)malloc(sizeof(Node)); // 生成新节点作为头节点
-
if (NULL == *phead)
-
{
-
perror("initialization failed!");
-
exit(-1);
-
}
-
(*phead)->next = NULL; // 将头节点的指针域置为空
-
}
二、多项式的创建
多项式链表是一个有序表 ,每项的位置都要经过比较才能确定。
-
void CreatePoyln(Link head, int n)
-
{
-
assert(head); // 头指针指向头节点
-
for (int i = 0; i < n; i)
-
{
-
// 生成新节点
-
Node* newnode = (Node*)malloc(sizeof(Node));
-
assert(newnode);
-
scanf("%d %d", &newnode->coef, &newnode->exp);
-
if (newnode->coef == 0) // 只保存系数不为 0 的项
-
{
-
free(newnode);
-
continue;
-
}
-
newnode->next = NULL;
-
// 插入
-
Node* prev = head;
-
Node* cur = head->next;
-
while (cur != NULL)
-
{
-
if (cur->exp == newnode->exp)
-
{
-
// 合并 cur 和 newnode
-
int sum = cur->coef newnode->coef;
-
if (sum != 0)
-
{
-
cur->coef = sum;
-
free(newnode);
-
}
-
else
-
{
-
prev = cur->next;
-
Node* tmp = cur;
-
cur = cur->next;
-
free(tmp);
-
free(newnode);
-
}
-
break;
-
}
-
else if (cur->exp > newnode->exp)
-
{
-
prev = cur;
-
cur = cur->next;
-
}
-
else // cur->exp < newnode->exp
-
{
-
// 将 newnode 插入到 prev 和 cur 之间
-
prev->next = newnode;
-
newnode->next = cur;
-
break;
-
}
-
}
-
if (cur == NULL)
-
{
-
prev->next = newnode;
-
}
-
}
-
}
三、多项式的加法
-
void AddPolyn(Link headA, Link headB)
-
{
-
assert(headA != NULL && headB != NULL);
-
Node* tail = headA;
-
Node* curA = headA->next;
-
Node* curB = headB->next;
-
while (curA && curB)
-
{
-
if (curA->exp == curB->exp)
-
{
-
int sum = curA->coef curB->coef;
-
if (sum != 0)
-
{
-
curA->coef = sum;
-
tail->next = curA;
-
tail = curA;
-
curA = curA->next;
-
-
Node* tmp = curB;
-
curB = curB->next;
-
free(tmp);
-
}
-
else
-
{
-
Node* tmp = curA;
-
curA = curA->next;
-
free(tmp);
-
tmp = curB;
-
curB = curB->next;
-
free(tmp);
-
}
-
}
-
else if (curA->exp > curB->exp)
-
{
-
tail->next = curA;
-
tail = curA;
-
curA = curA->next;
-
}
-
else // curA->exp < curB->exp
-
{
-
tail->next = curB;
-
tail = curB;
-
curB = curB->next;
-
}
-
}
-
tail->next = curA ? curA : curB;
-
free(headB); // 释放 headB 指向的头节点
-
}
四、多项式的输出
-
void PrintPolyn(Link head)
-
{
-
assert(head);
-
Node* cur = head->next;
-
int first = 1;
-
while (cur != NULL)
-
{
-
// 输出正负号
-
if (first)
-
{
-
if (cur->coef < 0)
-
printf("%c", '-');
-
first = 0;
-
}
-
else
-
{
-
if (cur->coef < 0)
-
printf("%c", '-');
-
else
-
printf("%c", ' ');
-
}
-
-
// 输出系数的绝对值
-
if ((cur->exp > 0 && cur->coef != 1) || cur->exp == 0)
-
printf("%d", abs(cur->coef));
-
-
// 输出自变量 x
-
if (cur->exp > 0)
-
printf("%c", 'x');
-
-
// 输出 ^exp
-
if (cur->exp > 1)
-
printf("%c%d", '^', cur->exp);
-
-
cur = cur->next; // 指向多项式的下一项
-
}
-
printf("\n");
-
}
五、清除链表
-
void ClearLink(Link head)
-
{
-
assert(head);
-
Node* cur = head->next;
-
while (cur != NULL)
-
{
-
Node* tmp = cur;
-
cur = cur->next;
-
free(tmp);
-
}
-
free(head);
-
}
六、主函数
-
-
-
int main()
-
{
-
Link headA;
-
Link headB;
-
InitPoyln(&headA);
-
InitPoyln(&headB);
-
-
int nA = 0;
-
int nB = 0;
-
scanf("%d", &nA);
-
CreatePoyln(headA, nA);
-
printf("第一个多项式为:");
-
PrintPolyn(headA);
-
-
scanf("%d", &nB);
-
CreatePoyln(headB, nB);
-
printf("第二个多项式为:");
-
PrintPolyn(headB);
-
-
AddPolyn(headA, headB);
-
printf("两个多项式的和为:");
-
PrintPolyn(headA);
-
-
ClearLink(headA);
-
return 0;
-
}
-
样例输入 1:
-
4
-
3 2
-
4 5
-
1 1
-
2 3
-
3
-
-3 2
-
-4 5
-
2 4
样例输出 1:
-
第一个多项式为:4x^5 2x^3 3x^2 x
-
第二个多项式为:-4x^5 2x^4-3x^2
-
两个多项式的和为:2x^4 2x^3 x
-
-
样例输入 2:
-
2
-
0 1
-
2 3
-
3
-
2 6
-
3 9
-
4 3
样例输出 2:
-
第一个多项式为:2x^3
-
第二个多项式为:3x^9 2x^6 4x^3
-
两个多项式的和为:3x^9 2x^6 6x^3
-
-
样例输入 3:
-
3
-
4 2
-
-2 2
-
-1 2
-
2
-
0 2
-
6 2
样例输出 3:
-
第一个多项式为:x^2
-
第二个多项式为:6x^2
-
两个多项式的和为:7x^2
-
-
创作不易,可以点点赞,如果能关注一下博主就更好了~
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgaegif
系列文章
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13