联大学堂《数据结构(河南理工大学)》题库及答案
联大学堂《数据结构(河南理工大学)》题库及答案
1.设二叉树以二叉链表的形式存储,有关类型定义如下: typedef struct BiTNode { // 结点结构 int data; struct BiTNode *lchild, *rchild; // 左右孩子指针 } BiTNode, *BiTree; 下面是求二叉树上叶子结点个数的类()C算法,请填空。 int Leaf()number ( BiTree T ) //T是树的根结点的指针 { } // Leaf()number
正确答案:if|else
2.Tw状态的含义。
正确答案:存储器|8284A|Tw|READY|总线周期
3.假设线性表的顺序存储结构类型定义如下: typedef int ElemType ; typedef struct { ElemType *elem; // 存储空间基址 int length; // 线性表当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) } SqList; 下面类()C算法的功能是:将顺序存储的非空线性表L中值最大的元素取出插在第一个元素前的类()C算法,例如:对于线性表(20,3,6,18,45,22,47,23),操作的结果是:(47,20,3,6,18,45,22,23),请填空。(注:假设线性表中的元素各不相同,必要处写出注释) void Sq()Max()Insert(SqList &;L)//L为顺序存储的非空线性表 { } // Sq()Max()Insert
正确答案:for|if
4.8088和8086的比较
正确答案:CPU|指令队列|外部数据总线|引脚特性|周期状态信号
5.编写算法,对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求: ① 采用顺序存储结构,至多使用一个记录的辅助存储空间; ② 算法的时间复杂度为O(n)。
正确答案:void process (int
A.n]){ low = 0; high = n-1; while ( low0) high++; if (low
6.已知栈的顺序存储结构定义如下: typedef int SElemType ; typedef struct { SElemType *base; // 栈底指针 SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 } SqStack; 下面是依次弹出栈中的所有元素、并逐个输出的类C()算法,操作的结果使栈变成空栈,请填空。(在必要处写出注释) void Pop()Print()Sq(SqStack &;S) { }// Pop()Print()Sq
正确答案:while|printf
7.设二叉树以二叉链表的形式存储,有关类型定义如下: typedef struct BiTNode { // 结点结构 int data; struct BiTNode *lchild, *rchild; // 左右孩子指针 } BiTNode, *BiTree; 下面是求二叉树上各结点值的和的类()C算法,请填空。 int Sum()value( BiTree T ) //T是二叉树的根结点的指针 { } // Sum()value
正确答案:if|else
8.)已知单链表中结点结构定义如下: typedef int ElemType ; typedef struct LNode { ElemType data; struct LNode *next; } LNode, *Linklist 下面是将带头结点的单链有L中值为x的元素全部删除的类()C算法,例如:如果线性表为(20,3,6,18,45,22,18,23),x=18,则操作的结果是:(20,3,6, 45,22,23),请填空。(必要处写出注释) void del()linklist()x ( Linklist &;L ,int x)//L为一个带头结点的非空单链表的头指针 { } // del()linklist()x
正确答案:while|else
9.假设一棵平衡二叉树的每个结点都表明了平衡因子b,试设计一个算法,求平衡二叉树的高度。
正确答案:int Height(BSTree t) // 求平衡二叉树t的高度 {level=0;p=t; while(p) {level++; // 树的高度增1 if(p->bf<0)p=p->rchild;//bf=-1 沿右分枝向下 //bf是平衡因子,是二叉树t结点的一个域,因篇幅所限,没有写出其存储定义 else p=p->lchild; //bf>=0 沿左分枝向下 }//while return (level);//平衡二叉树的高度 } //算法结束
10.有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)。
正确答案:typedef struct node { ElemType data; struct node *prior,*next; }node,*DLinkedList; void TwoWayBubbleSort(DLinkedList la) //对存储在带头结点的双向链表la中的元素进行双向起泡排序。 {int exchange=1; // 设标记 DLinkedList p,temp,tail; head=la //双向链表头,算法过程中是向下起泡的开始结点 tail=null; //双向链表尾,算法过程中是向上起泡的开始结点 while (exchange) {p=head->next; //p是工作指针,指向当前结点 exchange=0; //假定本趟无交换 while (p->next!=tail) // 向下(右)起泡,一趟有一最大元素沉底 if (p->data>p->next->data) //交换两结点指针,涉及6条链 {temp=p->next; exchange=1;//有交换 p->next=temp->next;temp->next->prior=p //先将结点从链表上摘下 temp->next=p; p->prior->next=temp; //将temp插到p结点前 temp->prior=p->prior; p->prior=temp; } else p=p->next; //无交换,指针后移 tail=p; //准备向上起泡 p=tail->prior; while (exchange &;&; p->prior!=head) //向上(左)起泡,一趟有一最小元素冒出 if (p->dataprior->data) //交换两结点指针,涉及6条链 {temp=p->prior; exchange=1; //有交换 p->prior=temp->prior;temp->prior->next=p; //先将temp结点从链表上摘下 temp->prior=p; p->next->prior=temp; //将temp插到p结点后(右) temp->next=p->next; p->next=temp; } else p=p->prior; //无交换,指针前移 head=p; //准备向下起泡 }// while (exchange) } //算法结束
11.试以单链表为存储结构,实现简单选择排序算法
正确答案:void LinkedListSelectSort(LinkedList head) //本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;若要交换指针,则须记下 //当前结点和最小结点的前驱指针 p=head->next; while(p!=null) {q=p->next; r=p; //设r是指向关键字最小的结点的指针 while (q!=null) {if(q->datadata) r=q; q:=q->next; } if(r!=p) r->data<-->p->data; p=p->next; }
12.m阶B-树的非叶结点至少有m/2 (m为偶数)或m/2+1(m为奇数)棵子树。
A.正确
B.错误
正确答案:对
13.利用8255A(端口地址为60H~63H)与打印机相连,完成打印控制功能。8255A的A口作为数据口与打印机连接,采用向量中断方式(连接到8259的IR5)完成工作。设与打印机的连接信号仅有STB#和BUSY两个;8259端口地址为20H~21H,且8259的初始化已经由BIOS程序完成,其ICW2为0AH;8255芯片译码采用74LS138芯片完成。 1、画出连接电路原理图和译码电路图,并说明设计思路。 2、编写完整的打印驱动程序。
正确答案:PU输出数据|8255A|输出端口|选通信号|请求信号INTR
14.设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。
正确答案:void QkSort(rectype r[],int n) { // r为含有n个元素的线性表,元素是具有红、白和兰色的砾石,用顺序存储结构存储, //本算法对其排序,使所有红色砾石在前,白色居中,兰色在最后。 int i=1,j=1,k=n,temp; while (k!=j){ while (r[k].key==3) k--;// 当前元素是兰色砾石,指针左移 if (r[k].key==1) // 当前元素是红色砾石 if (i>=j){temp=r[k];r[k]=r[i];r[i]=temp; i++;} //左侧只有红色砾石,交换r[k]和r[i] else {temp=r[j];r[j]=r[i];r[i]=temp; j++; //左侧已有红色和白色砾石,先交换白色砾石到位 temp=r[k];r[k]=r[i];r[i]=temp; i++; //白色砾石(i所指)和待定砾石(j所指) } //再交换r[k]和r[i],使红色砾石入位。 if (r[k].key==2) if (i<=j) { temp=r[k];r[k]=r[j];r[j]=temp; j++;} // 左侧已有白色砾石,交换r[k]和r[j] else { temp=r[k];r[k]=r[i];r[i]=temp; j=i+1;} //i、j分别指向红、白色砾石的后一位置 }//while if (r[k]==2) j++; /* 处理最后一粒砾石 else if (r[k]==1) { temp=r[j];r[j]=r[i];r[i]=temp; i++; j++; } //最后红、白、兰色砾石的个数分别为: i-1;j-i;n-j+1 }//结束QkSor算法
15.分别写出在散列表中插入和删除关键字为K的一个记录的算法,设散列函数为H,解决冲突的方法为链地址法。
正确答案:bool insert(){ int data; cin>>data; int
A.t=hash(data); LinkList p=HT[ant]; //初始化散列表 while (p->next){ if(p->next->data==data) return false; p=p->next; } //找到插入位置 LinkList s; s=new LNode; s->data=data; s->next=p->next; p->next=s; //插入该结点 return true; } bool deletes(){ int data; cin>>data; int
A.t=hash(data); LinkList p=HT[ant]; //初始化散列表 while (p->next){ if(p->next->data==data){ LinkList s=p->next; p->next=s->next; delete s; //删除该结点 return true; } //找到删除位置 p=p->next; //遍历下一个结点 } return false; }
16.设无向图G中有n个顶点e条边,所有顶点的度数之和为m,则e和m有()关系。
正确答案:m=2e
17.有一种简单的排序算法,叫做计数排序。这种排序算法对一个待排序的表进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键字互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字小。假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序表中的合适的存放位置即为c。 ① 给出适用于计数排序的顺序表定义; ② 编写实现计数排序的算法; ③ 对于有n个记录的表,关键字比较次数是多少? ④ 与简单选择排序相比较,这种方法是否更好?为什么?
正确答案:① typedef struct {int key; datatype info }RecType ② void CountSort(RecType
A.],b[],int n) //计数排序算法,将a中记录排序放入b中 {for(i=0;i
18.快速排序是最好的一程排序方法
A.正确
B.错误
正确答案:错
19.设一组初始记录关键字为(72,73,71,23,94,16,5),则以记录关键字72为基准的一趟快速排序结果为
正确答案:(5,16,71,23,72,94,73)
20.借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[l.n]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。请简要说明算法思想并编写算法。
正确答案:int index (RecType R[],int l,h,datatype key) {int i=l,j=h; while (ikey) j--; if (R[j].key==key) return j; while (i<=j &;&; R[i].key
21.已知二叉树T的结点形式为(lling,data,count,rlink),在树中查找值为X的结点,若找到,则记数(count)加1,否则,作为一个新结点插入树中,插入后仍为二叉排序树,写出其非递归算法。
正确答案:void SearchBST(BiTree &;T,int target){ BiTree s,q,f; //以数据值target,新建结点s s=new BiTNode; s->data.x=target; s->data.count=0; s->lchild=s->rchild=NULL; if(!T){ T=s; return ; } //如果该树为空则跳出该函数 f=NULL; q=T; while (q){ if (q->data.x==target){ q->data.count++; return ; } //如果找到该值则计数加一 f=q; if (q->data.x>target) //如果查找值比目标值大,则为该树左孩子 q=q->lchild; else //否则为右孩子 q=q->rchild; } //将新结点插入树中 if(f->data.x>target) f->lchild=s; else f->rchild=s; }
22.试写出折半查找的递归算法。
正确答案:int BinSrch(rectype r[ ],int k,low,high) //在长为n的有序表中查找关键字k,若查找成功,返回k所在位置,查找失败返回0。 {if(low≤high) //low和high分别是有序表的下界和上界 {mid=(low+high)/2; if(r[mid].key==k)return (mid); else if(r[mid].key>k)return (BinSrch(r,k,mid+1,high)); else return (BinSrch(r,k,low,mid-1)); } else return (0);//查找失败。 }//算法结束
23.已知二叉排序树采用二叉链表存储结构,根结点的指针为T,链结点的结构为(lchild,data,rchild),其中lchild,rchild分别指向该结点左、右孩子的指针,data域存放结点的数据信息。请写出递归算法,从小到大输出二叉排序树中所有数据值>=x的结点的数据。要求先找到第一个满足条件的结点后,再依次输出其他满足条件的结点。
正确答案:void Print(BSTree t) // 中序输出以t为根的二叉排序树的结点 {if(t){Print(t->lchild); Coutdatarchild;//沿右分枝找第一个值≥x的结点 bst=p; //bst所指结点是值≥x的结点的树的根 if(p) {f=p; p=p->lchild ;//找第一个值data≥x)//沿左分枝向下,找第一个值lchild ;} //f是p的双亲结点的指针,指向第一个值≥x的结点 if(p) f->lchild=null; //双亲与找到的第一个值
24.对22个记录的有序表作折半查找,查找失败时,至少需要比较()个关键字。
正确答案:4
25.分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: ① 增加一个新顶点v,InsertVex(G, v); ② 删除顶点v及其相关的边,DeleteVex(G, v); ③ 增加一条边,InsertArc(G, v, w); ④ 删除一条边,DeleteArc(G, v, w)。
正确答案:假设图G为有向无权图,以邻接矩阵作为存储结构四个算法分别如下: ① 增加一个新顶点v Status Insert()Vex(MGraph &;G, char v)//在邻接矩阵表示的图G上插入顶点v { if(G.vexnum+1)>MAX()VERTEX()NUM return INFEASIBLE; G.vexs[++G.vexnum]=v; return OK; }//Insert()Vex ② 删除顶点v及其相关的边, Status Delete()Vex(MGraph &;G,char v)//在邻接矩阵表示的图G上删除顶点v { n=G.vexnum; if((m=LocateVex(G,v))<0) return ERROR; G.vexs[m]<->G.vexs[n]; //将待删除顶点交换到最后一个顶点 for(i=0;i Status Insert()
A.c(MGraph &;G,char v,char w)//在邻接矩阵表示的图G上插入边(v,w) { if((i=LocateVex(G,v))<0) return ERROR; if((j=LocateVex(G,w))<0) return ERROR; if(i==j) return ERROR; if(!G.arcs[j].adj) { G.arcs[j].adj=1; G.arcnum++; } return OK; }//Insert()
A.c ④ 删除一条边 Status Delete()
A.c(MGraph &;G,char v,char w)//在邻接矩阵表示的图G上删除边(v,w) { if((i=LocateVex(G,v))<0) return ERROR; if((j=LocateVex(G,w))<0) return ERROR; if(G.arcs[j].adj) { G.arcs[j].adj=0; G.arcnum--; } return OK; }//Delete()A.c 以邻接表作为存储结构,本题只给出Insert()A.c算法.其余算法类似。 Status Insert()A.c(ALGraph &;G,char v,char w)//在邻接表表示的图G上插入边(v,w) { if((i=LocateVex(G,v))<0) return ERROR; if((j=LocateVex(G,w))<0) return ERROR; p=newA.cNode; p->adjvex=j;p->nextarc=NULL; if(!G.vertices.firstarc) G.vertices.firstarc=p; else { for(q=G.vertices.firstarc;q->q->nextarc;q=q->nextarc) if(q->adjvex==j) return ERROR; //边已经存在 q->nextarc=p; } G.arcnum++; return OK; }//Insert()A.c
26.设一棵二叉树的中序遍历序列为BDCA,后序遍历序列为DBAC,则这棵二叉树的先序遍历序列为()。
正确答案:CBDA
27.计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
正确答案:int Width(BiTree bt)//求二叉树bt的最大宽度 {if (bt==null) return (0); //空二叉树宽度为0 else {BiTree Q[];//Q是队列,元素为二叉树结点指针,容量足够大 front=1;rear=1;last=1; //front队头指针,rear队尾指针,last同层最右结点在队列中的位置 temp=0; maxw=0; //temp记局部宽度, maxw记最大宽度 Q[rear]=bt; //根结点入队列 while(front<=last) {p=Q[front++]; temp++; //同层元素数加1 if (p->lchild!=null) Q[++rear]=p->lchild; //左子女入队 if (p->rchild!=null) Q[++rear]=p->rchild; //右子女入队 if (front>last) //一层结束, {last=rear; if(temp>maxw) maxw=temp; //last指向下层最右元素, 更新当前最大宽度 temp=0; }//if }//while return (maxw); }//结束width
28.试找出满足下列条件的二叉树 ① 先序序列与后序序列相同 ②中序序列与后序序列相同 ③ 先序序列与中序序列相同 ④中序序列与层次遍历序列相同
正确答案:先序遍历二叉树的顺序是“根―左子树―右子树”,中序遍历“左子树―根―右子树”,后序遍历顺序是:“左子树―右子树�D根",根据以上原则有 ① 或为空树,或为只有根结点的二叉树 ② 或为空树,或为任一结点至多只有左子树的二叉树. ③ 或为空树,或为任一结点至多只有右子树的二叉树. ④ 或为空树,或为任一结点至多只有右子树的二叉树
29.由树转化成二叉树,该二叉树的右子树不一定为空。
A.正确
B.错误
正确答案:错
30.以二叉链表作为二叉树的存储结构,编写以下算法: (1)统计二叉树的叶结点个数。
正确答案:int LeafNodeCount(BiTree T) { if(T==NULL) return 0; //如果是空树,则叶子结点个数为0 else if(T->lchild==NULL&;&;T->rchild==NULL) return 1; //判断结点是否是叶子结点(左孩子右孩子都为空),若是则返回1 else return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild); }
31.设计一个算法,求图G中距离顶点v的最短路径长度最大的一个顶点,设v可达其余各个顶点。
正确答案:int ShortestPath()MAX(AMGraph G, int v0){ //用Dijkstra算法求距离顶点v0的最短路径长度最大的一个顶点m n=G.vexnum; //n为G中顶点的个数 for(v = 0; v
32.试写一个判别给定二叉树是否为二叉排序树的算法。
正确答案:#define true 1 #define false 0 typedef struct node {datatype data; struct node *lchild,*rchild;} *BTree; void JudgeBST(BTree T,int flag) // 判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。 { if(T!=null &;&; flag) { Judgebst(T->lchild,flag);// 中序遍历左子树 if(pre==null)pre=T;// 中序遍历的第一个结点不必判断 else if(pre->datadata)pre=T;//前驱指针指向当前结点 else{flag=flase;} //不是完全二叉树 Judgebst (T->rchild,flag);// 中序遍历右子树 }//JudgeBST算法结束
33.输出二叉树中从每个叶子结点到根结点的路径。
正确答案:void A.lPath(BTNode *b,ElemType path[],int pathlen) {int i; if (b!=NULL) {if (b->lchild==NULL &;&; b->rchild==NULL) //*b为叶子结点 {cout << " " << b->data << "到根结点路径:" << b->data; for (i=pathlen-1;i>=0;i--) cout << endl; } else {path[pathlen]=b->data; //将当前结点放入路径中 pathlen++; //路径长度增1 A.lPath(b->lchild,path,pathlen); //递归扫描左子树 A.lPath(b->rchild,path,pathlen); //递归扫描右子树 pathlen--; //恢复环境 } }// if (b!=NULL) }//算法结束
34.对连通图进行深度优先遍历可以访问到该图中的所有顶点。
A.正确
B.错误
正确答案:对
35.设任意n个整数存放于数组A(1:n)中,试编写算法,将所有正数排在所有负数前面(要求算法复杂度为0(n))。
正确答案:void A.range(int A.],int n) //n个整数存于数组A中,本算法将数组中所有正数排在所有负数的前面 {int i=0,j=n-1,x; //用类C编写,数组下标从0开始 while(i0) i++; while(i
36.设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。
正确答案:void DoubleTraverse(BiTree T) { if(T == NULL) return; else if(T->lchild==NULL&;&;T->rchild==NULL) coutlchild); //递归遍历左子树 coutrchild); //递归遍历右子树 } }
37.判别两棵树是否相等。
正确答案:int compareTree(TreeNode* tree1, TreeNode* tree2) //用分治的方法做,比较当前根,然后比较左子树和右子树 {bool tree1IsNull = (tree1==NULL); bool tree2IsNull = (tree2==NULL); if(tree1IsNull != tree2IsNull) { return 1; } if(tree1IsNull &;&; tree2IsNull) {//如果两个都是NULL,则相等 return 0; }//如果根节点不相等,直接返回不相等,否则的话,看看他们孩子相等不相等 if(tree1->c != tree2->c) { return 1; } return (compareTree(tree1->left,tree2->left)&;compareTree(tree1->right,tree2->right)) (compareTree(tree1->left,tree2->right)&;compareTree(tree1->right,tree2->left)); }//算法结束
38.一个连通图采用邻接表作为存储结构,设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程。
正确答案:Void DFSn(Graph G,int v) { //从第v个顶点出发非递归实现深度优先遍历图G Stack s; SetEmpty(s); Push(s,v); While(!StackEmpty(s)) { //栈空时第v个顶点所在的连通分量已遍历完 Pop(s,k); If(!visited[k]) { visited[k]=TRUE; VisitFunc(k); //访问第k个顶点 //将第k个顶点的所有邻接点进栈 for(w=FirstAdjVex(G,k);w;w=NextAdjVex(G,k,w)) { if(!visited[w]&;&;w!=GetTop(s)) Push(s,w); //图中有环时w==GetTop(s) } } }
39.采用邻接表存储结构,编写一个算法,判别无向图中任意给定的两个顶点之间是否存在一条长度为为k的简单路径。
正确答案:int visited[MAXSIZE]; int exist()path()len(ALGraph G,int i,int j,int k) //判断邻接表方式存储的有向图G的顶点i到j是否存在长度为k的简单路径 {if(i==j&;&;k==0) return 1; //找到了一条路径,且长度符合要求 else if(k>0) {visited[i]=1; for(p=G.vertices[i].firstarc;p;p=p->nextarc) {l=p->adjvex; if(!visited[l]) if(exist()path()len(G,l,j,k-1)) return 1; //剩余路径长度减一 }//for visited[i]=0; //本题允许曾经被访问过的结点出现在另一条路径中 }//else return 0; //没找到 }//exist()path()len
40.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。
正确答案:int Level(BiTree bt) //层次遍历二叉树,并统计度为1的结点的个数 {int num=0; //num统计度为1的结点的个数 if(bt){QueueInit(Q); QueueIn(Q,bt);//Q是以二叉树结点指针为元素的队列 while(!QueueEmpty(Q)) {p=QueueOut(Q); coutlchild &;&; !p->rchild||!p->lchild &;&; p->rchild)num++; //度为1的结点 if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入队 if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入队 } // while(!QueueEmpty(Q)) }//if(bt) return(num); }//返回度为1的结点的个数
41.试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。
正确答案:int visited[MAXSIZE]; //指示顶点是否在当前路径上 int level=1;//递归进行的层数 int exist()path()DFS(ALGraph G,int i,int j)//深度优先判断有向图G中顶点i到顶点j 是否有路径,是则返回1,否则返回0 { if(i==j) return 1; //i就是j else { visited[i]=1; for(p=G.vertices[i].firstarc;p;p=p->nextarc,level--) { level++; k=p->adjvex; if(!visited[k]&;&;exist()path(k,j)) return 1;//i下游的顶点到j有路径 }//for }//else if (level==1) return 0; }//exist()path()DFS
42.交换二叉树每个结点的左孩子和右孩子。
正确答案:void ChangeLR(BiTree &;T) { BiTree temp; if(T->lchild==NULL&;&;T->rchild==NULL) return; else { temp = T->lchild; T->lchild = T->rchild; T->rchild = temp; }//交换左右孩子 ChangeLR(T->lchild); //递归交换左子树 ChangeLR(T->rchild); //递归交换右子树 }
43.二维数组S,行下标i从0到7,列下标j从0 到9,每个元素占3个字节,若从首地址S开始以列序为主序将元素连续存放在存储器内,则元素S [4][7]的起始地址为()。
正确答案:S+180
44.写一个递归算法来实现字符串逆序存储,要求不另设串存储空间。
正确答案:void InvertStore(char A.]) //字符串逆序存储的递归算法。 {char ch; static int i = 0;//需要使用静态变量 cin>>ch; if (ch!= '.') //规定'.'是字符串输入结束标志 {InvertStore(A);A.i++] = ch;//字符串逆序存储 }A.i] = '\0'; //字符串结尾标记 }
45.求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
正确答案:void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度 {BiTree p=bt,l[],s[]; //l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点 int i,top=0,tag[],longest=0; while(p||top>0) {while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下 if(tag[top]==1) //当前结点的右分枝已遍历 {if(!s[top]->Lc &;&; !s[top]->Rc) //只有到叶子结点时,才查看路径长度 if(top>longest) {for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;} //保留当前最长路径到l栈,记住最高栈顶指针,退栈 } else if(top>0) {tag[top]=1; p=s[top].Rc;} //沿右子分枝向下 }//while(p!=null||top>0) }//结束LongestPath
46.编写算法,实现下面函数的功能。函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)
正确答案:void insert(char *s,char *t,int pos) //将字符串t插入字符串s的第pos个位置。 {int i=1,x=0; char *p=s,*q=t; //p,q分别为字符串s和t的工作指针 if(pos<1) {cout<<“pos参数位置非法”<=pos ;j--){*(p+x)=*p; p--;}//串s的pos后的子串右移,空出串t的位置。 q--; //指针q回退到串t的最后一个字符 for(j=1;j<=x;j++) *p--=*q--; //将t串插入到s的pos位置上
47.数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求: ① 存放该数组所需多少单元? ② 存放数组第4列所有元素至少需多少单元? ③ 数组按行存放时,元素A[7,4]的起始地址是多少? ④ 数组按列存放时,元素A[4,7]的起始地址是多少?
正确答案:每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。 (1)242 (2)22 (3)s+182 (4)s+142
48.已知字符串S1中存放一段英文,写出算法format(s1,s2,s3,n),将其按给定的长度n格式化成两端对齐的字符串S2, 其多余的字符送S3。
正确答案:void format (char *s1,*s2,*s3) //将字符串s1拆分成字符串s2和字符串s3,要求字符串s2是长n且两端对齐 {char *p=s1, *q=s2; int i=0; while(*p!= '\0' &;&; *p== ' ') p++;//滤掉s1左端空格 if(*p== '\0') {cout<<"字符串s1为空串或空格串"<
49.设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa” ① 计算模式p的naxtval函数值; ② 不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。
正确答案:① p的nextval函数值为0110132。(p的next函数值为0111232)。 ② 利用KMP(改进的nextval)算法,每趟匹配过程如下:
第一趟匹配:A.caabbabcabaacbacba A.cab(i=5,j=5)
第二趟匹配: A.caabbabcabaacbacba A.c(i=7,j=3)
第三趟匹配: A.caabbabcabaacbacba A.i=7,j=1)
第四趟匹配: A.caabbabcabaac bacba (成功) A.cabaa(i=15,j=8)
50.不论是入队列操作还是入栈操作,在顺序存储结构上都需要考虑“溢出”情况。
正确答案:对
51.已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。
正确答案:模式串t的next和nextval值如下: j 1 2 3 4 5 6 7 8 9 10 11 12 t串
A.b c
A.a b b
A.b c
A.b next[j] 0 1 1 1 2 2 3 1 2 3 4 5 nextval[j] 0 1 1 0 2 1 3 0 1 1 0 5
52.写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。
正确答案:void Count()//统计输入字符串中数字字符和字母字符的个数。 {int i,num[36]; char ch; for(i=0;i<36;i++)num[i]=0;// 初始化 while((ch=getchar())!=‘#’) //‘#’表示输入字符串结束。 if(‘0’<=ch<=‘9’){i=ch-48;num[i]++;} // 数字字符 elseif(‘A’<=ch<=‘Z’){i=ch-65+10;num[i]++;}// 字母字符 for(i=0;i<10;i++) // 输出数字字符的个数 cout<<“数字”<
53.设二维数组a[1.m, 1.n] 含有m*n 个整数。 ① 写一个算法判断a中所有元素是否互不相同?输出相关信息(yes/no); ② 试分析算法的时间复杂度。
正确答案:int JudgEqual(ing A.m][n],int m,n) //判断二维数组中所有元素是否互不相同,如是,返回1;否则,返回0。 {for(i=0;i
54.串是元素类型为字符型的线性表。
A.正确
B.错误
正确答案:对
55.已知f为单链表的表头指针, 链表中存储的都是整型数据,试写出实现下列运算的递归算法: ① 求链表中的最大整数; ② 求链表的结点个数; ③ 求所有整数的平均值。
正确答案:① int GetMax(LinkList p) { if(!p->next) return p->data; else { int max=GetMax(p->next); return p->data>=max? p->data:max; } } ② int GetLength(LinkList p) { if(!p->next) return 1; else { return GetLength(p->next)+1; } } ③ double GetAverage(LinkList p , int n) { if(!p->next) return p->data; else { double
A.e=GetAverage(p->next,n-1); return (ave*(n-1)+p->data)/n; } }
56.从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:234 34+2*$。
正确答案:float expr()//从键盘输入逆波兰表达式,以‘$’表示输入结束,本算法求逆波兰式表达式的值。 {float OPND[30]; // OPND是操作数栈。 init(OPND); //两栈初始化。 float num=0.0; //数字初始化。 cin>>x;//x是字符型变量。 while(x!=’$’) {switch {case‘0’<=x<=’9’: while((x>=’0’&;&;x<=’9’)||x==’.’) //拼数 if(x!=’.’) //处理整数 {num=num*10+(ord(x)-ord(‘0’)); cin>>x;} else //处理小数部分。 {scale=10.0; cin>>x; while(x>=’0’&;&;x<=’9’) {num=num+(ord(x)-ord(‘0’)/scale; scale=scale*10; cin>>x; } }//else push(OPND,num); num=0.0;//数压入栈,下个数初始化 case x=‘ ’:break; //遇空格,继续读下一个字符。 case x=‘+’:push(OPND,pop(OPND)+pop(OPND));break; case x=‘-’:x1=pop(OPND);x2=pop(OPND);push(OPND,x2-x1);break; case x=‘*’:push(OPND,pop(OPND)*pop(OPND));break; case x=‘/’:x1=pop(OPND);x2=pop(OPND);push(OPND,x2/x1);break; default: //其它符号不作处理。 }//结束switch cin>>x;//读入表达式中下一个字符。 }//结束while(x!=‘$’) cout<<“后缀表达式的值为”<
57.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。
正确答案:typedef struct queuenode {Datatype data; struct queuenode *next; }QueueNode; //以上是结点类型的定义 typedef struct {queuenode *rear; }LinkQueue; //只设一个指向队尾元素的指针 (1) 置空队 void InitQueue( LinkQueue *Q) { //置空队:就是使头结点成为队尾元素 QueueNode *s; Q->rear = Q->rear->next;//将队尾指针指向头结点 while (Q->rear!=Q->rear->next)//当队列非空,将队中元素逐个出队 {s=Q->rear->next; Q->rear->next=s->next; delete s; }//回收结点空间 } (2) 判队空 int EmptyQueue( LinkQueue *Q) { //判队空。当头结点的next指针指向自己时为空队 return Q->rear->next->next==Q->rear->next; } (3) 入队 void EnQueue( LinkQueue *Q, Datatype x) { //入队。也就是在尾结点处插入元素 QueueNode *p=new QueueNode;//申请新结点 p->data=x; p->next=Q->rear->next;//初始化新结点并链入 Q-rear->next=p; Q->rear=p;//将尾指针移至新结点 } (4) 出队 Datatype DeQueue( LinkQueue *Q) {//出队,把头结点之后的元素摘下 Datatype t; QueueNode *p; if(EmptyQueue( Q )) Error("Queue underflow"); p=Q->rear->next->next; //p指向将要摘下的结点 x=p->data; //保存结点中数据 if (p==Q->rear) {//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点 Q->rear = Q->rear->next; Q->rear->next=p->next; } else Q->rear->next->next=p->next;//摘下结点p delete p;//释放被删结点 return x; }
58.假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。①下面所示的序列中哪些是合法的?
A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO ②通过对①的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。
正确答案:①A和D是合法序列,B和C 是非法序列。 ②设被判定的操作序列已存入一维数组A中。 int Judge(char
A.]) //判断字符数组A中的输入输出序列是否是合法序列。如是,返回true,否则返回false。 {i=0; //i为下标。 j=k=0; //j和k分别为I和字母O的的个数。 while(A[i]!=‘\0’) //当未到字符数组尾就作。 {switch(A[i]) {case‘I’: j++; break; //入栈次数增1。 case‘O’: k++; if(k>j){cout<<“序列非法”<
59.回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
正确答案:#define StackSize 100 //假定预分配的栈空间最多为100个元素 typedef char DataType;//假定栈元素的数据类型为字符 typedef struct {DataType data[StackSize]; int top; }SeqStack; int IsHuiwen( char *t) {//判断t字符向量是否为回文,若是,返回1,否则返回0 SeqStack s; int i , len; char temp; InitStack( &;s); len=strlen(t); //求向量长度 for ( i=0; i
60.设从键盘输入一整数的序列:a1,
A.,
A.,…,an,试编写算法实现:用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应的信息。
正确答案:#define maxsize 栈空间容量 void InOutS(int s[maxsize]) //s是元素为整数的栈,本算法进行入栈和退栈操作。 {int top=0; //top为栈顶指针,定义top=0时为栈空。 for(i=1; i<=n; i++) //n个整数序列作处理。 {cin>>x); //从键盘读入整数序列。 if(x!=-1) // 读入的整数不等于-1时入栈。 {if(top==maxsize-1){cout<<“栈满”<
61.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
正确答案:(1)初始化 SeQueue QueueInit(SeQueue Q) {//初始化队列 Q.front=Q.rear=0; Q.tag=0; return Q; } (2)入队 SeQueue QueueIn(SeQueue Q,int e) {//入队列 if((Q.tag==1) &;&; (Q.rear==Q.front)) cout<<"队列已满"<
62.如果允许在循环队列的两端都可以进行插入和删除操作。要求: ① 写出循环队列的类型定义; ② 写出“从队尾删除”和“从队头插入”的算法。
正确答案:① #define M 队列可能达到的最大长度 typedef struct {elemtp data[M]; int front,rear; }cycqueue; ② elemtp delqueue ( cycqueue Q) //Q是如上定义的循环队列,本算法实现从队尾删除,若删除成功,返回被删除元素,否则给出出错信息。 {if (Q.front==Q.rear) { cout<<"队列空"<
63.最大容量为n的循环队列,队尾指针是rear,队头是front,若牺牲一个空间不用,则队列满的条件是()。
正确答案:(rear+1)%n==front
64.非空的线性结构中,有且仅有一个元素没有直接前驱。
正确答案:对
65.系统软件通常由()、()、()和()等组成。
正确答案:操作系统、语言处理程序、数据库管理程序、服务程序
66.已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。
正确答案:void Exchange(LinkedList p) ∥p是双向循环链表中的一个结点,本算法将p所指结点与其前驱结点交换。 {q=p->llink; q->llink->rlink=p; ∥p的前驱的前驱之后继为p p->llink=q->llink; ∥p的前驱指向其前驱的前驱。 q->rlink=p->rlink; ∥p的前驱的后继为p的后继。 q->llink=p; ∥p与其前驱交换 p->rlink->llink=q; ∥p的后继的前驱指向原p的前驱 p->rlink=q; ∥p的后继指向其原来的前驱 }∥算法exchange结束。
67.设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
正确答案:void inverse(LinkList &;L) {// 逆置带头结点的单链表 L p=L->next; L->next=NULL; while ( p) { q=p->next; // q指向*p的后继 p->next=L->next; L->next=p; // *p插入在头结点之后 p = q; } }
68.设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
正确答案:ElemType Max (LinkList L ){ if(L->next==NULL) return NULL; pmax=L->next; //假定第一个结点中数据具有最大值 p=L->next->next; while(p != NULL ){//如果下一个结点存在 if(p->data > pmax->data) pmax=p;//如果p的值大于pmax的值,则重新赋值 p=p->next;//遍历链表 } return pmax->data;
69.将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下: Typedef struct {int top[2],bot[2]; //栈顶和栈底指针 SElemType *V; //栈数组 int m; //栈最大可容纳元素个数 }DblStack
正确答案:(1) 栈初始化 int Init(){S.top[0]=-1; S.top[1]=m; return 1; //初始化成功 } (2) 入栈操作: int push(stk S ,int i,int x) ∥i为栈号,i=0表示左栈,i=1为右栈,x是入栈元素。入栈成功返回1,失败返回0 {if(i<0||i>1){ cout<<“栈号输入不对”<1){cout<<“栈号输入错误”<
70.算机安全是指计算机财产的安全。计算机财产包括()和()。
正确答案:系统资源、信息资源
71.设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同 )。
正确答案:void delete(LinkList &;L, int mink, int maxk) { p=L->next; //首元结点 while (p &;&; p->data<=mink) { pre=p; p=p->next; } //查找第一个值>mink的结点 if (p) {while (p &;&; p->datanext; // 查找第一个值 ≥maxk的结点 q=pre->next; pre->next=p; // 修改指针 while (q!=p) { s=q->next; delete q; q=s; } // 释放结点空间 }//if }
72.请将香蕉banana用工具 H()―Head(),T()―Tail()从L中取出。 L=(apple,(orange,(strawberry,(banana)),peach),pear)
正确答案:H(H(T(H(T(H(T(L)))))))
73.下面是删除带头结点的单链表中首元结点的程序片段,L为头指针,则应在空的位置填上 。p=L->next;if(p) { L->next= ; free(p);}
正确答案:p->next
74.设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。
正确答案:void DisCompose(LinkedList
A. { B=A; B->next= NULL; ∥B表初始化 C=new LNode;∥为C申请结点空间 C->next=NULL; ∥C初始化为空表 p=A->next; ∥p为工作指针 while(p!= NULL) { r=p->next; ∥暂存p的后继 if(p->data<0) {p->next=B->next; B->next=p; }∥将小于0的结点链入B表,前插法 else {p->next=C->next; C->next=p; }∥将大于等于0的结点链入C表,前插法 p=r;∥p指向新的待处理结点。 } }
75.已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
正确答案:void Difference(LinkList&; La, LinkList&; Lb,int *n) {∥差集的结果存储于单链表La中,*n是结果集合中元素个数,调用时为0 pa=La->next; pb=Lb->next; ∥pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点 pre=La; ∥pre为La中pa所指结点的前驱结点的指针 while(pa&;&;pb) {if(pa->datadata){pre=pa;pa=pa->next;*n++;} ∥
A.表中当前结点指针后移 else if(pa->data>q->data)q=q->next; ∥B链表中当前结点指针后移 else {pre->next=pa->next; ∥处理A,B中元素值相同的结点,应删除 u=pa; pa=pa->next; delete u;} ∥删除结点 } }
76.已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。
正确答案:void Mix(LinkList&; La, LinkList&; Lb, LinkList&; Lc) { pa=La->next;pb=Lb->next; pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点 Lc=pc=La; //用La的头结点作为Lc的头结点 while(pa&;&;pb) { if(pa->data==pb->data)∥交集并入结果表中。 { pc->next=pa;pc=pa;pa=pa->next; u=pb;pb=pb->next; delete u;} else if(pa->datadata) {u=pa;pa=pa->next; delete u;} else {u=pb; pb=pb->next; delete u;} } while(pa) {u=pa; pa=pa->next; delete u;}∥ 释放结点空间 while(pb) {u=pb; pb=pb->next; delete u;}∥释放结点空间 pc->next=null;∥置链表尾标记。 delete Lb; //释放Lb的头结点 }
77.下面程序段的时间复杂度是()。x=0;for(i=1;i<=n;i=2*i) for(j=1;j<=n;j++) x++;
正确答案:O(nlog2n)
78.已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。
正确答案:void Delete(ElemType
A. ],int n) ∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素。 {i=1;j=n;∥设置数组低、高端指针(下标)。 while(i
79.数据对象
正确答案:是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’, ‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。
80.“计算机辅助制造”的英文缩写是()。
正确答案:CAM
81.抽象数据类型
正确答案:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
82.线性表的顺序存储结构比链式存储结构更好。
A.正确
B.错误
正确答案:错
83.将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。
正确答案:oid MergeList(LinkList&; La, LinkList&; Lb, LinkList&; Lc, ) {//合并链表La和Lb,合并后的新表使用头指针Lc指向 pa=La->next; pb=Lb->next; //pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点 Lc=pc=La; //用La的头结点作为Lc的头结点 Lc->next=NULL; while(pa||pb ) {//只要存在一个非空表,用q指向待摘取的元素 if(!pa) {q=pb; pb=pb->next;} //La表为空,用q指向pb,pb指针后移 else if(!pb) {q=pa; pa=pa->next;} //Lb表为空,用q指向pa,pa指针后移 else if(pa->data<=pb->data) {q=pa; pa=pa->next;} //取较小者(包括相等)La中的元素,用q指向pa,pa指针后移 else {q=pb; pb=pb->next;} //取较小者Lb中的元素,用q指向pb,pb指针后移 q->next = Lc->next; Lc->next = q; //将q指向的结点插在Lc 表的表头结点之后 } delete Lb; //释放Lb的头结点 }
84.将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。
正确答案:void MergeList(LinkList &;La,LinkList &;Lb,LinkList &;Lc) {//合并链表La和Lb,合并后的新表使用头指针Lc指向 pa=La->next; pb=Lb->next; //pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点 Lc=pc=La; //用La的头结点作为Lc的头结点 while(pa &;&; pb) {if(pa->datadata){pc->next=pa;pc=pa;pa=pa->next;} //取较小者La中的元素,将pa链接在pc的后面,pa指针后移 else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;} //取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移 else //相等时取La中的元素,删除Lb中的元素 {pc->next=pa;pc=pa;pa=pa->next; q=pb->next;delete pb ;pb =q; } } pc->next=pa?pa:pb; //插入剩余段 delete Lb; //释放Lb的头结点 }
85.数据结构是相互之间存在一种或多种特定关系的()的集合。
正确答案:数据元素
86.试分析下面各程序段的时间复杂度。for (i=0; i
正确答案:O(m*n)
87.数据项
正确答案:是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。
88.存储结构
正确答案:数据对象在计算机中的存储表示,也称为物理结构。
89.试分析下面各程序段的时间复杂度。i=1; while(i<=n) i=i*3;
正确答案:O(log3n)
90.试分析下面各程序段的时间复杂度。x=0; for(i=1; i
正确答案:O(n2)
91.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。
正确答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继。学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。这些学生记录在计算机中的存储表示就是存储结构。如果用连续的存储单元(如用数组表示)来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。即相同的逻辑结构,可以对应不同的存储结构。
92.从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为()。
A.归并排序
B.冒泡排序
C.插入排序
D.选择排序
正确答案:D
93.试分析下面各程序段的时间复杂度。s=0; for i=0; i
正确答案:O(n2)
94.下列排序方法中,()是稳定的排序方法。
A.希尔排序
B.冒泡排序
C.快速排序
D.归并排序
正确答案:BD
95.试分析下面各程序段的时间复杂度。(1)x=90; y=100; while(y>0) if(x>100) {x=x-10;y--;} else x++;
正确答案:O(1)
96.对n个不同的关键字由小到大进行冒泡排序,在下列()情况下比较的次数最多。
A.从小到大排列好的
B.从大到小排列好的
C.元素无序
D.元素基本有序
正确答案:B
97.对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为()。
A.n+1
B.n
C.n-1
D.n(n-1)/2
正确答案:D
98.快速排序在最坏情况下的时间复杂度为()。
A.O(log2n)
B.O(nlog2n)
C.0(n)
D.0(n2)
正确答案:D
99.为什么计算机内一定要配置端口或接口?
正确答案:I/O设备一般不和微机内部直接相连,而是必须通过I/O接口与微机内部进行信息交换。首先,微机和I/O设备两者的信息类型和格式可能不一样。外设种类繁多,信号类型十分复杂,它既可以是机械式的、电动式的或电子式的,也可以是其他形式的;所使用的信号可以是数字量或模拟量,也可以是开关量;即使是数字量,也可能与微机在信号线的功能定义、逻辑定义上都不一致;必须通过I/O接口实现微机与外部设备的隔离和信号转换。其次,微机和I/O设备信号传输处理的速度往往不匹配,信号时序有很大差别,必须通过I/O接口来进行缓冲和协调。再次,随着计算机技术的发展,I/O设备的种类日益丰富,一台多媒体微机可能要配置数十个I/O设备,若不通过接口,而由CPU直接对I/O设备的操作实施控制,就会使CPU一直忙于与外设打交道,大大降低CPU的效率。 最后,若I/O设备直接由CPU控制,也会使外设的硬件结构依赖于CPU,对外设本身的发展不利。I/O接口的引入,使得CPU对I/O设备的操作转化为对I/O接口的操作。 可见,I/O接口是微机与外部设备之间进行信息交换的中转站,是任何微机应用系统必不可少的重要组成部分。
100.下列关键字序列中,()是堆。
A.16,72,31,23,94,53
B.94,23,31,72,16,53
C.16,53,23,94,31,72
D.16,23,53,31,94,72
正确答案:D
101.堆是一种()排序。
A.插入
B.选择
C.交换
D.归并
正确答案:B
102.下述几种排序方法中,要求内存最大的是()。
A.希尔排序
B.快速排序
C.归并排序
D.堆排序
正确答案:C
103.对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是()。
A.O(n)
B.O(n2)
C.O(nlog2n)
D.O(n3)
正确答案:B
104.若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。
A.79,46,56,38,40,84
B.84,79,56,38,40,46
C.84,79,56,46,40,38
D.84,56,79,40,46,38
正确答案:B
105.快速排序在下列()情况下最易发挥其长处。
A.被排序的数据中含有多个相同排序码
B.被排序的数据已基本有序
C.被排序的数据完全无序
D.被排序的数据中的最大值和最小值相差悬殊
正确答案:C
106.堆的形状是一棵()。
A.二叉排序树
B.满二叉树
C.完全二叉树
D.平衡二叉树
正确答案:C
107.若一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。
A.38,40,46,56,79,84
B.40,38,46,79,56,84
C.40,38,46,56,79,84
D.40,38,46,84,56,79
正确答案:C
108.如果要求一个线性表既能较快的查找,又能适应动态变化的要求,最好采用()查找法。
A.顺序查找
B.折半查找
C.分块查找
D.哈希查找
正确答案:C
109.下面关于B-和B+树的叙述中,不正确的是()。
A.B-树和B+树都是不平衡的多叉树
B.B-树和B+树都可用于文件的索引结构
C.B-树和B+树都能有效地支持顺序检索
D.B-树和B+树都能有效地支持随机检索
正确答案:AC
110.下列排序算法中,()不能保证每趟排序至少能将一个元素放到其最终的位置上。
A.希尔排序
B.快速排序
C.冒泡排序
D.堆排序
正确答案:A
111.数据元素
正确答案:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、结点、记录等。数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
112.下述几种排序方法中,()是稳定的排序方法。
A.希尔排序
B.快速排序
C.归并排序
D.堆排序
正确答案:C
113.从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为()。
A.归并排序
B.冒泡排序
C.插入排序
D.选择排序
正确答案:C
114.数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用()算法最节省时间。
A.冒泡排序
B.快速排序
C.简单选择排序
D.堆排序
正确答案:D
115.对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为()。
A.(n-1)/2
B.n/2
C.(n+1)/2
D.n
正确答案:C
116.适用于折半查找的表的存储方式及元素排列要求为()。
A.链接方式存储,元素无序
B.链接方式存储,元素有序
C.顺序方式存储,元素无序
D.顺序方式存储,元素有序
正确答案:D
117.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()。
A.(100,80, 90, 60, 120,110,130)
B.(100,120,110,130,80, 60, 90)
C.(100,60, 80, 90, 120,110,130)
D.(100,80, 60, 90, 120,130,110)
正确答案:C
118.在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0右孩子的平衡因子为1,则应作()型调整以使其平衡。
A.LL
B.LR
C.RL
D.RR
正确答案:C
119.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。
A.20,70,30,50
B.30,88,70,50
C.20,50
D.30,88,50
正确答案:A
120.对22个记录的有序表作折半查找,当查找失败时,至少需要比较()次关键字。
A.3
B.4
C.5
D.6
正确答案:B
121.存储结构由哪两种基本的存储方法实现?
正确答案:1)顺序存储结构,顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。(2)链式存储结构,顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。所以链式存储结构通常借助于程序设计语言的指针类型来描述。
122.下面关于哈希查找的说法,正确的是()。
A.哈希函数构造的越复杂越好,因为这样随机性好,冲突小
B.除留余数法是所有哈希函数中最好的
C.不存在特别好与坏的哈希函数,要视情况而定
D.哈希表的平均查找长度有时也和记录总数有关
正确答案:C
123.下列关于m阶B-树的说法错误的是()。
A.根结点至多有m棵子树
B.所有叶子都在同一层次上
C.非叶结点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树
D.根结点中的数据是有序的
正确答案:D
124.m阶B-树是一棵()。
A.m叉排序树
B.m叉平衡排序树
C.m-1叉平衡排序树
D.m+1叉平衡排序树
正确答案:B
125.折半搜索与二叉排序树的时间性能()。
A.相同
B.完全不同
C.有时不相同
D.数量级都是O(log2n)
正确答案:C
126.下面关于哈希查找的说法,不正确的是()。
A.采用链地址法处理冲突时,查找一个元素的时间是相同的
B.采用链地址法处理冲突时,若插入规定总是在链首,则插入任一个元素的时间是相同的
C.用链地址法处理冲突,不会引起二次聚集现象
D.用链地址法处理冲突,适合表长不确定的情况
正确答案:A
127.采用线性探测法处理冲突,可能要探测多个位置,在查找成功的情况下,所探测的这些位置上的关键字()。
A.不一定都是同义词
B.一定都是同义词
C.一定都不是同义词
D.都相同
正确答案:A
128.下面关于B-和B+树的叙述中,不正确的是()。
A.B-树和B+树都是平衡的多叉树
B.B-树和B+树都可用于文件的索引结构
C.B-树和B+树都能有效地支持顺序检索
D.B-树和B+树都能有效地支持随机检索
正确答案:C
129.具有n个顶点的有向图最多有()条边。
A.n
B.n(n-1)
C.n(n+1)
D.n2
正确答案:B
130.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。
A.1/2
B.1
C.2
D.4
正确答案:B
131.用邻接表表示图进行广度优先遍历时,通常借助()来实现算法
A.栈
B.队列
C.树
D.图
正确答案:B
132.通常对图进行遍历方法()。
A.深度优先遍历
B.广度优先遍历
C.层次遍历
D.中序遍历
正确答案:AB
133.图的BFS生成树的树高比DFS生成树的树高()。
A.小
B.相等
C.小或相等
D.大或相等
正确答案:C
134.深度优先遍历类似于二叉树的()。
A.英语1(20号16:30-18:30)
B.中序遍历
C.后序遍历
D.层次遍历
正确答案:A
135.广度优先遍历类似于二叉树的()。
A.先序遍历
B.中序遍历
C.后序遍历
D.层次遍历
正确答案:D
136.在一个图中,所有顶点的度数之和等于图的边数的()倍
A.1/2
B.1
C.2
D.4
正确答案:C
137.一个具有1025个结点的二叉树的高h为()。
A.11
B.10
C.11至1025之间
D.10至1024之间
正确答案:C
138.设哈希表长为14,哈希函数是H(key)=key%11,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为49的元素加到表中,用二次探测法解决冲突,则放入的位置是()。
A.8
B.3
C.5
D.9
正确答案:D
139.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250
B.500
C.254
D.501
正确答案:D
140.下面()算法适合构造一个稠密图G的最小生成树。
A.Prim算法
B.Kruskal算法
C.Floyd算法
D.Dijkstra算法
正确答案:A
141.G是一个非连通无向图,共有28条边,则该图至少有()个顶点。
A.7
B.8
C.9
D.10
正确答案:C
142.用邻接表表示图进行深度优先遍历时,通常借助()来实现算法。
A.栈
B.队列
C.树
D.图
正确答案:A
143.深度为h的满m叉树的第k层有()个结点。(1=
A.mk-1
B.mk-1
C.mh-1
D.mh-1
正确答案:A
144.在下述结论中,正确的是()。
A.只有一个结点的二叉树的度为0;
B.二叉树的度为2;
C.二叉树的左右子树可任意交换;
D.深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
正确答案:AD
145.在下列存储形式中,()不是树的存储形式?
A.双亲表示法
B.孩子链表表示法
C.孩子兄弟表示法
D.顺序存储表示法
正确答案:D
146.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()遍历实现编号。
A.先序
B.中序
C.后序
D.从根开始按层次遍历
正确答案:C
147.由3个结点可以构造出多少种不同的二叉树?()
A.2
B.3
C.4
D.5
正确答案:D
148.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。
A.所有的结点均无左孩子
B.所有的结点均无右孩子
C.只有一个叶子结点
D.是任意一棵二叉树
正确答案:C
149.设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有()个。
A.n-1
B.n
C.n+1
D.n+2
正确答案:C
150.若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。
A.X的双亲
B.X的右子树中最左的结点
C.X的左子树中最右结点
D.X的左子树中最右叶结点
正确答案:C
151.若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。
A.前序
B.中序
C.后序
D.按层次
正确答案:C
152.稀疏矩阵的压缩存储形式有()
A.十字链表
B.三元组
C.散列
D.索引顺序
正确答案:AB
153.引入二叉线索树的目的是()。
A.加快查找结点的前驱或后继的速度
B.为了能在二叉树中方便的进行插入与删除
C.为了能方便的找到双亲
D.使二叉树的遍历结果唯一
正确答案:A
154.广义表((a,b,c,d))的表头是(),表尾是()。
A.a
B.()
C.(a,b,c,d)
D.(b,c,d)
正确答案:CB
155.串的长度是指()。
A.串中所含不同字母的个数
B.串中所含字符的个数
C.串中所含不同字符的个数
D.串中所含非空格字符的个数
正确答案:B
156.利用二叉链表存储树,则根结点的右指针是()。
A.指向最左孩子
B.指向最右孩子
C.空
D.非空
正确答案:C
157.若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是()图。
A.非连通
B.连通
C.强连通
D.有向
正确答案:B
158.串是一种特殊的线性表,其特殊性体现在()。
A.可以顺序存储
B.数据元素是一个字符
C.可以链式存储
D.数据元素可以是多个字符若
正确答案:B
159.串“ababaabab”的nextval为()。
A.10104101
B.10102101
C.10100011
D.10101011
正确答案:A
160.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。
A.13
B.32
C.33
D.40
正确答案:C
161.假设以行序为主序存储二维数组A=array[1.100,1.100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。
A.808
B.818
C.1010
D.1020
正确答案:B
162.若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1.(n(n+1))/2]中,则在B中确定aij(i
A.i*(i-1)/2+j
B.j*(j-1)/2+i
C.i*(i+1)/2+j
D.j*(j+1)/2+i
正确答案:B
163.广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为()。
A.(g)
B.(d)
C.c
D.d
正确答案:D
164.二维数组A的每个元素是由10个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。若A按行先存储,元素A[8,5]的起始地址与当A按列先存储时的元素()的起始地址相同。设每个字符占一个字节。
A.A[8,5]
B.A[3,10]
C.A[5,8]
D.A[0,9]
正确答案:B
165.串“ababaaababaa”的next数组为()。
A.12345678999
B.12121111212
C.11234223456
D.123012322345
正确答案:C
166.设二维数组A[1.m,1.n](即m行n列)按行存储在数组B[1.m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为()。
A.(i-1)*n+j
B.(i-1)*n+j-1
C.i*(j-1)
D.j*m+i-1
正确答案:A
167.n个顶点的连通图用邻接距阵表示时,该距阵至少有()个非零元素。
A.n
B.2(n-1)
C.n/2
D.n2
正确答案:B
168.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为()。
A.BA+141
B.BA+180
C.BA+222
D.BA+225
正确答案:B
169.设哈夫曼树中有199个结点,则该哈夫曼树中有()个叶子结点。
A.99
B.100
C.101
D.102
正确答案:B
170.n(n≥2)个权值均不相同的字符构成哈夫曼树,关于该树的叙述中,错误的是()。
A.该树一定是一棵完全二叉树
B.树中一定没有度为1的结点
C.树中两个权值最小的结点一定是兄弟结点
D.树中任一非叶结点的权值一定不小于下一层任一结点的权值
正确答案:A
171.栈在()中有所应用。
A.递归调用
B.函数调用
C.表达式求值
D.打印数据缓冲区
正确答案:ABC
172.若一个栈以向量V[1.n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是()。
A.top++; V[top]=x;
B.V[top]=x; top++;
C.top--; V[top]=x;
D.V[top]=x; top--;
正确答案:C
173.设广义表L=((a,b,c)),则L的长度和深度分别为()。
A.1和1
B.1和3
C.1和2
D.2和3
正确答案:C
174.若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在()种情况。
A.5,4,3,2,1
B.2,1,5,4,3
C.4,3,1,2,5
D.2,3,5,4,1
正确答案:C
175.数组A[0.4,-1.-3,5.7]中含有元素的个数()。
A.55
B.45
C.36
D.16
正确答案:B
176.把一棵树转换为二叉树后,这棵二叉树的形态是()。
A.唯一的
B.有多种
C.有多种,但根结点都没有左孩子
D.有多种,但根结点都没有右孩子
正确答案:A
177.串T=“abcabaa”,其nextval函数值为:()
A.110132
B.111232
C.1110132
D.1111232
正确答案:A
178.用链接方式存储的队列,在进行删除运算时()。
A.仅修改头指针
B.仅修改尾指针
C.头、尾指针都要修改
D.头、尾指针可能都要修改
正确答案:D
179.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。
A.r-f
B.(n+f-r)%n
C.n+r-f
D.(n+r-f)%n
正确答案:D
180.一个递归算法必须包括()。
A.递归部分
B.终止条件和递归部分
C.迭代部分
D.终止条件和迭代部分
正确答案:B
181.设计一个判别表达式中左,右括号是否配对出现的算法,采用()数据结构最佳。
A.线性表的顺序存储结构
B.队列
C.线性表的链式存储结构
D.栈
正确答案:D
182.最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是()。
A.(rear+1)%n==front
B.rear==front
C.rear+1==front
D.(rear-l)%n==front
正确答案:B
183.栈和队列的共同点是()。
A.都是先进先出
B.都是先进后出
C.只允许在端点处插入和删除元素
D.没有共同点
正确答案:C
184.设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是()。
A.2
B.3
C.4
D.6
正确答案:B
185.设有一个递归算法如下int fact(int n) { //n大于等于0if(n<=0) return 1;else return n*fact(n-1); }
A.n+1
B.n-1
C.n
D.n+2
正确答案:A
186.创建一个包括n个结点的有序单链表的时间复杂度是()。
A.O(1)
B.O(n)
C.O(n2)
D.O(nlog2n)
正确答案:C
187.在单链表中,要将s所指结点插入到p所指结点之后,其语句应为()。
A.s->next=p+1; p->next=s;
B.(*p).next=s; (*s).next=(*p).next;
C.s->next=p->next; p->next=s->next;
D.s->next=p->next; p->next=s;
正确答案:D
188.在一个长度为n的顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时须向后移动()个元素。
A.n-i
B.n-i+1
C.n-i-1
D.I
正确答案:B
189.链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
A.x=top->data;top=top->link;
B.top=top->link;x=top->link
C.x=top;top=top->link;
D.x=top->link
正确答案:A
190.为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是()。
A.队列
B.栈
C.线性表
D.有序表
正确答案:A
191.用链接方式存储的队列,在进行删除运算时()。
A.仅修改头指针
B.仅修改尾指针
C.头、尾指针都要修改
D.头、尾指针可能都要修改
正确答案:D
192.顺序存储的线性表的优点是()
A.存储密度大
B.插入方便
C.随机存取
D.删除方便
正确答案:AC
193.循环队列存储在数组A[0.m]中,则入队时的操作为()。
A.rear=rear+1
B.rear=(rear+1)%(m-1)
C.rear=(rear+1)%m
D.rear=(rear+1)%(m+1)
正确答案:D
194.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。
A.n
B.2n-1
C.2n
D.n-1
正确答案:A
195.顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。
A.110
B.108
C.100
D.120
正确答案:B
196.线性表L=(a1,a2,……an),下列说法正确的是()。
A.每个元素都有一个直接前驱和一个直接后继
B.线性表中至少有一个元素
C.表中诸元素的排列必须是由小到大或由大到小
D.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继
正确答案:D
197.在双向链表存储结构中,删除p所指的结点时须修改指针()。
A.p->next->prior=p->prior; p->prior->next=p->next;
B.p->next=p->next->next; p->next->prior=p;
C.p->prior->next=p; p->prior=p->prior->prior;
D.p->prior=p->next->next; p->next=p->prior->prior;
正确答案:A
198.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()。
A.i
B.n-i
C.n-i+1
D.不确定
正确答案:C
199.以下说法错误的是()。
A.求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低
B.顺序存储的线性表可以随机存取
C.由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活
D.线性表的链式存储结构优于顺序存储结构
正确答案:D
200.线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。
A.必须是连续的
B.部分地址必须是连续的
C.一定是不连续的
D.连续或不连续都可以
正确答案:D
201.向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动 的元素个数为()。
A.8
B.63.5
C.63
D.7
正确答案:B
202.线性表L在()情况下适用于使用链式结构实现
A.需经常修改L中的结点值
B.需不断对L进行删除插入
C.L中含有大量的结点
D.L中结点结构复杂
正确答案:B
203.单链表的存储密度()。
A.大于1
B.等于1
C.小于1
D.不能确定
正确答案:C
204.在双向循环链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是()。
A.p->next=q; q->prior=p; p->next->prior=q; q->next=q;
B.p->next=q; p->next->prior=q; q->prior=p; q->next=p->next;
C.q->prior=p; q->next=p->next; p->next->prior=q; p->next=q;
D.q->prior=p; q->next=p->next; p->next=q; p->next->prior=q;
正确答案:C
205.在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()。
A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
B.在第i个结点后插入一个新结点(1≤i≤n)
C.删除第i个结点(1≤i≤n)
D.将n个结点从小到大排序
正确答案:A
206.在数据结构中,从逻辑上可以把数据结构分成()。
A.动态结构和静态结构
B.紧凑结构和非紧凑结构
C.线性结构和非线性结构
D.内部结构和外部结构
正确答案:C
207.与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。
A.存储结构
B.存储实现
C.逻辑结构
D.运算实现
正确答案:C
208.设数据结构A=(D,R),其中D={1,2,3,4},R={r},r={<1,2>,<2,3>,<3,4>,<4,1>,<4,2>},则该数据结构是()。
A.线性结构
B.树型结构
C.图型结构
D.集合
正确答案:C
209.链接存储的存储结构所占存储空间()。
A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
B.只有一部分,存放结点值
C.只有一部分,存储表示结点间关系的指针
D.分两部分,一部分存放结点值,另一部分存放结点所占单元数
正确答案:A
210.以下说法正确的是()。
A.数据元素是数据的最小单位
B.数据项是数据的基本单位
C.数据结构是带有结构的各数据项的集合
D.一些表面上很不相同的数据可以有相同的逻辑结构
正确答案:D
211.算法的时间复杂度取决于()
A.问题的规模
B.待处理数据的初态
C.计算机的配置
正确答案:D
212.8254工作在方式1下时,只有在GATE上(),才可能开始工作
A.为低电平
B.有一正脉冲
C.为高电平
D.有一负脉冲
正确答案:D
213.通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。
A.数据具有同一特点
B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致
C.每个数据元素都一样
D.数据元素所包含的数据项的个数要相等
正确答案:B
214.评价算法优劣的基本标准有()
A.正确性
B.可读性
C.可用性
D.高效性
正确答案:ABD