zoukankan      html  css  js  c++  java
  • 多项式相加

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node * polynomial;
    struct node {
        int coef;        //系数    
        int index;        //指数
        polynomial next;
    };
    //读取函数
    polynomial ReadPolynomial() {
        polynomial Rear,s,temp,p,cur;
        //Rear指向最后节点,s是建立链表时的节点,temp是为了free掉节点用的,p是头结点,cur是在冒泡排序时用的
        int N,c,i,tmp,tmp2,n;
        int j = 0;
        p = (polynomial)malloc(sizeof(struct node));//新建头结点
        p->next = NULL;
        Rear = p; //Rear指向最后一个节点,刚开始先指向头结点
        printf("输入多项式有几个项:
    ");
        scanf("%d", &N);
        while (N--) {
            printf("分别输入系数和指数: ");
            scanf("%d %d", &c, &i);
            s = (polynomial)malloc(sizeof(struct node));//新建节点
            s->coef = c; //系数赋值
            s->index = i;//指数赋值
            s->next = NULL;
            Rear->next = s;//指向最后一个节点的Rear连新节点
            Rear = s;//Rear指向最后一个节点
        }
        temp = p;//temp指向头结点
        p = p->next;//头结点后移,现在p为第一个节点
        free(temp);//释放头结点
        
        n = CountList(p); //n是一个多项式有几项
        cur = p;//cur记录头结点
        //下边冒泡排序,将多项式从指数大到小排序
        for (i=1; i <n; i++) { //扫描n-1次
            cur = p;//下边for循环结束后,重新指向第一个节点
            for (j = 0; j < n-i; j++) {//交换次数
                if (cur->index < cur->next->index)//判断后交换赋值
                {
                    tmp = cur->index;
                    tmp2 = cur->coef;
                    cur->index = cur->next->index;
                    cur->coef = cur->next->coef;
                    cur->next->index = tmp;
                    cur->next->coef = tmp2;
                }
                cur = cur->next;//向后移一个
            }
            
        }
        return p;//返回排序后的链表的第一个节点地址
    }
    
    //比较大小
    int CompareIndex(polynomial p1, polynomial p2) {
        if (p1->index > p2->index) {
            return 1;
        }
        else if (p1->index < p2->index) {
            return 2;
        }
        else if(p1->index == p2->index) {
            return 3;
        }
    }
    //读取多项式,尾插建立相加后的链表
    void AttachPolynomial(int coef, int index, polynomial *pRear) {
        polynomial s;
        s = (polynomial)malloc(sizeof(struct node));
        s->coef = coef;
        s->index = index;
        s->next = NULL;
        (*pRear)->next = s; //pRear是指向最后的节点
        (*pRear) = s;
    }
    //相加
    polynomial AddPolynomial(polynomial p1, polynomial p2) {
        polynomial P, Rear,temp;
        int sum;
        P = (polynomial)malloc(sizeof(struct node));//头结点
        Rear = P; //Rear指向最后一个结点
        /*p1和p2是根据读取的指数和系数建立的两个链表,两个链表已经从大到小排好序,如果p1的指数大于p2,
        那就将p1的那个节点连接到第三个节点,也就是相加后的节点,连完后p1=p1->next,向后移。其他同理。
        */
        while (p1&&p2) {
            switch (CompareIndex(p1, p2))//判断指数大小,根据CompareIndex函数返回的值执行switch
            {
            case 1:
                AttachPolynomial(p1->coef, p1->index, &Rear);//添加到相加链表的后边
                p1 = p1->next;//后移
                break;
            case 2:
                AttachPolynomial(p2->coef, p2->index, &Rear);
                p2 = p2->next;
                break;
            case 3:
                sum = p1->coef + p2->coef;
                AttachPolynomial(sum, p2->index, &Rear);
                p1 = p1->next;
                p2 = p2->next;
                break;
            }
        }
        for (; p1; p1 = p1->next) AttachPolynomial(p1->coef, p1->index, &Rear);//如果不为空,将剩下的节点连到相加节点
        for (; p2; p2 = p2->next) AttachPolynomial(p2->coef, p2->index, &Rear);
        Rear->next = NULL;
        temp = P;
        P = P->next;
        free(temp);//释放掉相加节点的头结点
        return P;
    
    }
    //计算链表长度
    int CountList(polynomial p) {
        int i = 0;
        while (p != NULL) {
            i++;
            p = p->next;
        }
        return i;
    }
    
    //遍历输出
    void PrintPoly(polynomial p) {
        int i,j;
        j = CountList(p);
        for (i = 1; i < j; i++) {
            printf("%dX^%d+", p->coef, p->index);
            p = p->next;
        }
        printf("%dX^%d", p->coef, p->index);
    }
    
    
    int main() {
        polynomial P1, P2,P3;
        P1 = ReadPolynomial();//读取并建立第一个链表
        P2 = ReadPolynomial();//读取并建立第二个链表
        P3=AddPolynomial(P1, P2);//读取前两个链表,建立第三个相加链表
        PrintPoly(P3);
        system("pause");
    }
  • 相关阅读:
    Weblogic 12c 集群部署和session复制
    Weblogic 12c 集群环境搭建
    Programming In Scala笔记-第十九章、类型参数,协变逆变,上界下界
    这是最好的时光,这是最坏的时光 SNAPSHOT
    这是最好的时光 这是最坏的时光 v0.1.1.1
    鹅厂欧阳大神给年轻人的一些分享
    谈到电影,我们收获了什么
    那些被电影搞的日子
    Programming In Scala笔记-第十五章、Case Classes和模式匹配
    [CSharp]传一个包含多个属性的对象,只改变其中个别属性值的方法
  • 原文地址:https://www.cnblogs.com/yudongxuan/p/8637511.html
Copyright © 2011-2022 走看看