单链表实现多项式相加

#include <stdio.h>
#include <stdlib.h>
struct Node{
    int coef;//系数
    int expon;//指数
    struct Node* next;
};
void DestroyPoly(struct Node* Poly)//释放实现多项式申请的空间
{
    struct Node* Temp;
    while(Poly!=NULL){
        Temp=Poly;
        Poly=Poly->next;
        free(Temp);
    }
    return;
}
struct Node* CreateNode(int coe,int exp)//申请空间存放多项式当前项
{
    struct Node* item;
    item=(struct Node*)malloc(sizeof(struct Node));
    item->coef=coe;
    item->expon=exp;
    item->next=NULL;
    return  item;
}
struct Node* CreatePoly()//创建多项式
{
    int n;//项数
    int coe,exp;//临时读取指数,系数
    struct Node* Poly;
    struct Node* Temp;
    struct Node* item;
    Poly=(struct Node*)malloc(sizeof(struct Node));//带有头结点的单链表
    Poly->next=NULL;
    scanf("%d",&n);
    Temp=Poly;
    for(int i=1;i<=n;i++){
       scanf("%d%d",&coe,&exp);
       item=CreateNode(coe,exp);
       Temp->next=item;
       Temp=item;
    }
    return Poly;
}
void PolyAdd(struct Node* Poly1,struct Node* Poly2)//计算多项式的和
{
    int flag=0;//用于判断是否已经输出过项
    struct Node* Temp1=Poly1->next;
    struct Node* Temp2=Poly2->next;
    while(Temp1&&Temp2){
       if(flag)
            putchar(' ');
       if(Temp1->expon==Temp2->expon){
            if(Temp1->coef+Temp2->coef){
                printf("%d %d",Temp1->coef+Temp2->coef,Temp1->expon);
                flag=1;
            }
            Temp1=Temp1->next;
            Temp2=Temp2->next;
       }
       else if(Temp1->expon>Temp2->expon){
            if(Temp1->coef){
                printf("%d %d",Temp1->coef,Temp1->expon);
                flag=1;
            }
            Temp1=Temp1->next;
       }
       else{
            if(Temp2->coef){
               printf("%d %d",Temp2->coef,Temp2->expon);
               flag=1;
            }
            Temp2=Temp2->next;
       }
    }
    while(Temp1){
        if(flag)
           putchar(' ');
        if(Temp1->coef){
            printf("%d %d",Temp1->coef,Temp1->expon);
            flag=1;
        }
        Temp1=Temp1->next;
    }
    while(Temp2){
        if(flag)
           putchar(' ');
        if(Temp2->coef){
           printf("%d %d",Temp2->coef,Temp2->expon);
           flag=1;
        }
        Temp2=Temp2->next;
    }
    if(!flag)//扫一遍,flag仍为0,说明多项式相加为0
        printf("%d %d",0,0);
    putchar('\n');
    return;
}
int main()
{
    int n;//测试样例个数
    struct node* Poly1,*Poly2;//多项式
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        Poly1=CreatePoly();
        Poly2=CreatePoly();
        PolyAdd(Poly1,Poly2);
        //C语言与Java不同,C无自动回收机制,动态分配的空间使用结束后,需要程序员释放
        DestroyPoly(Poly1);
        DestroyPoly(Poly2);
    }
    return 0;
}

根据多项式的结构特点,利用线性链表来实现多项式相加,结点中存放各项的系数和指数,在默认用户按降幂次序输入多项式的各项后,构造相应的多项式。从头扫描两个多项式,用两个指针分别指示两个多项式的当前项,根据多项式相加的规则,对于指数相同的项,将其对应系数相加,若和不为零,则构成“和多项式”中的一项;对于两个多项式中指数不同的项,可直接复制到和多项式中,并按从大到小的降幂排列。若多项式相加的结果为0,输出0 0。本实验只要求输出多项式相加的和,因此只需在扫描时输出相应的项,不需要创建一个新的多项式存储结果。

测试样例:

7

 

4 3 4 -5 2 6 1 -2 0

3 5 20 -7 4 3 1

 

2 1 2 1 0

2 1 2 -1 0

 

2 -1000 1000 1000 0

2 1000 1000 -1000 0

 

0

1 999 1000

 

0

0

 

3 1 10 -4 5 3 0

4 3 8 4 7 -3 6 4 0

 

1 1 0

1 3 0

 

 

 

结果:

5 20 -4 4 -5 2 9 1 -2 0

2 2

0 0

999 1000

0 0

1 10 3 8 4 7 -3 6 -4 5 7 0

4 0



分析:

输出结果时,应考虑到多项式的某一项系数为零时的情况,且代码需要实现当多项式相加为零或两个空多项式相加时的情况,即需要输出结果为0 0。

心得:

1.写代码不能只为了竞赛,最终目的还是工作,因此要考虑用户需求,代码实现的简便性等,平日的代码也要像做工程一样做好事先规划与调试,开始创建了一个新多项式存储结果再输出,没有考虑此实验需求,后来改了过来,只输出结果即可,还有,代码要功能明确,分块明显,让他人一眼看出此块代码实现什么功能,自己调试时也容易,如果堆在一块,牵一发则动全身。

2.代码要一气呵成,自上而下,忌左补右补。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于实现多项式的相加和相乘,可以使用单链表来存储多项式的每一项。 首先,我们可以创建一个节点类来表示多项式中的每一项: ```java class Node { int coefficient; // 系数 int exponent; // 指数 Node next; // 下一个节点 Node(int coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; this.next = null; } } ``` 然后,我们可以创建一个链表类来管理多项式的各个节点: ```java class Polynomial { Node head; Polynomial() { this.head = null; } // 添加节点 void addTerm(int coefficient, int exponent) { Node newNode = new Node(coefficient, exponent); if (head == null) { head = newNode; } else { Node temp = head; while (temp.next != null) { temp = temp.next; } temp.next = newNode; } } } ``` 接下来,我们可以实现多项式的相加和相乘的方法: ```java class PolynomialOperations { // 相加两个多项式 static Polynomial addPolynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = new Polynomial(); Node p1 = poly1.head; Node p2 = poly2.head; while (p1 != null && p2 != null) { if (p1.exponent == p2.exponent) { result.addTerm(p1.coefficient + p2.coefficient, p1.exponent); p1 = p1.next; p2 = p2.next; } else if (p1.exponent > p2.exponent) { result.addTerm(p1.coefficient, p1.exponent); p1 = p1.next; } else { result.addTerm(p2.coefficient, p2.exponent); p2 = p2.next; } } while (p1 != null) { result.addTerm(p1.coefficient, p1.exponent); p1 = p1.next; } while (p2 != null) { result.addTerm(p2.coefficient, p2.exponent); p2 = p2.next; } return result; } // 相乘两个多项式 static Polynomial multiplyPolynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = new Polynomial(); Node p1 = poly1.head; while (p1 != null) { Node p2 = poly2.head; while (p2 != null) { result.addTerm(p1.coefficient * p2.coefficient, p1.exponent + p2.exponent); p2 = p2.next; } p1 = p1.next; } return result; } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { Polynomial poly1 = new Polynomial(); poly1.addTerm(2, 3); poly1.addTerm(1, 2); poly1.addTerm(3, 0); Polynomial poly2 = new Polynomial(); poly2.addTerm(1, 2); poly2.addTerm(2, 1); poly2.addTerm(4, 0); Polynomial sum = PolynomialOperations.addPolynomials(poly1, poly2); Polynomial product = PolynomialOperations.multiplyPolynomials(poly1, poly2); System.out.println("Sum of polynomials: "); printPolynomial(sum); System.out.println("Product of polynomials: "); printPolynomial(product); } // 打印多项式 static void printPolynomial(Polynomial poly) { Node temp = poly.head; while (temp != null) { System.out.print(temp.coefficient + "x^" + temp.exponent); if (temp.next != null) { System.out.print(" + "); } temp = temp.next; } System.out.println(); } } ``` 这样,我们就可以使用单链表实现多项式的相加和相乘了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值