本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。
一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。
如有侵权,请留言作删文处理。
课程视频链接:
数据结构与算法基础–第04周12–2.8案例分析与实现2–稀疏多项式运算
📚 【Week04】12_案例分析与实现
稀疏多项式的运算
多项式非零项的数组表示
线性表 A = ((7, 0), (3, 1), (9, 8), (5, 17));
线性表 B = ((8, 1), (22, 7), (-9, 8));
(1) 创建一个新数组 c
(2) 分别从头遍历比较 a 和 b 的每一项
-
指数相同,对应系数相加,若其和不为零,则在 C 中增加一个新项
-
指数不相同,则将指数较小的项复制到 c 中
(3) 一个多项式已遍历完毕时,将另一个剩余项一次复制到 c 中
❓ 数组 c 多大合适呢?
顺序存储结构存在的问题:存储空间分配不灵活,运算的空间复杂度高
链式存储结构
typedef struct PNode{
float coef; // 系数
int expn; // 指数
struct PNode* next; // 指针域
}PNode, *Polynomial;
【算法描述】多项式创建
void CreatePolyn(Polynomial &P int n)
P=new PNode;P->next=NULL;for(i=1;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;
无效创建Polyn(多项式和P,整数n)
P=新的PNode;
下一个=空值;
对于(i=1;i<=n;++i)
S=新的PNode;
CIN>S->Coef>S->EXPN;
pre=P;
Q=P->下一个;
而(q&q->EXPN<S->EXPN){
前=q;q=q-下一个;
9
一个=s;
//输入m项的系数和指数,建立表示多项式的有序链表F
//先建立一个带头结点的单链表//依次输入n个非零项
//生成新结点
//输入系数和指数
//pre用于保存q的前驱,初值为头结点//q初始化,指向首元结点//找到第一个大于输入项指数的项*q
//将输入项s插入到q和其前驱结点pre之间
多项式相加过程
新的多项式 C
【算法步骤】多项式相加
(1) 指针 p1 和 p2 初始化,分别指向 Pa 和 Pb 的首元结点。
(2) p3 指向和多项式的当前结点,初值为 Pa 的头结点。
(3) 当指针 p1 和 p2 均未达到相应表尾时,
则循环比较 p1 和 p2 所指结点对应的指数值(p1->expn 与 p2->expn),有下列 3 种情况
-
当 p1->expn == p2->expn 时,则将两个结点种的系数相加
-
若和不为零,则修改 p1 所指结点的系数值,同时删除 p2 所指结点。
-
若和为零,则删除 p1 和 p2 所指结点。
-
当 p1->expn < p2->expn 时,则应摘取 p1 所指结点插入到 " 和多项式 " 链表中去;
-
当 p1->expn > p2->expn 时,则应摘取 p2 所指结点插入到 " 和多项式 " 链表中去;
(4) 将非空多项式的剩余段插入到 p3 所指结点之后。