数据结构---第一章案例分析

案例分析与实现

一元多项式的运算

数组来表示一元多项式的线性表
数组中存多项式每项的系数,数组分量的下标对应每项的指数,非零分量的个数即为多项式的系数。

顺序存储结构来实现,当多项式每个项的指数差别大,由于每一项不管系数是否为零都是要占存储空间(为了保证多项式的指数和数组分量的下标对应)所以会浪费很多存储空间,对于系数多项式就采用链式存储结构

稀疏多项式的运算

链表表示多项式,链表结点存储多项式中的非零项,包括系数和指数,所以有两个数据域,以及一个指针域

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种情况:

    1. 当 pl->expn等于p2->expn时,则将两个结点 中的系数相加, 若和不为零,则修改pl所指结点的系数值 , 同时删除p2所指结点, 若和为零,则删除pl和p2所指结点;
    2. 当pl->expn小千p2->expn时,则应摘取pl所指结点插入到 “和多项式” 链表中去;
    3. 当pl->expn大千p2->expn时,则应摘取p2所指结点插入到 “和多项式" 链表中去;
  • 将非空多项式的剩余段插入到p3 所指结点之后

  • 释放Pb的头结点

posted on 2022-02-06 19:50  眉目作山河  阅读(94)  评论(0编辑  收藏  举报

导航