多项式单链表操作笔记

#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");
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZiWie丶ZHANG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值