zoukankan      html  css  js  c++  java
  • 两个一元多项式相加

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 struct PolyNode {
      5     int coefficient;        //系数
      6     int  exponent;            //指数
      7     struct PolyNode* next;
      8 };
      9 
     10 typedef struct PolyNode *Polynomial;
     11 Polynomial p1, p2;
     12 
     13 //初始化一元多项式链表
     14 void InitPolynomial(Polynomial *p);
     15 // 将比较之后的项插入到新链的尾部
     16 void Attach(int c, int e, Polynomial* pRear);
     17 //比较两项指数的大小
     18 int Compare(int exponent1, int exponent2);
     19 //比较两个多项式的各项,依次插入到新项
     20 Polynomial PolyAdd(Polynomial P1, Polynomial P2);
     21 //打印链表的值
     22 void printPolynomial(Polynomial P);
     23 
     24 int main()
     25 {
     26     InitPolynomial(&p1);
     27     InitPolynomial(&p2);
     28     Polynomial p3 = PolyAdd(p1, p2);
     29     printPolynomial(p1);
     30     printPolynomial(p2);
     31     printPolynomial(p3);
     32 
     33     return 0;
     34 }
     35 
     36 
     37 //初始化一元多项式链表
     38 void InitPolynomial(Polynomial *p)        //二级指针
     39 {
     40     
     41     (*p) = (Polynomial)malloc(sizeof(struct PolyNode));
     42     Polynomial head = *p;
     43     int coef, expon;
     44     scanf_s("%d %d", &coef, &expon);
     45     while (coef!=0 && expon != 0)
     46     {
     47         struct PolyNode* node = (struct PolyNode*)malloc(sizeof(struct PolyNode));
     48         node -> coefficient = coef;
     49         node -> exponent = expon;
     50         node->next = NULL;
     51         (*p) ->next = node;
     52         (*p) = node;
     53         scanf_s("%d %d", &coef, &expon);
     54     }
     55     (*p) = head;
     56     (*p) = (*p) -> next;
     57 }
     58 
     59 //将比较之后的项插入到新链的尾部
     60 void Attach(int c, int e, Polynomial *pRear)
     61 {
     62     Polynomial P = (Polynomial)malloc(sizeof(struct PolyNode));
     63     P -> coefficient = c;
     64     P ->exponent = e;
     65     (*pRear)->next = P;
     66     P->next = NULL;
     67     (*pRear) = P;        //因为这里改变了形参pRear的指向,所以参数列表必须传二级指针
     68 }
     69 
     70 int Compare(int exponent1, int exponent2)
     71 {
     72     if (exponent1 == exponent2)
     73         return 0;
     74     else
     75     if (exponent1 > exponent2)
     76         return 1;
     77     return -1;
     78 }
     79 
     80 //比较两个多项式的各项,依次插入到新项
     81 Polynomial PolyAdd(Polynomial P1, Polynomial P2)
     82 {
     83     Polynomial front, rear, temp;
     84     int sum;
     85     rear = front = (Polynomial)malloc(sizeof(struct PolyNode));
     86     while (P1 && P2)
     87     {
     88         switch (Compare(P1->exponent, P2->exponent))
     89         {
     90         case 1:
     91             Attach(P1->coefficient, P1->exponent, &rear);
     92             P1 = P1->next;
     93             break;
     94 
     95         case -1:
     96             Attach(P2->coefficient, P2->exponent, &rear);
     97             P2 = P2->next;
     98             break;
     99 
    100         case 0:
    101             sum = P1->coefficient + P2->coefficient;
    102             if (sum)
    103             Attach(sum, P1->exponent, &rear);
    104             P1 = P1->next;
    105             P2 = P2->next;
    106             break;
    107         }
    108     }
    109     for (; P1; P1 = P1->next)
    110         Attach(P1->coefficient, P1->exponent, &rear);
    111     for (; P2; P2 = P2->next)
    112         Attach(P2->coefficient, P2->exponent, &rear);
    113 
    114     temp = front;
    115     front = front->next;
    116     free(temp);
    117     return front;
    118 }
    119 
    120 void printPolynomial(Polynomial P)
    121 {
    122     Polynomial node = P;
    123     if (P)
    124     {
    125         for (; node ; node = node->next)
    126             printf("%dX^%d ", node->coefficient, node->exponent);
    127         printf("
    ");
    128     }
    129     return;
    130 }

     初始化的函数也可是这样:

     1 //初始化一元多项式链表
     2 void InitPolynomial(Polynomial *p)        //二级指针
     3 {
     4
     5     (*p) = (Polynomial)malloc(sizeof(struct PolyNode));
     6     Polynomial rear = *p;
     7     int coef, expon;
     8     int cnt;
     9     scanf_s("%d", &cnt);
    10     while (cnt--)      //多项式的项数
    11     {    
    12         scanf_s("%d %d", &coef, &expon);
    13         Attach(coef, expon, &rear);
    14     }
    15     Polynomial temp = (*p);
    16     (*p) = (*p) -> next; 
    17     free(temp);
    18 }
  • 相关阅读:
    20199319 2019-2020-2 《网络攻防实践》第七周作业
    《访问控制策略描述和应用》阅读总结
    密码学基础学习-序列密码
    密码学基础学习-1
    《一种普适计算下的访问控制策略》阅读总结
    20199319 2019-2020-2 《网络攻防实践》第五周作业
    《访问控制策略描述语言与策略冲突研究》阅读总结
    20199319 2019-2020-2 《网络攻防实践》第四周作业
    20199319 2019-2020-2 《网络攻防实践》第三周作业
    记录旧手机(米6)安装Linux(Ubuntu16.04)踩过的坑
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9501525.html
Copyright © 2011-2022 走看看