知识大全 数据结构与算法线性表复习习题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
相关参考
已知有一个单向循环链表其每个结点中含三个域predata和next其中data为数据域next为指向后继结点的指针域pre也为指
指出以下算法中的错误和低效之处并将它改写为一个既正确又高效的算法 StatusDeleteK(SqList&aintiintk) //本过程从顺序存储结构的线性表a中删除第i个元素
对题的条件作以下两点修改对单链表重新编写求得表C的算法 ()假设在同一表(A或B)中可能存在值相同的元素但要求新生成的表C中的
试写一算法对单链表实现就地逆置 解 //带头结点的单链表的逆置 StatusListOppose_L(LinkList&L) LinkListpq; p=L; p=p>
已知指针la和lb分别指向两个无头结点单链表中的首元结点下列算法是从表la中删除自第i个元素起共len个元素后将它们插入到表lb中第i个元素之前试问此算法是否正确?若有错请改正之 StatusD
要求同题试对单链表编写求C的算法 解 //将AB求交后的结果放在C表中并删除B表 StatusListCross_L(Li
第章 线性表 描述以下三个概念的区别头指针头结点首元结点(第一个元素结点) 解头指针是指向链表中第一个结点的指针首元结点是指链表中存储第一个数据元素的结点头结点是在首元结点之前附设的
已知L是无表头结点的单链表且P结点既不是首元结点也不是尾元结点试从下列提供的答案中选择合适的语句序列 a在P结点后插入S结点的语句序列是__________________ b在P结点前插入S
判断下列各对函数f(n)和g(n)当时n→∞哪个函数增长更快? 试用数学归纳法证明 试写一算法自大至小依次输出顺序读入的三个
已知长度为n的线性表A采用顺序存储结构请写一时间复杂度为(n)空间复杂度为()的算法该算法删除线性表中所有值为item的数据元素(O()表示算法的辅助空间为常量) 【北京航空航天大学五(分)】