![数据结构简明教程(第2版)微课版](https://wfqqreader-1252317822.image.myqcloud.com/cover/351/25111351/b_25111351.jpg)
2.5 线性表的应用
2.5.1 设计线性表应用程序的一般步骤
当通过分析确定了求解问题中数据逻辑结构为线性关系时,设计线性表应用程序的一般步骤如下:
(1)根据求解功能的特点设计相应的存储结构。
(2)设计相应的基本运算算法。
(3)设计求解问题的主程序。
线性表的主要存储结构如图2.44所示,分为顺序存储结构和链式存储结构两类,每一类又有若干种具体实现方式,这两类存储结构的优缺点如表2.1所示。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P92_31333.jpg?sign=1739033493-3ejqIsuVxG2f17ujVEolLhiFQXoR5KWz-0-afcba9949d39a66356fc95a9dd64cc37)
图2.44 线性表的主要存储结构
表2.1 两类存储结构特点的比较
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-T92_46743.jpg?sign=1739033493-IsKfYtKpO9wKaQsxkTwLHSEMgFtNiJ6i-0-89b019fa6c10ad52f416643739cc5899)
在实际求解问题中应根据求解功能的特点来选择合适的存储结构,例如:
(1)若线性表需要频繁查找,很少进行插入和删除操作,宜采用顺序存储结构。
(2)若线性表需要频繁插入和删除操作,宜采用链式存储结构。
(3)当线性表中元素个数变化较大或难以确定时,宜采用链式存储结构。
2.5.2 线性表应用示例
本节通过实现计算两个多项式相加运算的示例介绍线性表的应用。
1.问题描述
假设一个多项式形式为p(x)=c1xe1+c2xex+…+cmxem,其中,ei(1≤i≤m)为整数类型的指数,ci(1≤i≤m)为实数类型的系数。为了简便,假设每个多项式按指数递减排列,并且没有相同指数的多项式项。编写求两个多项式相加的程序。
例如,两个多项式分别为p(x)=3.2x5+2x3—6x+10,q(x)=1.8x5—2.5x4—2x3+x2+ 6x—5,则相加后的结果为r(x)=p(x)+q(x)=5x5—2.5x4+x2+5。
说明:本示例讨论的两个多项式相加运算是一种符号运算,而不是直接求多项式的值,即不是数值运算。
2.设计存储结构
一个多项式由多个cixei(1≤i≤m)多项式项组成,这些多项式项之间构成一种线性关系,所以一个多项式可以看成是由多个多项式项元素构成的线性表。
线性表可以采用顺序表和各种链表存储,由于本例中每个多项式的项数难以确定,所以采用带头结点的单链表存储多项式。也就是说,一个多项式的存储结构对应一个带头结点的单链表,每个多项式项采用以下结点类型进行存储:
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P93_31365.jpg?sign=1739033493-jTi6lhFXnmF2O1sr8nnhSOgbQtrdpptH-0-0178305a34c8b98a8b7e17d4c7a70749)
其中,coef数据域存放系数ci;exp数据域存放指数ei;next域是一个链域,指向下一个结点。这样的单链表结点的类型声明如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P93_46747.jpg?sign=1739033493-AIRFlXz93KS8DDiSuh3aQ2jMvvBTy4ny-0-c94c816c47c9808640cc124e6b777b71)
例如,前面的两个多项式p(x)、q(x)的存储结构如图2.45所示。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P93_31382.jpg?sign=1739033493-CLxaZSlH8iQvmpdoQn61mY2f4rGiVSMk-0-ef2367883ec0f99e59d6fc1ae91ae672)
图2.45 两个多项式单链表
3.设计基本运算算法
在多项式单链表上设计如下基本运算算法。
1)建立多项式单链表
由数组a指定一个多项式的系数,数组b指定指数,共有n个多项式项(a[0],b[0]),(a[1],b[1]),…,(a[n—1],b[n—1])构成一个多项式(所有的多项式项构成一种线性关系),假设多项式的指数是按递减排列的(如果多项式不按指数递减排列,可以采用单链表排序算法使之这样排列)。采用尾插法建立对应的多项式单链表L的算法如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P94_46748.jpg?sign=1739033493-auEvttP6xKTGVdYQZDhmY3bxZwzfYOLE-0-e7da0ba00cb2774d7731733f826993f7)
2)销毁多项式单链表
销毁多项式单链表L的算法(与销毁一般单链表的过程相同)如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P94_1.jpg?sign=1739033493-aaYHN9RSPwk3NHI56vfxYGaj6SJ2hx6l-0-72c1b6f5e440fce78d8e743b2cdde95d)
3)输出多项式单链表
输出多项式单链表L的算法如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P94_46749.jpg?sign=1739033493-IL1d69G9lfzMIeWIWqbvnBJ6dz1LFcrZ-0-32dd8362ec93aa260b23bd4a28d03023)
4)两个有序多项式单链表相加运算
对于ha和hb两个有序多项式单链表(按指数递减排列),采用二路归并实现多项式相加运算(产生有序单链表hc)的过程如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P95_46750.jpg?sign=1739033493-57lYIWFueRuSQJe7WwT3Nos0h97t9cV3-0-d8db68f808d96decc9db5144a4d49645)
示意图如图2.46所示。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P95_31492.jpg?sign=1739033493-3udkFFT0fPcqqEG7LygKaGyXgaxc6cCu-0-0722f5749937577abe6ce5f74da4bc5f)
图2.46 由有序单链表ha、hb二路归并产生有序单链表hc
对应的算法如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P95_46751.jpg?sign=1739033493-CneDCRcwOviMzZhjm8nsfbe22QdKb9T8-0-b6c51efd9ad5b726c35b0dd63f327de2)
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P96_46752.jpg?sign=1739033493-7BKKcWQ80xIrwGJm1Fl031nADn5x3s5c-0-9a239c65c7bf4d5dedcae49641e699cb)
4.设计主程序
设计主函数调用上述算法实现前面的两个多项式p(x)、q(x)相加功能。其执行过程是,调用CreateListR()函数两次创建两个多项式单链表Poly1和Poly2,调用DispPoly()函数两次输出这两个多项单链表,调用Add(Poly1,Poly2,Poly3)函数由Poly1和Poly2相加得到结果多项式单链表Poly3,再调用DispPoly()函数输出Poly3。最后调用DestroyList()函数三次销毁所有的三个多项式单链表。对应的主函数如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P96_31661.jpg?sign=1739033493-AMItw0BQmfsfT6LFq3qYpsVnqYsQACYm-0-77b98e89327720413a3596611d6ca5bf)
5.程序运行结果
本程序的执行结果如图2.47所示,从中看到上述两个多项式相加的结果为:
5x5—2.5x4+x2+5
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P97_31674.jpg?sign=1739033493-GUuIVDI5D88rxqJ5MGNyyu2oUYpnBnKl-0-c784f5fe178e853210c548c969e56a70)
图2.47 两多项式相加运算的程序执行结果