C语言——一元多项式定义求和 [单链表] (数据结构)

设计实践 同时被 2 个专栏收录
59 篇文章 1 订阅
24 篇文章 0 订阅
  • 输入多项式项数后,对多项式进行描述,将求两个多项式和
  • 仅为demo基础版,可拓展。
  • 单链表实现

数据结构

#include<stdio.h>  
#include<stdlib.h>  
#include<malloc.h>  
typedef int ElemType; 
/*单项链表的声明*/  
typedef struct PolynNode{  
    int coef; // 系数  
    int expn; // 指数  
    struct PolynNode *next;  
}PolynNode,*PolynList;   
/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/  
/*指数系数一对一对输入*/  
void CreatePolyn(PolynList &L,int n){  
    int i;  
    PolynList p,q;  
    L=(PolynList)malloc(sizeof(PolynNode)); // 生成头结点  
    L->next=NULL;  
    q=L;  
    printf("成对输入%d个数据\n",n);  
    for(i=1;i<=n;i++){  
        p=(PolynList)malloc(sizeof(PolynNode));  
        scanf("%d%d",&p->coef,&p->expn);    //指数和系数成对输入  
        q->next=p;  
        q=q->next;  
    }  
    p->next=NULL;  
}  
// 初始条件:单链表L已存在  
// 操作结果: 依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败  
void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)){  
    PolynList p=L->next;  
    while(p){  
        vi(p->coef, p->expn);  
        if(p->next){  
            printf(" + ");   //“+”号的输出,最后一项后面没有“+”  
        }  
        p=p->next;  
    }  
    printf("\n");  
}    
/*ListTraverse()调用的函数(类型要一致)*/  
void visit(ElemType c, ElemType e){  
    if(c != 0){  
        printf("%dX^%d",c,e);   //格式化输出多项式每一项  
    }  
}    
/*    多项式相加,原理:归并        */  
/* 参数:两个已经存在的多项式       */  
/* 返回值:归并后新的多项式的头结点 */  
PolynList MergeList(PolynList La, PolynList Lb){  
    PolynList pa, pb, pc, Lc;  
    pa = La->next;  
    pb = Lb->next;  
    Lc = pc = La;   // 用La的头结点作为Lc的头结点  
    while(pa&&pb){  
        if(pa->expn < pb->expn){                                
            pc->next = pa;             //如果指数不相等,pc指针连上指数小的结点,  
            pc = pa;  
            pa = pa->next;             //指向该结点的指针后移  
        }  
        else if (pa ->expn > pb->expn ){  
            pc->next = pb;               //pc指针连上指数小的结点,  
            pc = pb;  
            pb = pb->next;               //指向该结点的指针后移  
        }  
        else{   //(pa ->expn = pb->expn )  
          
            pa->coef = pa->coef + pb->coef;     //指数相等时,系数相加  
            pc->next = pa;  
            pc = pa;  
            pa = pa->next;             //两指针都往后移  
            pb = pb->next;  
        }  
    }  
    pc->next = pa ? pa:pb;  // 插入剩余段   
    return Lc;  
}  
   
int main(){  
    PolynList ha,hb,hc; 
	int a;
	printf("请输入多项式项数:\n");
	scanf("%d",&a);
	
    printf("非递减输入多项式ha, ");  
    CreatePolyn(ha,a);   // 正位序输入n个元素的值  
   
    printf("非递减输入多项式hb, ");  
    CreatePolyn(hb,a);   // 正位序输入n个元素的值  
   
    printf("\n"); 
   
    printf("多项式ha :\n");  
    PolynTraverse(ha, visit);  
    printf("\n");  
    printf("多项式hb :\n");  
    PolynTraverse(hb, visit);  
    printf("\n");  
   
    printf("求和结果 :\n");  
    hc = MergeList(ha,hb);  
    PolynTraverse(hc, visit);  }
  • 9
    点赞
  • 3
    评论
  • 33
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:博客之星2020 设计师:CSDN官方博客 返回首页

打赏作者

GodOuO

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值