创建结点类型
我们用链表存储一个多项式,那么该链表的每一个结点就代表多项式的某一项。所以我们的每一个结点必须包含三个信息:多项式的系数、多项式的指数以及指向下一个结点的指针。
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

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

被折叠的 条评论
为什么被折叠?



