zoukankan      html  css  js  c++  java
  • 一元多项式Polynomial的C语言实现

      1 /*
      2    编译器:Dev-c++ 5.4.0 
      3    文件名:Polynomial.cpp 
      4    代码版本号:1.0
      5    时间:2015年10月9日21:53:26
      6  */
      7  
      8  /*
      9 总结:
     10     1.结构体指针指向的区域要手动分配内存 
     11     2.反复使用的代码封装成函数 
     12 */
     13 #include <stdio.h>
     14 #include <stdlib.h>
     15 
     16 #define ERROR 0
     17 #define OK 1
     18 #define TRUE 1
     19 #define FALSE 0
     20 #define OVERFLOW -2
     21 
     22 typedef int Status;
     23 typedef struct 
     24 {
     25     float coef;    
     26     int expn;
     27 }term, ElemType;
     28 
     29 typedef struct LNode 
     30 {
     31     ElemType *data;
     32     struct LNode *next;
     33 }LNode,*Link,*Position;
     34 
     35 typedef struct _LinkList 
     36 {
     37     Link head,tail;     
     38     int len;        
     39 }LinkList;
     40 
     41 /*多项式的初始化,建立头结点*/ 
     42 Status initPolynomial(LinkList *l){    
     43     Link p;
     44     p=(Link)malloc(sizeof(LNode));
     45     if(!p)
     46         exit(OVERFLOW);
     47         
     48     p->next=NULL;
     49     (*l).head=(*l).tail=p;
     50     (*l).len=0;
     51     printf("多项式初始化成功
    "); 
     52     return OK;
     53 }
     54 
     55 /*判断多项式是否为空表*/
     56 bool listEmpty(LinkList *l){
     57     return !l->len; 
     58 } 
     59 
     60 /*整数比较函数*/
     61 int comp(int a1,int a2)
     62 {
     63     if(a1>a2)
     64         return 1;
     65     else 
     66         if(a1==a2)
     67             return 0;
     68         else 
     69             return -1;
     70 } 
     71 
     72 /*判断新节点的指数,定位节点在多项式中是否已经存在*/
     73 int locateLNode(LinkList *l,LNode *p){
     74     
     75     LNode *q=((*l).head)->next;
     76 //    if(q) printf("q->data->expn为%d,p->data->expn为%d",q->data->expn,p->data->expn);
     77     while(q&&(q->data->expn!=p->data->expn))
     78     {
     79         q=q->next;
     80     
     81     }
     82     //    printf("地址%p
    ",q); 
     83     if(!q)
     84         return 0;
     85     else
     86         {
     87         return 1;
     88         };
     89     
     90 }
     91 /*销毁多项式*/
     92 Status destroyPoly(LinkList *l){
     93     LNode *p;
     94     LNode *q=l->head; 
     95     while(q)
     96     {
     97         p=q->next; 
     98         free(p);
     99         q=q->next;
    100     }
    101     free(l->head);
    102     
    103     
    104     return OK;
    105 } 
    106 /*创建一个结点*/
    107 LNode *createLNode(){
    108     LNode *q=(LNode*)malloc(sizeof(LNode));
    109     q->data=(ElemType*)malloc(sizeof(ElemType));
    110     return q;
    111 } 
    112 
    113 /*case 新节点的指数相等时只需系数相加*/
    114 Status lNodePlus(LinkList *l,LNode *p){
    115     
    116     LNode *q=((*l).head)->next;
    117     while(q && q->data->expn!=p->data->expn)
    118     {
    119         q=q->next;
    120         
    121     }
    122     if(!q)
    123         return OK;
    124     else
    125         {
    126     
    127         q->data->coef+=p->data->coef; 
    128         return OK;
    129         }
    130 } 
    131 /*case 插入新节点*/ 
    132 Status insertLNode(LinkList *l,LNode *p){
    133 
    134     LNode *q=((*l).head)->next;
    135 
    136     LNode *qian=(*l).head;//q的前一个节点 
    137     while(q&&q->data->expn < p->data->expn){
    138         
    139         qian=q;
    140         q=q->next;
    141     }    
    142     p->next=q;
    143     qian->next=p;
    144     l->len++; 
    145     return OK;
    146 } 
    147 /*all 插入节点*/
    148 Status LNodePlus(LinkList *l,LNode *p){
    149         if(locateLNode(l,p)){
    150             lNodePlus(l,p);//指数相等时只需要系数相加 
    151         }
    152         else{
    153             insertLNode(l,p);
    154         } 
    155         return OK;
    156 }
    157 
    158 /*创建多项式m项的系数和指数*/
    159 Status createPolynomial(LinkList *l,int m){
    160     
    161     float coef;    //系数coefficient 
    162     int expn;//指数exponent 
    163      for(int i=1;i<=m;i++){
    164          printf("
    请输入第%d个系数和指数",i);
    165         LNode *p=createLNode();    
    166         scanf("%f",&(p->data->coef));
    167         scanf("%d",&(p->data->expn));
    168         LNodePlus(l,p);
    169     }
    170     printf("多项式创建完毕
    "); 
    171 } 
    172 
    173 /*循环输出多项式的系数和指数*/ 
    174 Status polyTraverse(LinkList *l)
    175 {
    176     LNode *q=((*l).head)->next;
    177     printf("
    该多项式有%d个项
    ",l->len);
    178     while(q)
    179     {
    180         printf("%fx^%d+",q->data->coef,q->data->expn);
    181         q=q->next; 
    182     }
    183     return OK;
    184 }
    185 
    186 
    187 /*多项式的加法*/
    188 LinkList addPoly(LinkList *l1,LinkList *l2){
    189     
    190     LNode *q1=((*l1).head)->next;
    191     LNode *q2=((*l2).head)->next;
    192     LinkList l;
    193     initPolynomial(&l);
    194     LNode* p=l.head;//p指向多项式最后一项 
    195     while(q1 && q2){
    196     
    197     switch(comp(q1->data->expn,q2->data->expn))
    198         {    
    199             case 1:{    
    200                 LNode *q=createLNode();
    201                 
    202                 q->data->coef=q2->data->coef;
    203                 q->data->expn=q2->data->expn;
    204                 
    205                 q->next=NULL;
    206                 p->next=q;
    207                 p=p->next;
    208                 
    209                 q2=q2->next;
    210                 l.len++;
    211                 break;
    212                 }             
    213             case 0:{
    214                 LNode *q=createLNode();
    215                 
    216                 q->data->coef=q1->data->coef+q2->data->coef;
    217                 q->data->expn=q1->data->expn;
    218                 
    219                 q->next=NULL;            
    220                 p->next=q;    
    221                 p=p->next;    
    222                 
    223                 q1=q1->next;
    224                 q2=q2->next;
    225                 l.len++;
    226                 break;
    227                 }    
    228             case -1:{
    229                 LNode *q=createLNode();
    230                 
    231                 q->data->coef=q1->data->coef;
    232                 q->data->expn=q1->data->expn;
    233                 
    234                 q->next=NULL;    
    235                 p->next=q;
    236                 p=p->next;    
    237                 
    238                 q1=q1->next;
    239                 l.len++;
    240                 break;
    241                 }
    242         }
    243     }    
    244     
    245     while(q1){
    246         LNode *q=createLNode();
    247         q->data->coef=q1->data->coef;
    248         q->data->expn=q1->data->expn;
    249         q->next=NULL;
    250         p->next=q; 
    251         p=p->next; 
    252         q1=q1->next;
    253         l.len++;
    254     }
    255         
    256     while(q2){
    257         LNode *q=createLNode();
    258         q->data->coef=q2->data->coef;
    259         q->data->expn=q2->data->expn;
    260         q->next=NULL;
    261         p->next=q; 
    262         p=p->next;
    263         q2=q2->next;
    264         l.len++;
    265     }
    266     
    267 
    268     return l;
    269 } 
    270 
    271 /*多项式系数取反*/
    272 Status getOpposite(LinkList *l){
    273     LNode *q=l->head->next;
    274     while(q)
    275     {
    276         q->data->coef=(-(q->data->coef));
    277         q=q->next;
    278     }
    279     return OK;
    280 } 
    281 /*多项式的减法*/
    282 LinkList subtractPoly(LinkList *l1,LinkList *l2){
    283     getOpposite(l2);
    284     LinkList l=addPoly(l1,l2);
    285     getOpposite(l2);
    286     return l; 
    287 }
    288 
    289 /*多项式的乘法*/
    290 LinkList multiplyPoly(LinkList *l1,LinkList *l2){
    291     
    292     LinkList l;
    293     initPolynomial(&l);
    294     LNode *q1=l1->head->next;
    295     LNode *q2=l2->head->next;
    296     while(q1){    
    297         q2=l2->head->next;
    298         while(q2){
    299             LNode *q=createLNode();
    300             q->data->coef=q1->data->coef*q2->data->coef;
    301             q->data->expn=q1->data->expn+q2->data->expn;
    302             printf("q2->data->coef为%f
    ",q2->data->coef);
    303             LNodePlus(&l,q);
    304             q2=q2->next;        
    305         }
    306         q1=q1->next;
    307     }
    308     return l;
    309 }
    310 
    311 
    312 int main(){
    313     LinkList l1,l2;
    314     
    315     /*int n;
    316     LinkList l3;
    317     initPolynomial(&l3);
    318     printf("请输入多项式的term个数:
    ");
    319     scanf("%d",&n);
    320     createPolynomial(&l3,n);
    321     polyTraverse(&l3);
    322     destroyPoly(&l3);
    323     printf("删除后遍历:
    ");
    324     polyTraverse(&l3);*/
    325     
    326     int m;
    327     initPolynomial(&l1);
    328     initPolynomial(&l2);
    329     printf("请输入多项式的term个数:
    ");
    330     scanf("%d",&m);
    331     createPolynomial(&l1,m);
    332     createPolynomial(&l2,m);
    333     polyTraverse(&l1);
    334     polyTraverse(&l2);
    335     LinkList L3=addPoly(&l1,&l2);
    336     printf("多项式相加后
    ");
    337     polyTraverse(&L3);
    338     LinkList L4=subtractPoly(&l1,&l2);
    339     printf("多项式相减后
    ");
    340     polyTraverse(&L4);
    341     LinkList L5=multiplyPoly(&l1,&l2);
    342     printf("多项式相乘后
    ");
    343     polyTraverse(&L5);
    344     system("pause");
    345     return 0;
    346 }
  • 相关阅读:
    字符的编码
    数据的基本类型和内置方法(二)
    基本的数据类型和内置方法介绍 (一)
    流程运算 if while for
    用户交换 基本数据类型 基本运算符 格式化输出
    机器语言发展简介和变量的介绍
    计算机基础
    Python学习建议和要求总结
    CH135 最大子序和 题解报告
    HRBUST1356 Leyni,罗莉和队列 题解报告
  • 原文地址:https://www.cnblogs.com/gangtiexia/p/4865278.html
Copyright © 2011-2022 走看看