知识大全 数据结构与算法线性表复习习题6[3]
Posted 结点
篇首语:大多数人想要改造这个世界,但却罕有人想改造自己。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构与算法线性表复习习题6[3]相关的知识,希望对你有一定的参考价值。
假设在算法描述语言中引入指针的二元运算 异或 若a和b为指针 则a⊕b的运算结果仍为原指针类型 且a⊕(a⊕b)=(a⊕a)⊕b=b
(a⊕b)⊕b=a⊕(b⊕b)=a
则可利用一个指针域来实现双向链表L 链表L中的每个结点只含两个域 data域和LRPtr域 其中LRPtr域存放该结点的左邻与右邻结点指针(不存在时为NULL)的异或 若设指针L Left指向链表中的最左结点 L Right指向链表中的最右结点 则可实现从左向右或从右向左遍历此双向链表的操作 试写一算法按任一方向依次输出链表中各元素的值
解
Status TraversingLinkList(XorLinkedList &L char d)
XorPointer p left right;
if(d== l ||d== L )
p=L Left;
left=NULL;
while(p!=NULL)
VisitingData(p >data);
left=p;
p=XorP(left p >LRPtr);
else
if(d== r ||d== R )
p=L Right;
right=NULL;
while(p!=NULL)
VisitingData(p >data);
right=p;
p=XorP(p >LRPtr right);
else return ERROR;
return OK;
设有一个双向循环链表 每个结点中除有pre data和next三个域外 还增设了一个访问频度域freq 在链表被起用之前 频度域freq的值均初始化为零 而每当对链表进行一次Locate(L x)的操作后 被访问的结点(即元素值等于x的结点)中的频度域freq的值便增 同时调整链表中结点之间的次序 使其按访问频度非递增的次序顺序排列 以便始终保持被频繁访问的结点总是靠近表头结点 试编写符合上述要求的Locate操作的算法
解
DuLinkList ListLocate_DuL(DuLinkList &L ElemType e)
DuLinkList p q;
p=L >next;
while(p!=L && p >data!=e)p=p >next;
if(p==L) return NULL;
else
p >freq++;
// 删除结点
p >pre >next=p >next;
p >next >pre=p >pre;
// 插入到合适的位置
q=L >next;
while(q!=L && q >freq>p >freq) q=q >next;
if(q==L)
p >next=q >next;
q >next=p;
p >pre=q >pre;
q >pre=p;
else
// 在q之前插入
p >next=q >pre >next;
q >pre >next=p;
p >pre=q >pre;
q >pre=p;
return p;
试以循环链表作稀疏多项式的存储结构 编写求其导函数的方法 要求利用原多项式中的结点空间存放其导函数多项式 同时释放所有无用结点
解
Status PolyDifferential(LinkedPoly &L)
LinkedPoly p q pt;
q=L;
p=L >next;
while(p!=L)
if(p >data exp== )
pt=p;
p=p >next;
q >next=p;
free(pt);
else
p >data coef=p >data coef*p >data exp;
p >data exp ;
q=p;
p=p >next;
return OK;
试编写算法 将一个用循环链表表示的稀疏多项式分解成两个多项式 使这两个多项式中各自仅含奇次项或偶次项 并要求利用原链表中的结点空间构成这两个链表
解
// 将单链表L划分成 个单循环链表
Status ListDivideInto CL(LinkedPoly &L LinkedPoly &L )
LinkedPoly p p q pt;
q=L;
p=L >next;
p =L ;
while(p!=L)
if(p >data exp% == )
pt=p;
p=p >next;
q >next=p;
pt >next=p >next;
p >next=pt;
p =p >next;
else
q=p;
p=p >next;
return OK;
cha138/Article/program/sjjg/201311/23388
相关参考