zoukankan      html  css  js  c++  java
  • 数据结构与算法----数学应用之一元多项式

    PS:上一篇说了线性表的顺序表和链式表表达,该片就写一下应用到现实数学中去,一元多项式的加减。

    一元多项式我们在本子上可以说是手到拈来,但是在电脑上用语言敲出来,估计这会让很多人头疼,比如下面的多项式

    y1 = 9x^1  + 4x^3 + 6x^4

    y2 = 2x^3 + 4x^4 + 3x^7 + 3x^8

    yz = y1 + y2 ;

    效果图

    思路:

    1. 创建一个结构体,里面只存连个数,一个是系数data,一个是次幂,至于x就不用存了,只在打印的时候写上就OK了,
    2. 然后写插入操作,注意一定要是有序的,方便在后期相加
    3. 两个多项式相加就是合并,我们可以按照顺序两两比较,先拿y1的第一个数和y2第一个比较,如果y1>y2,则把y2添加到yz,相反之,如果y1=y2则相加系数,按照y1(也可y2)加入yz,等全都比较过后,如果y1(y2)还有项的话,就把剩下的全都加载到yz中,其实就是直接把next指向y1(y2)即可。

    1:结构体

    定义一个结构体类型
    在SlinkOnez调用变量是,都是
    L->data;L->next;的形式

    typedef struct SlinkOne {
        int data;
        int cimi;
        struct SlinkOne *next;
    } SlinkOne, *SlinkOnez;

    2:初始化

    /**c
     * 初始化
     * */
    SlinkOnez initLink() {
        SlinkOnez L = (SlinkOnez) malloc(sizeof(SlinkOne));
        if (!L) {
            exit(-1);
        }
        L->next = NULL;
        return L;
    }

    3:插入操作

    /**
     * 插入
     * */
    int insertLink(SlinkOnez &L, int pos, int e, int cimi) {
        SlinkOnez p = L;
        int i = 0;
        while (p && i < pos-1) {
            p = p->next;
            i++;
        }
        if (!p || i > pos-1) {
            printf("单链表未被创建
    ");
            return -1;
        }
        //创建一个新的结点,并赋值
        SlinkOnez s = (SlinkOnez) malloc(sizeof(SlinkOne));
        s->data = e;
        s->cimi = cimi;
        s->next = p->next;
        p->next = s;
        printf("插入成功
    ");
        return 0;
    }

    4:打印全部数据

    注意:我在这里面加入了几个判断,一个是当p->next ==NULL时,后面的加号就不要了,如果次幂==0的话那就只打印系数,当然如果系数==0,那就不打印,下方并未给出。

    /**
     * 打印全部数据
     * */
    void printL(SlinkOnez L) {
        SlinkOnez p = L->next;
        if (!p) {
            printf("单链表不成立或者为NULL");
            return;
        }
        while (p) {
            if (p->next == NULL) {
                printf("%dX^%d", p->data, p->cimi);
            } else {
                if (p->cimi == 0) {
                    printf("%d + ", p->data);
                } else {
                    printf("%dX^%d + ", p->data, p->cimi);
                }
            }
            p = p->next;
        }
        printf("
    ");
    }

    5:合并(重点)

    注意:pz = p1;//往下走一个,这句话其实就相当于 pz = pz->next;

    下面的全部代码实现都是在我上面说的思路上一一对应的,只要有思路,问题就已经解决了一半了,

    /**
     * 合并
     * */
    SlinkOnez mergeLink(SlinkOnez &Lz, SlinkOnez &L1, SlinkOnez &L2) {
        Lz->next=NULL;
        SlinkOnez pz = Lz;
        SlinkOnez p1 = L1->next;
        SlinkOnez p2 = L2->next;
        while (p1 && p2) {
            if (p1->cimi < p2->cimi) {
                pz->next = p1;
                pz = p1;//往下走一个
                p1 = p1->next;
            } else if (p1->cimi > p2->cimi) {
                pz->next = p2;
                pz = p2;//往下走一个
                p2 = p2->next;
            }else{
                if(0 !=(p1->data + p2->data)){
                    p1->data = (p1->data+p2->data);//注意此处,重点,不能写成pz->data,否则会把当前p的值给替换掉,而不是赋值给下一个指针的值
                    pz->next = p1;
                    pz = p1;//往下走一个
                }
                p1=p1->next;
                p2=p2->next;
            }
        }
    
        if (p1!=NULL){
            pz->next=p1;
        }
        if (p2!=NULL){
            pz->next=p2;
        }
        return Lz;
    }

    6:使用

    int main() {
        //第一个多项式
        SlinkOnez L;
        L = initLink();
        insertLink(L, 1, 9, 1);
        insertLink(L, 2, 4, 3);
        insertLink(L, 3, 6, 4);
        printL(L);
        //第二个多项式
        SlinkOnez L2;
        L2 = initLink();
        insertLink(L2, 1, 2, 3);
        insertLink(L2, 2, 4, 4);
        insertLink(L2, 3, 3, 7);
        insertLink(L2, 4, 3, 8);
        printL(L2);
        //合并后多项式
        SlinkOnez L3;
        L3=initLink();
        L3=mergeLink(L3,L,L2);
        printL(L3);
        return 0;
    }

  • 相关阅读:
    第九篇:网络编程
    第十篇:并发编程
    Python-GIL 进程池 线程池
    Python-生产者消费模型 线程
    Python-互斥锁 进程间通讯
    第八篇:异常处理
    第六篇:面向对象
    第四篇:模块与包
    【转】英语中的并列连词,只知道 and 和 but?11组并列连词,一篇搞定!
    【转】英语中的从属连词,28个,一篇搞定(句子结构2)
  • 原文地址:https://www.cnblogs.com/cmusketeer/p/9741680.html
Copyright © 2011-2022 走看看