奕成则成 2023-02-16 10:38 采纳率: 87.5%
浏览 22
已结题

链表一元函数相加的问题

注释中的代码在程序中的作用是什么



#include<stdio.h>
#include<stdlib.h>
typedef struct PNODE
{
    float coef;
    int expn;
    struct PNODE*next;
}PNODE;
PNODE *insert(PNODE *head,PNODE *s);
PNODE *creatPoly(PNODE *head);
void  shuchu(PNODE *head);
PNODE *addPoly(PNODE *headA,PNODE *headB);
int main()
{
    PNODE *headA,*headB;
    headA=creatPoly(headA);
    printf("\n输出多项式A:\n");
    shuchu(headA);
    headB=creatPoly(headB);
    printf("\n输出多项式B:\n");
    shuchu(headB);
    headA=addPoly(headA,headB);
    printf("\n输出两个多项式相加后的结果多项式:\n");
    shuchu(headA);

    return 0;
}
PNODE *creatPoly(PNODE *head)
{
    int n,i;
    head=NULL;
    PNODE *s;
    printf("输入该多项式的项数:");
    scanf("%d",&n);
    printf("\n输入多项式各项系数以及指数:");
    for(i=1;i<=n;i++)
    {
        s=(PNODE*)malloc(sizeof(PNODE));
        s->next = NULL;
        scanf("%f %d",&s->coef,&s->expn);
        if(i!=1)
        {
            head=insert(head,s);
        }
        else
        {
            head=s;
            head->next=NULL;
        }
    }
    printf("输入完成\n");
    return head;
}
PNODE *insert(PNODE *head,PNODE *s)
{
    PNODE *p,*pr;
    p=pr=head;
    while(p->next && p->next->expn < s->expn)
    {
        p=p->next;
    }
    if (p == head && p->expn > s->expn){
        s->next = head;
        head = s;
    }
    else{
        s->next = p->next;
        p->next = s;
    }
    return head;
}
void shuchu(PNODE *head)
{
    PNODE *p;
    p=head;
    while(p!=NULL)
    {
        printf("\t%f %d,",p->coef,p->expn);
        p=p->next;
    }
    printf("\n");
}
PNODE *addPoly(PNODE *headA,PNODE *headB)
{
    float sum=0;
    PNODE *p1,*p2,*p3,*r = NULL;
    p1=headA,p2=headB;
    headA=NULL,p3=NULL;
    while (p1 && p2)
    {
        if(p1->expn==p2->expn)
        {
            sum=p1->coef+p2->coef;
            if(sum==0)
            {
               r=p1;
               p1=p1->next;
               free(r);
               r=p2;
               p2=p2->next;
               free(r);
            }
            else{
                p1->coef=sum;
              /*  if (!headA)
                    headA=p1;
                else
                    p3->next=p1;
                p3 = p1;
                p1=p1->next;
                r=p2;
                p2=p2->next;
                free(r);*/
            }
        }
        else{
         /*  if(p1->expn<p2->expn){
               if (!headA)
                   headA = p1;
               else
                   p3->next = p1;
               p3 = p1;
               p1=p1->next;
               p3->next=NULL;*/
           }
           else{
             /*  if (!headA)
                   headA = p2;
               else
                   p3->next = p2;
               p3 = p2;
               p2=p2->next;
               p3->next=NULL;*/
           }

        }
    }
    p3->next = p1 ? p1 : p2;
    return headA;
}
  • 写回答

3条回答 默认 最新

  • zmy1127 2023-02-16 11:50
    关注

    这段代码实现了两个多项式的相加。其中,链表中每个节点代表多项式中的一项,每个节点包含两个元素:系数和指数。

    在函数 addPoly() 中,首先初始化一些指针变量,其中 p1 和 p2 分别指向两个待相加的多项式的第一项。然后,在一个 while 循环中,遍历这两个多项式的所有项,对于每一项,根据指数的大小分别进行处理:

    若两个多项式当前项的指数相同,将它们的系数相加,若和为零,则释放这两个节点,否则仅修改一个节点的系数。
    若当前项在第一个多项式中的指数较小,则将该项加入结果多项式中。
    若当前项在第二个多项式中的指数较小,则将该项加入结果多项式中。
    当两个多项式中的项遍历完后,将没有遍历完的那个多项式中的所有剩余项加入结果多项式中。最后,返回指向结果多项式的头节点的指针。

    在函数 insert() 中,根据当前节点的指数,将节点按升序插入链表中。同时,如果新插入的节点指数小于头节点的指数,则将新节点设为头节点。

    函数 creatPoly() 主要是用来从用户输入中创建多项式链表的,函数 shuchu() 则是用来输出多项式链表的。

    需要注意的是,在函数 addPoly() 中,部分代码被注释掉了,这是因为这部分代码中的操作与另一部分代码中的操作实现的功能是相同的,因此这部分代码可以被省略。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥50 adb连接不到手机是怎么回事?
  • ¥15 vs2022无法联网
  • ¥15 TCP的客户端和服务器的互联
  • ¥15 VB.NET操作免驱摄像头
  • ¥15 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目