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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目叙述:

结果:

思路:

这个题目读完本来想使用两个结构体数组,然后遍历操作,但是感觉如要这样的话在调整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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值