(按照自己的情况选作部分习题,不要抄袭)第二章习题顺序存储线性表一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
×2.顺序存储的线性表可以按序号随机存取。
√3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
×4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
√5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
×6.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
√二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( A ) 。
(A) 一个有限序列,可以为空; (B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空; (D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的(A)个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n三填空题1.在顺序表中做插入操作时首先检查___表是否满了______________。
四算法设计题1.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。
试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性。
并且分析算法的时间复杂度。
2.已知一顺序表A,其元素值非递减有序排列,编写一个函数删除顺序表中多余的值相同的元素。
3.编写一个函数,从一给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。
提示:可以先将顺序表中所有值在x~y之间的元素置成一个特殊的值,并不立即删除它们,然后从最后向前依次扫描,发现具有特殊值的元素后,移动其后面的元素将其删除掉。
4.线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R 中的字符按字母字符、数字字符和其它字符的顺序排列。
要求利用原来的存储空间,元素移动次数最小。
(研54)5.线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m个元素和后n个元素进行整体互换。
即将线性表(a1, a2, … , a m, b1, b2, … , b n)改变为:(b1, b2, … , b n , a1, a2, … , a m)。
五上机实习题目约瑟夫环问题约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。
开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。
如此下去,直到所有人全部出列为止。
令n最大值取30。
要求设计一个程序模拟此过程,求出出列编号序列。
package算法设计;importimportimportpublic class YueSeFu {public static void main(String[] args) {Scanner scan = new Scanner;"请输入总人数:");int totalNum = ();"请输入报数的大小:");int cycleNum = ();yuesefu(totalNum, cycleNum);();}public static void yuesefu(int totalNum, int countNum) {v1.0 可编辑可修改链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( D)存储方式最节省运算时间。
(A)单链表(B)双链表(C)单循环链表(D)带头结点的双循环链表5.循环链表的主要优点是( D ) 。
(A)不在需要头指针了(B)已知某个结点的位置后,能够容易找到他的直接前趋(C)在进行插入、删除运算时,能更好的保证链表不断开(D)从表中的任意结点出发都能扫描到整个链表6.下面关于线性表的叙述错误的是( B )。
(A)线性表采用顺序存储,必须占用一片地址连续的单元;(B)线性表采用顺序存储,便于进行插入和删除操作;(C)线性表采用链式存储,不必占用一片地址连续的单元;(D)线性表采用链式存储,不便于进行插入和删除操作;7.单链表中,增加一个头结点的目的是为了(C)。
(A) 使单链表至少有一个结点 (B)标识表结点中首结点的位置(C)方便运算的实现 (D) 说明单链表是线性表的链式存储8.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D)存储方式最节省运算时间。
(A) 单链表 (B) 仅有头指针的单循环链表(C) 双链表 (D) 仅有尾指针的单循环链表9.若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用()存储方式最节省运算时间(C)。
(A) 单链表 (B) 顺序表(C) 双链表 (D) 单循环链表三填空题1.带头结点的单链表H为空的条件是__ H->next == NULL _____。
1.非空单循环链表L中*p是尾结点的条件是___ p->next == L________。
3.在一个单链表中p所指结点之后插入一个由指针f所指结点,应执行s->next=__ p->next ___;和p->next=____s_________的操作。
4.在一个单链表中p所指结点之前插入一个由指针f所指结点,可执行以下操作:s->next=_ p->next _______;p->next=s;t=p->data;p->data=___ s->data ________;s->data=____t_______;四算法设计题1. 已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x 的结点插入到表L中,使得L仍然有序。
并且分析算法的时间复杂度。
package xiti;class Lii{int data;Lii next;public Lii(){data=0;}public Lii(int id){data=id;}public void display(){" ");}}class Lii_2{public Lii first;public Lii_2(){f irst=new Lii();}public boolean isEmpty(){r eturn ==null);}public boolean insert_2(int id){Lii newnode =new Lii(id);Lii p=first;while!=null&& p=;=;=newnode;r eturn true;}public void listdisplay(){L ii p=first;"显示链表:");w hile(p!=null){();p=;}"**************");}}public class L{p ublic static void main(String[] args){Lii_2 s1=new Lii_2();for(int i=1;i<=9;i=i+2){(i);}();(2);();}}时间复杂度:O(elenum)2. 假设有两个已排序的单链表A和B,编写一个函数将他们合并成一个链表C而不改变其排序性。
package xiti1;class link{intdata;假设长度大于1的循环单链表中,既无头结点也无头指针,p为指向该链表中某一结点的指针,编写一个函数删除该结点的前趋结点。
4. 已知两个单链表A和B分别表示两个集合,其元素递增排列,编写一个函数求出A和B 的交集C,要求C同样以元素递增的单链表形式存储。
package xiti;class link {public int data;设有一个双向链表,每个结点中除有prior、data和next域外,还有一个访问频度freq 域,在链表被起用之前,该域其值初始化为零。
每当在链表进行一次Locata(L,x)运算后,令值为x的结点中的freq域增1,并调整表中结点的次序,使其按访问频度的递减序列排列,以便使频繁访问的结点总是靠近表头。
试写一个算法满足上述要求的Locata(L,x)算法。
五上机实习题目1.一元多项式的相加提示:(1)一元多项式的表示问题:对于任意一元多项式:P n(x)= P0+ P1X1+ P2X2+ … + P i X i+ … + P n X n可以抽象为一个由“系数-指数”对构成的线性表,且线性表中各元素的指数项是递增的:P=( ( P0,0), ( P1,1), ( P2,2), … , ( P n,n) )(2 ) 用一个单链表表示上述线性表,结点结构为:{ float coef; /*系数域*/int exp; /*指数域*/struct node *next; /*指针域*/} Ploy Node;package 一元多项式的加法;import 一元多项式的加法.;public class LinkedAdd {public Node add(Elem e1,Elem e2){Node pre=();Node qre=();Node p=;Node q=;Node result=p;while(p!=null && q!=null){if<{pre=p;p=;}else if>{Node temp=;=q;=p;1111q=temp;}else{=+;if==0){=;p=;}else{pre=p;p=;}=;q=;}}if(q!=null){=q;}return result;}public static void main(String[] args) {Elem node1=new Elem();(7,0);(12,3);(2,8);1212(5,12);Elem node2=new Elem();(4,1);(6,3);(2,8);(5,20);(7,28);LinkedAdd l=new LinkedAdd();Node node=(node1, node2);while(node!=null){"coef:"++" exp:"+;node=;}}}package 一元多项式的加法;class Elem{public class Node{public int coef;//系数public int exp;//指数public Node next=null;//下一个节点public Node(){1313coef=0;exp=0;}public Node(int coef,int exp){=coef;=exp;}}public Node first=new Node();public void insert(int coef,int exp){//添加节点Node node=new Node(coef,exp);if(first==null){=node;}else{Node temp=first;while!=null){temp=;}=node;}}public Node getNode(){return first;}1414v1.0 可编辑可修改}1515。