#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct poly
{
int exp; //指数
int coef; //系数
struct poly* next; //指针域
}PNode,*PLinklist; //多项式结点
int Init(PLinklist* head) //链表初始化
{
*head = (PLinklist)malloc(sizeof(PNode));
if (*head)
{
(*head)->next = NULL;
return 1;
}
else
return 0;
}
int CreateFromTail(PLinklist* head) //尾插法创建链表
{
PNode* pTemp, * pHead;
int c; //存放系数
int exp; //存放指数
int i = 1; //计数器提示用户输入第几项
pHead = *head;
scanf_s("%d,%d", &c, &exp);
while (c != 0)
{
pTemp = (PLinklist)malloc(sizeof(PNode));
if (pTemp)
{
pTemp->exp = exp; //接收指数
pTemp->coef = c; //接收系数
pTemp->next = NULL;
pHead->next = pTemp;
pHead = pTemp;
scanf_s("%d,%d", &c, &exp);
}
else
return 0;
}
return 1;
}
void Polyadd(PLinklist LA,PLinklist LB)
{
//比较指数:A<B时,将A链到LA后;A=B时,比较系数;A> B 时,将B链到表中
PNode* p = LA->next;
PNode* q = LB->next;
//*LA与LB充当p和q的前驱
PNode* temp; //保存要删除的结点
int sum = 0;
while (p && q)
{
if (p->exp < q->exp)
{
LA->next = p; //*LA的当前结点可能是q或p*
LA = LA->next;
p = p->next;
}
else
if (p->exp == q->exp)
{
sum = p->coef + q->coef;
if (sum) //系数不为0,结果存入p中,同时删除结点q*
{
p->coef = sum;
LA->next = p;
LA = LA->next;
p = p->next;
temp = q;
q = q->next;
free(temp);
}
else
{
temp = p;
p = p->next;
free(temp);
temp = q;
q = q->next;
free(temp);
}
}
else
{
LA->next = q;
LA = LA->next;
q = q->next;
}
}
if (p)
LA->next = p;
else
LA->next = q;
}
void Print(PLinklist head) //输出多项式
{
head = head->next;
while (head)
{
if (head->exp)
printf("%dx^%d", head->coef, head->exp);
else
printf("%d", head->coef);
if (head->next)
printf("+");
else
break;
head = head->next;
}
}
int main()
{
PLinklist LA;
PLinklist LB;
Init(&LA);
Init(&LB);
printf("输入第一个多项式的系数,指数\n");
CreateFromTail(&LA);
printf("输入第二个多项式的系数,指数\n");
CreateFromTail(&LB);
Print(LA);
printf("\n");
Print(LB);
printf("\n");
Polyadd(LA, LB);
printf("两个多项式相加的结果:\n");
Print(LA); //相加后结果存在LA中,打印LA*
printf("\n");
}
1.头文件
- stdio.h :标准输入输出头文件,提供了 printf 、 scanf 等函数的声明。
- malloc.h :用于内存分配相关的函数声明,这里主要使用 malloc 函数来动态分配内存。
- stdlib.h :包含了一些通用的标准库函数,如 free 函数用于释放内存。
2.结构体定义
typedef struct poly
{
int exp; //指数
int coef; //系数
struct poly* next; //指针域
}PNode, * PLinklist; //多项式结点
- 定义了一个名为 poly 的结构体,用于表示多项式的每一项。其中 exp 成员存储该项的指数, coef 成员存储该项的系数, next 指针用于指向下一项,形成链表结构。
- 通过 typedef 将 struct poly 重命名为 PNode ,将 struct poly * 重命名为 PLinklist ,方便后续代码使用。
3.链表初始化函数Init
int Init(PLinklist* head) //链表初始化
{
*head = (PLinklist)malloc(sizeof(PNode));
if (*head)
{
(*head)->next = NULL;
return 1;
}
else
return 0;
}
- 函数接受一个 PLinklist 类型的指针 head 作为参数,目的是初始化一个链表。
- 在函数内部,通过 malloc 函数为链表头节点分配内存,内存大小为 PNode 结构体的大小。
- 如果内存分配成功( *head 不为 NULL ),将头节点的 next 指针置为 NULL ,表示链表为空,并返回 1 表示初始化成功;如果内存分配失败,则返回 0 。
4.尾插法创建链表函数 CreateFromTail
int CreateFromTail(PLinklist* head) //尾插法创建链表
{
PNode* pTemp, * pHead;
int c; //存放系数
int exp; //存放指数
int i = 1; //计数器提示用户输入第几项
pHead = *head;
scanf_s("%d,%d", &c, &exp);
while (c!= 0)
{
pTemp = (PLinklist)malloc(sizeof(PNode));
if (pTemp)
{
pTemp->exp = exp; //接收指数
pTemp->coef = c; //接收系数
pTemp->next = NULL;
pHead->next = pTemp;
pHead = pTemp;
scanf_s("%d,%d", &c, &exp);
}
else
return 0;
}
return 1;
}
- 函数接受一个 PLinklist 类型的指针 head 作为参数,用于创建一个多项式链表。
- 首先定义了两个 PNode* 类型的指针 pTemp 和 pHead , pHead 初始化为传入的链表头, pTemp 用于临时存储新创建的节点。
- 定义 c 和 exp 分别用于接收用户输入的系数和指数, i 作为计数器。
- 当输入的系数 c 不为 0 时,进入循环:
- 首先使用 malloc 为新节点分配内存,如果分配成功:
- 将新节点的 exp 成员设置为读取到的指数, coef 成员设置为读取到的系数, next 指针置为 NULL 。
- 将 pHead 的 next 指针指向新节点 pTemp ,然后将 pHead 更新为新节点 pTemp ,这样 pHead 始终指向链表的尾节点。
5.多项式相加函数 Polyadd
void Polyadd(PLinklist LA, PLinklist LB)
{
//比较指数:A<B时,将A链到LA后;A=B时,比较系数;A> B 时,将B链到表中
PNode* p = LA->next;
PNode* q = LB->next;
//*LA与LB充当p和q的前驱
PNode* temp; //保存要删除的结点
int sum = 0;
while (p && q)
{
if (p->exp < q->exp)
{
LA->next = p; //*LA的当前结点可能是q或p*
LA = LA->next;
p = p->next;
}
else if (p->exp == q->exp)
{
sum = p->coef + q->coef;
if (sum) //系数不为0,结果存入p中,同时删除结点q*
{
p->coef = sum;
LA->next = p;
LA = LA->next;
p = p->next;
temp = q;
q = q->next;
free(temp);
}
else
{
temp = p;
p = p->next;
free(temp);
temp = q;
q = q->next;
free(temp);
}
}
else
{
LA->next = q;
LA = LA->next;
q = q->next;
}
}
if (p)
LA->next = p;
else
LA->next = q;
}
- 函数接受两个 PLinklist 类型的参数 LA 和 LB
- 定义 p 和 q 指针分别指向 LA 和 LB 链表的第一个有效节点(跳过头节点)。
- 定义 temp 指针用于临时存储要删除的节点, sum 用于存储相加后的系数。
- 如果 p 所指节点的指数小于 q 所指节点的指数:
- 将 LA 的 next 指针指向 p ,然后 LA 和 p 都向后移动一位。
- 如果 p 和 q 所指节点的指数相等:
- 计算系数之和 sum = p->coef + q->coef 。
- 如果 sum 不为 0 :
- 将 p 的系数更新为 sum ,将 LA 的 next 指针指向 p ,然后 LA 、 p 向后移动,删除 q 节点(先保存 q 到 temp ,然后 q 后移,释放 temp 所指节点)。
- 如果 sum 为 0 :
- 删除 p 和 q 节点(分别保存到 temp ,后移指针,释放 temp 所指节点)。
- 如果 p 所指节点的指数大于 q 所指节点的指数:
- 将 LA 的 next 指针指向 q ,然后 LA 和 q 都向后移动一位。
- 当 while 循环结束后,如果 p 不为 NULL ,说明 LA 链表还有剩余节点,将 LA 的 next 指针指向 p ;否则将 LA 的 next 指针指向 q ,这样就完成了两个多项式的相加,结果保存在 LA 链表中。
6.输出多项式函数 Print
void Print(PLinklist head) //输出多项式
{
head = head->next;
while (head)
{
if (head->exp)
printf("%dx^%d", head->coef, head->exp);
else
printf("%d", head->coef);
if (head->next)
printf("+");
else
break;
head = head->next;
}
}
- 函数接受一个 PLinklist 类型的参数 head ,用于输出多项式链表所表示的多项式。
- 首先将 head 指针移动到链表的第一个有效节点(跳过头节点)。
- 在 while 循环中,只要 head 不为 NULL :
- 如果当前节点的指数不为 0 ,使用 printf 函数输出 系数x^指数 的形式;如果指数为 0 ,只输出系数。
- 如果当前节点不是链表的最后一个节点( head->next 不为 NULL ),输出 + 号。
- 然后将 head 指针向后移动一位。
7.main函数
int main()
{
PLinklist LA;
PLinklist LB;
Init(&LA);
Init(&LB);
printf("输入第一个多项式的系数,指数\n");
CreateFromTail(&LA);
printf("输入第二个多项式的系数,指数\n");
CreateFromTail(&LB);
Print(LA);
printf("\n");
Print(LB);
printf("\n");
Polyadd(LA, LB);
printf("两个多项式相加的结果:\n");
Print(LA); //相加后结果存在LA中,打印LA*
printf("\n");
return 0;
}
- 在 main 函数中:
- 首先定义了两个 PLinklist 类型的变量 LA 和 LB ,用于存储两个多项式链表。
- 调用 Init 函数分别初始化 LA 和 LB 链表。
- 提示用户输入第一个多项式的系数和指数,然后调用 CreateFromTail 函数创建第一个多项式链表 LA 。
- 接着提示用户输入第二个多项式的系数和指数,调用 CreateFromTail 函数创建第二个多项式链表 LB 。
- 调用 Print 函数分别输出 LA 和 LB 所表示的多项式。
- 调用 Polyadd 函数将两个多项式相加,结果保存在 LA 链表中。
- 最后输出相加后的结果(通过再次调用 Print 函数输出 LA ),并返回 0 结束程序。