多项式加法运算(链表实现)

本文介绍了如何使用链表数据结构存储多项式,并实现了多项式的插入排序、尾插操作以及相加功能。首先,定义了链表节点结构,包括系数、指数和指向下一个节点的指针。接着,详细阐述了打印多项式、尾插新项、插入排序多项式以及多项式相加的算法。最后,通过示例展示了输入多项式、排序及相加的过程。

创建结点类型

我们用链表存储一个多项式,那么该链表的每一个结点就代表多项式的某一项。所以我们的每一个结点必须包含三个信息:多项式的系数、多项式的指数以及指向下一个结点的指针。

typedef int SLTDataType;//指数、系数类型

typedef struct SListNode
{
   
   
	SLTDataType coef;//系数
	SLTDataType expon;//指数
	struct SListNode* next;//用于存放下一个结点的地址
}SListNode;

打印多项式

传入一个指向多项式链表的指针,遍历该链表依次打印链表内容。(一次打印一个结点)

//打印多项式
void SListPrint(SListNode* head)
{
   
   
	SListNode* cur = head;
	if (cur)
	{
   
   
		printf("%dx^%d", cur->coef, cur->expon);//打印第一项
		cur = cur->next;
	}
	while (cur)
	{
   
   
		printf("%+dx^%d", cur->coef, cur->expon);
		cur = cur->next;
	}
	printf("\n");
}

注:需将第一项拿出来单独打印,因为我们不希望第一项系数的正号被打印出来(若第一项系数为正)。

尾插

将一个项尾插到一个多项式的后面。我们需要申请一个新结点,将要求的系数和指数赋值给这个新结点,并将新结点的指针域置空,然后尾插到目标多项式的后面。

//创建一个新结点,返回新结点地址
SListNode* BuySLTNode(SLTDataType coef, SLTDataType expon)
{
   
   
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));//向新结点申请空间
	if (node == NULL)
	{
   
   
		printf("malloc fail\n");
		exit(-1);
	}
	node->coef = coef;//系数赋值
	node->expon = expon;//指数赋值
	node->next = NULL;//将新结点的指针域置空
	return node;//返回新结点地址
}
//尾插
void SListPushBack(SListNode** pHead, SLTDataType coef, SLTDataType expon)
{
   
   
	SListNode* newnode = BuySLTNode(coef, expon);//申请一个新结点
	if (*pHead == NULL)//判断是否为空表
	{
   
   
		*pHead = newnode;//头指针直接指向新结点
	}
	else
	{
   
   
		SListNode* tail = *pHead;//接收头指针
		while (tail->next != NULL)//若某结点的指针域为NULL,说明它是最后一个结点
		{
   
   
			tail = tail->next;////指针指向下一个结点
		}
		tail->next = newnode;//让最后一个结点的指针域指向新结点
	}
}

注:若原多项式为空,即链表为空,直接让原链表指针指向新申请的结点即可。

插入排序

输入的多项式可能并不是有序的,这时我们需要将多项式按指数降序排列(或按指数升序排列),以简化后续多项式的相加操作,这里我们选用插入排序算法。

//插入排序
SListNode* InsertSortList(SListNode* head)
{
   
   
	if (head == NULL || head->next == NULL)//若链表为空或链表只有一个结点,则不需排序
		return head;

	SListNode* sortHead = head;//记录排序后链表的第一个结点
	SListNode* cur = head
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2021dragon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值