单链表多项式相加

#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 结束程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

情报员007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值