ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:23.79KB ,
资源ID:7261789      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7261789.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构例题剖析.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构例题剖析.docx

1、数据结构例题剖析!对给定关键字序号j(1jn),要求在无序记录A1.n中找到关键字从小到大排在第j位上的记录,写一个算法利用快速排序的划分思想实现上述查找。(要求用最少的时间和最少的空间)例如:给定无序关键字7,5,1,6,2,8,9,3,当j=4时,找到的关键字应是5。int partition(RecType A, int 1, int n)int i=1,j=n;x=Ai.key; i=1; while(ij) while(i=x) j-; if(ij) Ai+=Aj; while(ij & Ai.key=x) i+; if(ij) Aj-=Ai; return i;void Find_

2、j(RecType A,int n,int j) n为数组长度i=partition (A,1,n); while(i!=j) if(ij) i=partition(A,i+1,n); 在后半部分继续进行划分 else i=partition(A,1,i-1); 在前半部分继续进行划分因装填因子为0.7,有7个元素,故哈希表长m=7/0.7=10构造的哈希表如下:散列地址 0 1 2 3 4 5 6 7 8 9关键字 7 14 8 11 30 18 9 比较次数 1 2 1 1 1 3 3答:ASL成功1/7*(1*4+2*1+3*2)=12/7,失败1/7*(3+2+1+2+1+5+4)=1

3、8/7设图的顶点只是编号1n,边的信息是有(用1表示)或无(用0表示),这时可用邻接矩阵表示图的存储结构。请编写算法建立无向图的邻接矩阵的存储结构void creatgraph(int M,int n,int e) /设有n个顶点e条边 int i,j; for (i=1;i=n;i+) for(j=1;j=n;j+) Mij=0; for (i=1;iij;Mij=1; Mji=1;在根指针t所指二叉排序树中递归查找某关键字等于k的数据元素BSTree SearchBST1(BSTree t,keyType k) if(!t|k=t-key) return(t); else if(kkey)

4、 return(SearchBST1(t-lchild,k); else return(SearchBST1(t-rchild,k);写出快速排序中一趟划分的算法。int partition(int R,int s,int t) /s和t是数组的低下标和高下标int i=s,j=t,x=Ri.key; while(ij) while(i=x) j-;Ri=Rj;while(ij & Ri.key=x) i+;Rj=Ri; ri=x;return i; 要求完全利用循环队列中的元素空间,设置一个标志域tag,并以tag的值是0或来区分尾指针和头指针相同时的队列状态是“空”还是“不空”请编写与此结

5、构相对应的出队算法。相关类型定义如下:voidQueueOut(CycQueue cq);if(cq.tag=0) cout队列为空n; else cq.front=( cq.front+1) % m;if(cq.front= cq.rear) cq.tag=0; /空队列!设n是非负整数,下面程序片段的时间复杂度是(O(log2n) )。x=2; while(xlchild); /左子树的深度hr=Height(bt-rchild); /右子树的深度if(hlhr) return(hl+1); /二叉树的深度else return(hr+1); 以二叉链表作为存储结构,试编写求二叉树中叶子数

6、的算法。int LeafCount(BiTree T) if(!T) return 0; /空树没有叶子 else if(!T-lchild & !T-rchild) return 1; /叶子结点 else return LeafCount(T-lchild)+LeafCount(T-rchild);设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红、白、蓝之一。要求重新安排,使得红色砾石在前,白色砾石居中,蓝色砾石居后。对每粒砾石的颜色只能察看一次,且只允许交换操作来调整砾石的位置。void QkSort(rectype r ,int n) /需要两个标识符,2的开始与3的开始

7、int i=0, j=0, k=n-1;while(j=k)if( rj=1) /当前元素是红色ri交换rj; i+; j+; else if( rj=2) j+; /当前元素是白色 else /(rj=3) 当前元素是兰色 rj交换rk; k-; 把十进制n转换为八进制void Convert(int n ) if(n!=0) Convert(n/8); cout n%8 ; 顺序结构线性表A与B的结点关键字为整数。A与B的元素按非递减有序,线性表空间足够大。试给出一种高效算法,将B中元素合到A中,使新的A的元素仍保持非递减有序。高效指最大限度的避免移动元素。template void Un

8、ion(arrList& A,arrList &B) /union是类arrList的友元 int m=A.curLen; int n=B.curLen; /m,n分别为线性表A和B的长度。 int k=m+n-1; /k为结果线性表的工作指针(下标) int i=m-1; int j=n-1; /i,j分别为线性表A和B的工作指针(下标)while (i=0 & j=0) if (A.aListi=B.aListj) A.aListk-=A.aListi-; else A.aListk-=B.aListj-;while (j=0) A.aListk-=B.aListj-; A.curLen=

9、m+n; 已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为item的数据元素。void arrList :DelAll(T item) int i=0,j=curLen-1; /设置数组低、高端指针(下标) while(i=j) while(i=j & aListi!=item) i+; while(i=j & aListj=item) j-; if(ij) aListi+=aListj-; curLen=i; PS:若题目要求元素间相对顺序不变,可用如下语句段:void arrList :DelAll(T item)

10、i=0;j=0; while(jn) if(aListj=item) j+; else Ai+=Aj+; /最后线性表中的元素个数是i。将非递减有序的单链表la和lb合并成新的非递减有序单链表lc,并要求利用原表空间lnkList* Union(lnkList* la, lnkList * lb) /友元函数 Link*pa,*pb,*pc; /分别是是链表la、lb、lc的工作指针 lnkList* lc; lc=la; /lc利用la空间,将lb合并进来 pa=(la-head)-next; (la-head)-next=NULL; pb=(lb-head)-next; (lb-head)

11、-next=NULL;pc=lc-head;while(pa & pb) /la和lb均非空 if(pa-datadata) /la中元素插入lc pc-next=pa; pc=pa; pa=pa-next; else /lb中元素插入lc pc-next=pb; pc=pb; pb=pb-next; if(pa) pc-next=pa; /若pa未到尾,将pc指向pa while(pa-next) pa=pa-next; lc-tail=pa; /修改尾指针 else if(pb) pc-next=pb; /若pb未到尾,将pc指向pb while(pb-next) pb=pb-next;

12、lc-tail=pb; /修改尾指针 delete lb; return(lc);假设一个单循环链表,其结点含有三个域pre、data、next。其中data为数据域;pre为指针域,它的值为空指针(null);next为指针域,它指向后继结点。请设计算法,将此表改成双向循环链表。void SToDouble(LinkedList la) while(la-next-pre=null) la-next-pre=la; la=la-next; 请编写算法将单链表L1拆成二个链表,其中以L1为头的链表保持原来向后的链接,另一个链表的表头为L2,其链接方向与L1相反,L1包含原链表的奇数序号的结点,

13、L2包含原链表的偶数序号的结点。Link * DisUnion(Link * L1, Link * L2) int i=0; Link *p,*s, *tail, * L2=new Link(NULL); L2-next=NULL; 以L2为头指针的空链表 p=L1-next; tail=L1; while(p) i+; if(i%2) tail-next=p; tail=p; p=p-next; else s=p-next; p-next=L2-next; /s储存p的下一个结点 L2-next=p; p=s; /采用头插法逆置偶数序号的结点 tail-next=NULL; 置L1表尾已知p

14、是指向单向循环链表最后一个结点的指针,试编写只包含一个循环的算法,将线性表(a1,an)改造为(a1,an-1,an, an-1,a1)Link* CyclInsert(Link* p) q=p-next; /q指向a1结点,工作指针 t=new Link(NULL); t-data=q-data; t-next=p-next; r=t; /r记住a1结点的指针 p-next=t; q=q-next; while(q!=p) t=new Link(NULL); t-data=q-data; t-next=p-next; p-next=t; q=q-next; p=r; return p;设ha

15、和hb分别是两个带头结点的非递减有序单链表的头指针, 将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,表中无重复数据。Link* Union(Link *ha, Link *hb) pa=ha-next; pb=hb-next; ha-next=null; /ha作结果链表的头指针,先将结果链表初始化为空 while(pa & pb) while(pa-next & pa-data=pa-next-data) u=pa-next;pa-next=u-next;delete u; while(pb-next & pb-data=pb-next-data) u=pb-next;

16、pb-next=u-next; delete u; if(pa-datadata) /头插法,逆序建新表 r=pa-next; /将pa 的后继结点暂存于r pa-next=ha-next; ha-next=pa; pa=r; /恢复pa为当前待比较结点 else if(pb-datadata) r=pb-next; /将pb 的后继结点暂存于r pb-next=ha-next; ha-next=pb; pb=r; /恢复pb为当前待比较结点 else /删除链表pb和pa中的重复元素 u=pb; pb=pb-next; delete u; if(pa) pb=pa; /避免再对pa写下面的w

17、hile语句 while(pb) while(pb-next & pb-data=pb-next-data) u=pb-next; pb-next=u-next; delete u; r=pb-next; pb-next=ha-next; ha-next=pb; pb=r; /将尚未到尾的表逆置到结果表中,注意也要删除重复元素 return ha;以二叉链表作为存储结构,设计算法交换二叉树中所有结点的左、右子树。void change(BiTree T) if(T!=NULL) change(T-lchild); change(T-rchild); t=T-lchild; T-lchild=T

18、-rchild; T-rchild=t; 以二叉链表作为存储结构,设计算法拷贝二叉树。BiTree copy(BiTree T) BiTree T1; if(T=null) T1=null; else T1=(BiTree)malloc(sizeof(BiNode); /申请结点 T1-data=T-data; T1-lchild=copy(T-lchild); T1-rchild=copy(T-rchild); return T1; !单链表的逆置template /单链表的元素类型为Tvoid lnkList : invert()/逆置单链表 Link *p=head-next, *r;

19、/p为工作指针,指向第一个元素 head-next=NULL; /保留第一个元素的指针后,将头结点的指针域置空 tail=p; while(p!=NULL) /将原链表的元素按头插法插入 r=p-next; /暂存p的后继 p-next=head-next; /逆置(头插法插入) head-next=p; /头结点的指针域指向新插入的结点 p=r; /恢复待处理结点 !已知一个带有表头结点的单链表,结点结构为(data,link),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的da

20、ta域的值,并返回1;否则,只返回0,int SearchInvK(const int k) /在单链表la上查找倒数第k个结点 p=list-link; /p指向当前待处理元素 q=list; /若成功,q指向倒数第k个元素 i=1; while(p & ilink; if(p=null) coutlink; p=p-link; cout“倒数第k个元素的data域:”datanext; Q= B-next; num= 0; while (P!=NULL) & (Q!=NULL) switch case P-datadata: P= P-next; num= num+1; break; ca

21、se P-dataQ-data: Q= Q-next; break; case P-data=Q-data: P= P-next; Q= Q-next ; break; while (P!=NULL) num= num+1; P= P-next; judge = num=0; if (num!=0 ) cout”Number of elements that is in A but not in B =” 1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移P(0Pn)个位置, 即将R中的数据由(X0,X1,Xn-1)变换为(Xp,Xp+1,X

22、n-1,X0,X1,Xp-1)。(1)给出算法的基本设计思想。(2)根据设计思想,采用C 或C+或JAVA 语言描述算法,关键之处给出注释。(3)说明你所设计算法的时间复杂度和空间复杂度。 (1)算法设计思想:按照下标0到p-1、p到n-1、0到n-1的顺序,将这三段分别逆置,最后的结果即为所求。 (2) void leftshift(int R, int p, int n)elemtype t; /t和数组R中的元素具有相同类型 for(i=0;ip/2;i+) /逆置0.p-1段 t=Ri; Ri=Rp-1-i; Rp-1-i=t;For(i=p;i(n+p)/2;i+) /逆置p.n-1

23、段 t=Ri; Ri=Rn-1-i+p;Rn-1-i+p=t;for(i=0;in/2;i+) /逆置0.n-1段,即整个数组逆置 t=Ri; Ri=Rn-1-i; Rn-1-i=t; (3)算法执行了两趟逆置,时间复杂度为O(n);用了一个辅助变量空间,空间复杂度为O(1)。讨论:若采用直接左移p位,空间复杂度仍为O(1),但时间复杂度为O(np)。!在一个设la是带头结点的双向链表的指针,其结点中除有prior,data和next外,还有一访问频度域freq,其值在链表初始使用时为0。当在链表中进行ListLocate(la,x)运算时,若查找失败,则在表尾插入值为x的结点;若查找成功,值

24、为x的结点的freq值增1,并要求链表按freq域值非增(递减)的顺序排列,且最近访问的结点排在频度相同的结点的后面,使频繁访问的结点总是靠近表头。试编写符合上述要求的ListLocate(la,x)运算的算法,返回找到结点的指针。Dlink * ListLocate(Dlink * La,T x)Dlink * p=La-next, *q=La; while(p & p-data!=x) q=p; p=p-next; if(!p) printf(“不存在所查结点,现插入之n”); s=new Link; s-data=x; s-freq=0; 插入值为x的结点 s-next=p; s-prior=q; q-next=s; p=s; 返回p结点; else p-freq+; 令元素值为x的结点的freq域加1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1