数据结构---第一章案例分析
目录
案例分析与实现
一元多项式的运算
数组来表示一元多项式的线性表
数组中存多项式每项的系数,数组分量的下标对应每项的指数,非零分量的个数即为多项式的系数。
顺序存储结构来实现,当多项式每个项的指数差别大,由于每一项不管系数是否为零都是要占存储空间(为了保证多项式的指数和数组分量的下标对应)所以会浪费很多存储空间,对于系数多项式就采用链式存储结构
稀疏多项式的运算
链表表示多项式,链表结点存储多项式中的非零项,包括系数和指数,所以有两个数据域,以及一个指针域
typedef struct PNode
{
float coef;
int expn;
struct PNode *next;
}PNode,*Polynomial;
多项式的创建
类似于链表的创建,主要在于它是一个有序表
算法思想:首先初始化一个空链表用来表示多项式,然后逐个输入各项, 通过比较, 找到第一个大于该输入项指数的项,将输入项插到此项的前面, 这样即可保证多项式链表的有序性。
算法步骤:
- 创建一个只有头结点的空链表。
- 根据多项式的项的个数n, 循环n次执行以下操作:
- 生成一个新结点*s
- 输入多项式当前项的系数和指数赋给新结点*s的数据域
- 设置一前驱指针 pre, 用于指向待找到的第一个大千输入项指数的结点的前驱,pre 初值指向头结点
- 指针 q 初始化, 指向首元结点
- 循链向下逐个比较链表中当前结点与输入项指数, 找到第一个大于输入项指数的结点*q
- 将输入项结点* s 插入到结点* q 之前
void CreatePolyn(Polynomial &P,int n)
{
P=new PNode;
P->next=NULL;
for(i=l;i<=n;++i)
{
s=new PNode;
cin>>s->coef>>s->expn;
pre=P;
q=P->next;
while{q&&q->expn<s->expn)
{
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
时间复杂度为O(n^2)
多项式的相加
算法思想:
创建三个单链表A,B,C,指针p1和p2分别指向A和B中当前进行比较的某个结点,则逐一比较两个结点中的指数项,对于指数相同的项,对应系数相加,若其和不为零,则将插入到链表C中去;对于指数不相同的项,则通过比较将指数值较小的项插入到C链表中
算法步骤
-
指针pl和p2初始化, 分别指向Pa和Pb的首元结点
-
p3 指向和多项式的当前结点, 初值为Pa的头结点
-
当指针 pl 和 p2均未到达相应表尾时, 则循环比较pl 和 p2 所指结点对应的指数值
(pl->expn与p2->expn), 有下列3种情况:- 当 pl->expn等于p2->expn时,则将两个结点 中的系数相加, 若和不为零,则修改pl所指结点的系数值 , 同时删除p2所指结点, 若和为零,则删除pl和p2所指结点;
- 当pl->expn小千p2->expn时,则应摘取pl所指结点插入到 “和多项式” 链表中去;
- 当pl->expn大千p2->expn时,则应摘取p2所指结点插入到 “和多项式" 链表中去;
-
将非空多项式的剩余段插入到p3 所指结点之后
-
释放Pb的头结点