吉大考研复试准备-PTA7-2 一元多项式的乘法与加法运算-用链表解决(对continue的错误使用)

文章讲述了如何使用链表数据结构实现多项式乘法和加法,包括创建链表、多项式乘法中的指数和系数计算、相加处理以及链表遍历和优化。作者强调了在链表操作中避免死循环的重要性。

题目叙述:

结果:

思路:

这个题目读完本来想使用两个结构体数组,然后遍历操作,但是感觉如要这样的话在调整x幂次由大到小的时候会不太方便,时间复杂度较高。所以决定使用链表完成。

  1. 编写createLink函数建立两个带哨兵节点的链表。
  2. 编写multyLink函数实现两个多项式的乘法。函数中,新建哨兵结点作为结果链表的头节点。使用两层while循环分别遍历两个链表,每次malloc一个结点,存储乘的指数和系数。乘完一个就用q指针遍历一次head链表,若有相同指数的相加,相加后若为零,则删去该节点。否则将p指向结点加入。最后返回head结点。
  3. 编写addLink函数实现多项式加法,之前两个测试点一直不过也是这里出了问题。用两个指针遍历链表,把当前指数大的,新建结点放入结果链表。若相等指数,需要相加看系数,若系数为零,则跳过本次循环(我这里开始把continue放到了p1 p2指向各自next域的语句之前,这就导致出现死循环)正常应该是这样写:先改变各自next,再强制结束本次循环
  4. 最后编写printLink函数,注意出现0多项式的时候,直接输出0 0,然后return。否则在对链表遍历。
  5. 最后结束前对所有链表free掉,释放空间。这个应该也可以不用写,不过加上也是良好习惯。

      以后在链表中使用continue时候,要注意看next是否被修改。否则会陷入死循环

源代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
    int index;//指数
    int factor;//系数
    struct Node*next;
}node;

node*createLink();
node*addLink(node*head1,node*head2);
node*multLink(node*head1,node*head2);
void freeLink(node*head);
void printLink(node*head);

int main()
{
    node*head1=createLink();
    node*head2=createLink();

    node*p1,*p2;

    p1=multLink(head1,head2);
    printLink(p1);
    freeLink(p1);

    printf("\n");

    p2=addLink(head1,head2);
    printLink(p2);
    freeLink(p2);

    freeLink(head1);
    freeLink(head2);

    return 0;
}

node*createLink()
{
    int n;
    scanf("%d",&n);

    node*head=(node*)malloc(sizeof(node));
    node*tail=head;
    tail->next=NULL;

    if(n==0)
        return head;

    for(int i=0;i<n;i++)
    {
        node*p=(node*)malloc(sizeof(node));
        scanf("%d",&p->factor);
        scanf("%d",&p->index);

        p->next=tail->next;
        tail->next=p;
        tail=tail->next;
    }

    return head;
}

node*addLink(node*head1,node*head2)
{
    node*p1=head1->next;
    node*p2=head2->next;
    node*head=(node*)malloc(sizeof(node));
    node*tail=head;
    tail->next=NULL;

    while(p1!=NULL&&p2!=NULL)
    {
        node*p=(node*)malloc(sizeof(node));

        if(p1->index>p2->index)
        {
            p->index=p1->index;
            p->factor=p1->factor;
            p1=p1->next;
        }
        else if(p1->index<p2->index)
        {
            p->index=p2->index;
            p->factor=p2->factor;
            p2=p2->next;
        }
        else{
            p->index=p1->index;
            p->factor=p1->factor+p2->factor;
               
           /////////////////////!!!!!先改指针再continue!!
            p1=p1->next;
            p2=p2->next;

            if(p->factor==0)
                continue;
        }

        p->next=tail->next;
        tail->next=p;
        tail=tail->next;

    }

///////!!!!加法的时候还要注意对余项处理

    while(p1!=NULL)
    {
        node*p=(node*)malloc(sizeof(node));
        p->index=p1->index;
        p->factor=p1->factor;
        p1=p1->next;

        p->next=tail->next;
        tail->next=p;
        tail=tail->next;
    }

    while(p2!=NULL)
    {
        node*p=(node*)malloc(sizeof(node));
        p->index=p2->index;
        p->factor=p2->factor;
        p2=p2->next;

        p->next=tail->next;
        tail->next=p;
        tail=tail->next;
    }

    return head;
}

node*multLink(node*head1,node*head2)
{
    node*head=(node*)malloc(sizeof(node));
    head->next=NULL;
    node*q;

    node*p1=head1->next;
    node*p2=head2->next;

    while(p1!=NULL)
    {
        p2=head2->next;
        while(p2!=NULL)
        {
            node*p=(node*)malloc(sizeof(node));
            p->factor=p1->factor*p2->factor;
            p->index=p1->index+p2->index;

            q=head;
            while(q->next!=NULL&&q->next->index>p->index)
                q=q->next;

            if(q->next!=NULL&&q->next->index==p->index)
            {
                q->next->factor=p->factor+q->next->factor;
                if(q->next->factor==0)
                {
                    node*h=q->next;
                    q->next=q->next->next;
                    free(h);
                }
            }
                //q->next->factor=p->factor+q->next->factor;
            else
            {
                p->next=q->next;
                q->next=p;
            }

            p2=p2->next;
        }

        p1=p1->next;
    }

    return head;
}

void printLink(node*head)
{
    node*p=head->next;
    if(p==NULL)
    {
        printf("0 0");
        return;
    }
    else
    {
        while(p->next!=NULL)
       {
        printf("%d %d ",p->factor,p->index);
        p=p->next;
       }
       printf("%d %d",p->factor,p->index);
    }
}

void freeLink(node*head)
{
    node*p=head;
    while(p!=NULL)
    {
        node*q;
        q=p;
        p=p->next;
        free(q);
    }
}

在进行一元多项式乘法加法运算时,可根据多项式的特点选择合适的数据结构存储多项式,对于大部分项都有的稠密多项式更适合用数组实现,而对于项数相差较大且较少的多项式,则更适合用单链表存储。 ### 多项式加法运算 多项式加法运算的基本思路是,遍历两个多项式,比较当前项的指数大小,指数大的项直接加入结果多项式,指数相等则将系数相加后加入结果多项式。以下是一个简单的使用结构体数组实现多项式加法的示例代码: ```c #include <stdio.h> #define MAXSIZE 100 typedef struct { int factor; // 系数 int index; // 指数 } Term; // 多项式加法函数 void addOfPolynomials(Term *poly1, int size1, Term *poly2, int size2) { Term result[MAXSIZE]; int idx = 0; int i = 0, j = 0; while (i < size1 && j < size2) { if (poly1[i].index > poly2[j].index) { result[idx++] = poly1[i++]; } else if (poly1[i].index < poly2[j].index) { result[idx++] = poly2[j++]; } else { int sum = poly1[i].factor + poly2[j].factor; if (sum != 0) { result[idx].factor = sum; result[idx].index = poly1[i].index; idx++; } i++; j++; } } // 处理剩余的项 while (i < size1) { result[idx++] = poly1[i++]; } while (j < size2) { result[idx++] = poly2[j++]; } // 打印结果多项式 for (int k = 0; k < idx; k++) { if (k > 0) { printf(" "); } printf("%d %d", result[k].factor, result[k].index); } printf("\n"); } ``` ### 多项式乘法运算 多项式乘法运算可通过遍历两个多项式的每一项,将它们的系数相乘、指数相加得到新的项,然后合并同类项。以下是使用结构体数组实现多项式乘法的代码示例: ```c // 计算多项式乘积的函数 void productOfPolynomials(Term *poly1, int size1, Term *poly2, int size2) { int pool[2 * MAXSIZE] = {0}; for (int i = 0; i < size1; i++) { int idx = poly1[i].index; for (int j = 0; j < size2; j++) { idx += poly2[j].index; pool[idx] += poly1[i].factor * poly2[j].factor; idx = poly1[i].index; } } Term poly[size1 * size2]; int idx = 0; for (int i = 2 * MAXSIZE - 1; i >= 0; i--) { if (pool[i]) { poly[idx].index = i; poly[idx].factor = pool[i]; idx++; } } for (int i = 0; i < idx; i++) { if (i > 0) { printf(" "); } printf("%d %d", poly[i].factor, poly[i].index); } printf("\n"); } ``` ### 主函数调用示例 ```c int main() { Term poly1[] = {{3, 2}, {2, 1}, {1, 0}}; Term poly2[] = {{4, 3}, {2, 1}}; int size1 = sizeof(poly1) / sizeof(poly1[0]); int size2 = sizeof(poly2) / sizeof(poly2[0]); printf("多项式加法结果: "); addOfPolynomials(poly1, size1, poly2, size2); printf("多项式乘法结果: "); productOfPolynomials(poly1, size1, poly2, size2); return 0; } ``` 上述代码实现了一元多项式加法乘法运算使用结构体数组存储多项式。在实际应用中,可根据需求调整数据结构和算法实现。 [^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值