#include <stdio.h>
#include <stdlib.h>
typedef struct PNode
{
int coef; // 系数
int expn; // 指数
struct PNode *next; // 后继指针
} PNode, *polynomial;
polynomial CreatePolyn(polynomial P, int n); // 创建多项式单链表
polynomial polynomialSum(polynomial Pa, polynomial Pb, polynomial Pc); // 多项式求和
void print(polynomial p); // 输出多项式单链表
int main(int argc, char const *argv[])
{
polynomial Pa, Pb, Pc;
printf("多项式单链表Pa:\n");
Pa = CreatePolyn(Pa, 5);
print(Pa);
printf("多项式单链表Pb:\n");
Pb = CreatePolyn(Pb, 4);
print(Pb);
printf("多项式单链表Pc:");
Pc = polynomialSum(Pa, Pb, Pc);
print(Pc);
return 0;
}
/*
* 创建多项式单链表
* polynomial P:polynomial类型变量
* n:输入数量
*/
polynomial CreatePolyn(polynomial P, int n)
{
PNode *nextNode, *pre, *q;
P = (polynomial) malloc(sizeof(PNode)); // 创建头节点
P->next = NULL; // 置空后继指针
printf("请输入%d个数:", n);
for (int i = 1; i < n; ++i)
{
nextNode = (polynomial) malloc(sizeof(PNode)); // 创建新节点存储输入元素
scanf("%d %d", &nextNode->coef, &nextNode->expn); // 输入数据
pre = P; // pre指针保存前驱, 初始化为头节点
q = P->next; // q初始化, 指向首元节点
while (q && (q->expn < nextNode->expn)) // 条件成立,pre和p会循环一直到q是空,或者比新节点指数大的节点,然后执行末尾末尾两行代码,
{ // q为空则新节点指数最大插入末尾,比新节点指数大的节点则插入到指数大节点前
pre = q; // pre指针指向下一节点
q = q->next; // q指针指向下一节点
}
nextNode->next = q; // 如果q非空,则将所有节点接在新节点后继, q为空则是置空新节点后继
pre->next = nextNode; // 将上一节点后继指向新节点
}
return P;
}
/*
* 稀疏多项式求和:
* Pa表指数小的项直接加入表c,Pb表指数大的一项与Pa的下一项对比,反之Pb加入。
* 指数相同项系数求和加入表c, 如果系数求和为0,直接去除,
*/
polynomial polynomialSum(polynomial Pa, polynomial Pb, polynomial Pc)
{
PNode *p1, *p2, *p3, *p1_last, *p2_last, *currentNode;
p1 = Pa->next; // 初始化p1,指向pa首元节点
p2 = Pb->next; // 初始化p2, 指向pb首元节点
p3 = Pc = Pa;
while (p1 && p2) /* p1、p2非空 */
{
if (p1->expn == p2->expn) /* 当p1指数等于于p2 */
{
p1->coef = p1->coef + p2->coef; // 系数求和
if (p1->coef != 0) /* 当系数和不为0时 */
{
p3->next = p1; // 将Pc的后继节点指向p1
p3 = p1; // p3指针p1指针指向目标
p1 = p1->next; // p1指针指向后继节点
currentNode = p2; // 记录删除节点地址
p2 = p2->next; // 删除p2节点,将p1指向下下节点;
free(currentNode); // 释放节点
}else { /* 反之求和为0时 */
currentNode = p1; // 记录删除节点地址
p1 = p1->next; // 删除节点,将指针指向下下节点;
free(currentNode); // 释放节点
currentNode = p2;
p2 = p2->next;
free(currentNode);
}
} else if (p1->expn < p2->expn) /* 当p1指数小于p2指数时 */
{
p3->next = p1; // 直接加入PC表
p3 = p1; // p3指针p1指针指向目标
p1 = p1->next; // p指向下一节点
} else if (p1->expn > p2->expn) /* 当p2指数小于p1指数时 */
{
p3->next = p2; // 直接加入PC表
p3 = p2; // p3指针p1指针指向目标
p2 = p2->next; // p指向下一节点
}
}
p3->next = p1 ? p1 : p2; // 添加不为空的表属于数据入表c
free(Pb); // 释放Pb表头
return Pc;
}
/* 输出多项式单链表 */
void print(polynomial p)
{
PNode *temp = p; // 创建指针指向头节点
while (temp->next) // 判断是否为空,进入循环
{
temp = temp->next; // 指针指向下一节点
printf("(%d, %d),\t", temp->coef, temp->expn);
}
printf("\n\n");
}
多项式单链表操作笔记
最新推荐文章于 2022-10-02 10:57:02 发布