当前位置:文档之家› 数据结构1-5章习题

数据结构1-5章习题

一、选择题1、在一个长度为n的顺序表的表尾插入一个新元素的时间复杂度为()A.O (n) B.O (1)C.O (n2 ) D.O (log2 n)2、以下关于顺序存储结构的叙述中,哪一条是不正确的?()A.存储密度大B.逻辑上相邻的节点物理上不必邻接C.可以通过计算机直接确定低I个节点的位置D.插入和删除操作不方便3、向一个有127个元素原顺序表中插入一个新元素并保存原来顺序不变,平均要移动()个元素。

A、8B、63.5C、63D、74、线性表是一个具有n个()的有限序列。

A.表元素B.字符C.数据元素D.数据项5、与数据元素本身的形式、内容、相对位置、个数无关的是数据的()A 存储结构B 逻辑结构C 算法D 操作6、线性链表不具有的特点是()。

A.随机访问B.不必事先估计所需存储空间大小C.插入与删除时不必移动元素D.所需空间与线性表长度成正比7、将长度为n的单链表连接在长度为m的单链表后的算法的时间复杂度为()A. O(n)B. O(1)C. O(m)D. O(m+n)8、链接存储的存储结构所占存储空间:(A)分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针(B)只有一部分,存放结点值(C)只有一部分,存储表示结点间关系的指针(D)分两部分,一部分存放结点值,另一部分存放结点所占单元数9、线性表若采用链式存储结构时,要求内存中可用存储单元的地址:(A)必须是连续的(B)部分地址必须是连续的(C)一定是不连续的(D)连续或不连续都可以10、线性表L在情况下适用于使用链式结构实现。

(A)需经常修改L中的结点值(B)需不断对L进行删除插入(C)L中含有大量的结点(D)L中结点结构复杂11、设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间。

A. 单链表B.单循环链表C. 带尾指针的单循环链表D.带头结点的双循环链表12、若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。

则采用()存储方式最节省运算时间。

A.单链表B.双链表C.单循环链表D.带头结点的双循环链表13、在作进栈运算时,应先判别栈是否( ①),在作退栈运算时应先判别栈是否( ②)。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③)。

①, ②: A. 空B. 满C. 上溢D. 下溢③: A. n-1 B. n C. n+1 D. n/214、为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的( ④)分别设在这片内存空间的两端,这样,当( ⑤)时,才产生上溢。

④: A. 长度 B. 深度 C. 栈顶 D. 栈底⑤: A. 两个栈的栈顶同时到达栈空间的中心点.B. 其中一个栈的栈顶到达栈空间的中心点.C. 两个栈的栈顶在栈空间的某一位置相遇.D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底15、设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行入队操作后其头指针rear的值为()。

A.rear=rear+1B.rear=(rear+1)%(m-1)C.rear=(rear-1)%mD.rear=(rear+1)%m16、栈中元素的进出原则是()。

A.先进先出B.后进先出C.栈空则进D.栈满则出17、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则p i为A.i B.n=i C.n-i+1 D.不确定18、判定一个栈ST(最多元素为m0)为空的条件是A.ST->top<>0 B.ST->top=0 C.ST->top<>m0 D.ST->top=m019、判定一个队列QU(最多元素为m0)为满队列的条件是A.QU->rear -QU->front = = m0B.QU->rear -QU->front -1= = m0C.QU->front = = QU->rearD.QU->front = = QU->rear+120、数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n;(C)n+r-f; (D)(n+r-f)% n21、如下陈述正确的是()A. 串是一种特殊的线性表B. 串的长度必须大于零C. 串中的元素只能为字母D. 空串即为空格字符串22、广义表((a,b,c,d))的表头是(),表尾是()。

A. aB.()C.(a,b,c,d)D.(b,c,d)23、已知广义表LS=((a,b,c),(d,e,f)), 运用head和tail函数取出LS中原子e 的运算是( )。

A. head(tail(LS))B. tail(head(LS))C. head(tail(head(tail(LS)))D. head(tail(tail(head(LS))))二、判断题1、线性表的顺序存储结构是一种随机存储结构。

()(2004年专升本)2、算法的运行时间涉及加、减、乘、除、转移、存、取、等基本运算。

要想准确地计算总运算时间是不可行的。

()3、为度量一个搜索算法的性能,需要在时间和空间方面进行权衡。

()4、顺序表用一维数组作为存储结构,因此顺序表是一维数组。

()5、数据的基本单位是数据项。

()6、数组元素之间的关系,既不是线性的,也不是树形的。

()7、线性表采用顺序存储表示时,必须占用一片连续的存储单元。

()8、链表的每个结点中都恰好包含一个指针。

9、链表的物理存储结构具有同链表一样的顺序。

10、链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动将后续各个单元向前移动。

三、填空题1、算法的五个特征。

2、道路交通问题属于()数据结构。

3、有哪几种逻辑结构()()()()。

4、数据的逻辑结构是从逻辑关系上描述数据,它与数据的()无关,是独立于计算机的。

四、算法设计题1、在非递减有序的顺序表中插入元素e,使其仍保持有序。

Status Orderlistinsert(SqList &L , ElemType e){//在非递减有序的顺序表中插入元素e,使其仍保持有序if (L.length = = MAXSIZE)return ERROR;for( i=L.length-1 ; i>=0 && L.elem[i]>x ; i- - )L.elem [i+1]=L.elem[i]; //元素后移L.elem[i+1]= e ; //插入eL.length ++ ; //表长增加return OK;}2、一个一维整数数组A[m]中有n (n≤m)个非空整数,它们相继存放于数组的前端并已按非递减顺序排列,针对下列情况,分别编写相应的函数。

(1)将数组中所有整数原地逆置,即利用原数组空间将数组中全部元素反转。

void reverse (int A [ ], int n ){}分析:数组的中间元素不动,首尾元素对应互换。

void reverse (int A [ ], int n ) {int mid=n/2 , I, temp ;for ( i=0 ; i<mid ; i++ ){temp=A[i] ; A[i]=A[n-i-1] ;A[n-i-1]=temp ;}}(2)删除数组中多余的值相等的整数(只保留第一次出现的那个整数)。

V oid delDuplicate (int A [ ] , int &n){}分析:定位每一个数组元素,依次扫描其后的元素,遇到值相等的整数就删除,同时n减1。

void delDuplicate (int A [ ] , int & n) {int i=0 , j , k ;while (i<n-1 ) {j = i + 1 ;while (j<n) {if (A[i]= =A[j]) {for ( k=j+1 ; k<n ; k++ ) A[k-1]=A[k] ;n-- ;}else j++;}i++;}}3、int arrange(int a[],int I,int h,int x) //l和h分别为数据区的下界和上界{ int i,j,t;i=l;j=h;while(i<j){while(i<j && a[j]>=x ) j--;while(i<j && a[i]<x ) i++;if(i<j){t=a[j];a[j]=a[i];a[i]=t;}}if(a[i]<x) return i;else return -1;}(1)写出该函数的功能。

(2)写出一个调用上述函数实现下列功能算法:对一整数数组b[n]中的元素进行重新排列,将所有负数均调整到数组的低下标端,若有零值,这置于两者之间,并返回数组中零元素的个数。

(1)分析:对数组a[l..h]进行重新排列,小于x的元素移动到数组的低下标端,大于等于x的元素移动到高下标端;同时统计数组中小于x的元素的个数(返回值+1)。

arrange函数作用:调整数组a[]中元素并返回分界值i,使得<x的元素分布在a[l..i]上,>=x的元素分布在a[i+1..h]上。

(2)int f(int b[], int n){ int j ,k;j=arrange(b,0,n-1,0);k=arrange(b,j+1,n-1,1);return k-j;}或:int f(int b[], int n){ int j ,k;j=arrange(b,0,n-1,1);k=arrange(b,0,j,0);return j-k;}4、设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C。

要求B表的结点是A表中值小于零的点,而C表中的结点为A表中值大于零的结点。

(链表A的元素类型为整型,要求B、C表可使用A表的结点)void split ( linklist &lb , linklist &lc , linklist la){linklist p = la->next , r , s ;lb = ( linklist ) malloc ( sizeof ( lnode ) );lc = ( linklist ) malloc ( sizeof ( lnode ) );r = lb; s = lc;while ( p != NULL ){ if ( p->data < 0 ) //将结点链入B表中{ r->next=p ; r=r->next ; }else if ( p->data > 0 ) //将结点链入C表中{ s->next=p ; s=s->next ; }p = p ->next;}free ( la );}5、两个带头结点的循环单链表ha和hb,设计一个算法将hb接在ha的后面合并成一个带头结点的单链表hc,要求不再开辟新的空间。

相关主题