《动态分配内存与数据结构》课后习题 下载本文

内容发布更新时间 : 2024/12/23 2:14:52星期一 下面是文章的全部内容请认真阅读。

《动态分配内存与数据结构》习题

学号姓名 一、选择题

1、是一种限制存取位置的线性表,元素的存取必须服从先进先出的规则。

A.顺序表 B.链表 C.栈 D.队列 2、是一种限制存取位置的线性表,元素的存取必须服从先进后出的规则。

A.顺序表 B.链表 C.栈 D.队列 3、与顺序表相比,链表不具有的特点是。

A.能够分散存储数据,无需连续内存空间 B.插入和删除无需移动数据 C.能够根据下标随机访问

D.只要内存足够,没有最大长度的限制

4、如果通过new运算符动态分配失败,返回结果是。

A.-1 B.0 C.1D.不确定

5、实现深复制中,不是必须自定义的。

A. 构造函数 B. 复制构造函数 C. 析构函数 D. 复制赋值操作符函数 6、分析下列代码是否存在问题,选择合适的选项: 。

int main(void) { int *p = new int [10]; p = new int [10]; delete [] p; p = NULL;

return 0; }

A.没有问题 B.有内存泄漏

C.存在空悬指针 D.存在重复释放同一空间 7、通过new运算符动态分配的对象,存储于内存中的。

A.全局变量与静态变量区 B.代码区 C.栈区 D.堆区 8、下列函数中,可以是虚函数。

A.构造函数 B.析构函数 C.静态成员函数 D.友元函数 9、关于通过new运算符动态创建的对象数组,下列判断中是错误的。

A. 动态创建的对象数组只能调用默认构造函数

B. 动态创建的对象数组必须调用delete []动态撤销 C. 动态创建的对象数组的大小必须是常数或常变量 D. 动态创建的对象数组没有数组名 10、顺序表不具有的特点是

A. 元素的存储地址连续

B. 存储空间根据需要动态开辟,不会溢出 C. 可以直接随机访问元素

D. 插入和删除元素的时间开销与位置有关

11、假设一个对象Ob1的数据成员是指向动态对象的指针,如果采用浅复制的方式复制该对象得到对象Ob2,那么在析构对象Ob1和对象Ob2时会的问题。

A. 有重复释放 B. 没有 C. 内存泄漏 D. 动态分配失败

12、假设对5个元素A、B、C、D、E进行压栈或出栈的操作,压栈的先后顺序是ABCDE,则出栈的先后顺序不可能是。

A. ABCDE B. EDCBA C. EDBCA D. BCADE

13、假设对4个元素A、B、C、D、E进行压栈或出栈的操作,压栈的先后顺序是ABCD,则出栈的先后顺序不可能是。

A. ABCD B. DCBA C. BCAD D. DCAB 14、通过new运算符动态创建的对象的存放在中。

A. 代码区 B. 栈区 C. 自由存储区 D. 全局数据区 15、链表不具有的特点是。

A. 元素的存储地址可以不连续

B. 存储空间根据需要动态开辟,不会溢出 C. 可以直接随机访问元素

D. 插入和删除元素的时间开销与位置无关

16、有关内存分配和释放的说法,下面当中错误的是 A.new运算符的结果只能赋值给指针变量 B.动态创建的对象数组必须调用delete []动态撤销 C.用new分配的空间位置是在内存的栈区 D.动态创建的对象数组没有数组名 17、关于栈,下列哪项不是基本操作 A.删除栈顶元素 B.删除栈底元素 C.判断栈是否为空 D.把栈置空

18、关于链表,说法错误的是

A. 元素的存储地址可以不连续

B. 存储空间根据需要动态开辟,不会溢出

C. 必须是单向的,不能是双向的或者是环形的。 D. 插入和删除元素的时间开销与位置无关 19、关于线性链表,其不具备的特点是

A.链表不需要事先分配空间,可以根据需要动态分配 B.链表和数组一样可随机访问表内任一元素 C.插入删除不需要移动表内的元素 D.链表所需空间大小与其节点数成正比 20、下列关于队列的描述中正确的是

A.在队列中只能插入元素而不能删除元素 B.在队列中只能删除元素而不能插入元素

C.队列是特殊的线性表,只能在一端插入或删除元素

D.队列是特殊的线性表,只能在一端插入元素,而在另一端删除元素

21、设内存分配语句int *p=new int,选择合适的填充使P所指的存储单元赋初值28。

A.(28) B.[28] C.{28} D.*28 22、对于循环队列,下列叙述中正确的是

A.队头指针是固定不变的 B.队头指针一定大于队尾指针 C.队头指针一定小于队尾指针

D.队头指针可以大于队尾指针,也可以小于队尾指针 23、下列关于线性链表的叙述中,正确的是

A.各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致 B.各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续 C.进行插入与删除时,不需要移动表中的元素 D.以上三种说法都不对

24、设有如图的线性链表,其中p,q,r都为指向链表中节点的指针。

先需要将上述链表当中q和r所指的节点交换位置,同时保持链表的连续,则下列语句当中无法胜任的是__________ A. q->next=r->next; p->next=r; r->next=q; B. p->next=r; q->next=r->next; r->next=q; C. q->next=r->next; r->next=q; p->next=r; D. r->next=q; p->next=r; q->next=r->next; 二、填空题

1、在长度为10 的顺序存储的线性表中插入一个元素,最坏情况下需要移动表 中个元素。

2、设某循环队列的容量为40,头指针front=3(指向队头元素的前一位置),尾指针rear=25(指向队尾元素),则该循环队列中共有个元素。

3、假设有一长度为20的线性表用来存储栈,如果栈底元素bottom=19,栈顶元素top=10,则该栈当中具有个元素。 4、假设有int *p = new int [20],则当释放该数组时,应用语句来完成。

5、单向链表的节点分为域和域两部分。如果需要实现环形链表,则需要把最后一个节点的指向。 6、一般情况下,使用系统提供的默认析构函数就可以了,但当对象的成员中使用了

运算符动态分配内存空间时,就必须以正确释放对象空间。为了对象间能正确赋值,还必须要。 7、通过new运算符动态创建的对象的存放在中。 8、默认复制构造函数是按成员复制,称为 9、void a(node *p,Datatype x){ node *q=new node; q->info=x;

q->link=p->link; p->link=q; }

以上a函数实现的功能是

10、对含有动态分配的数据成员的类对象应该采用复制,动态分配的资源通常要求在中释放。 三、程序阅读题

1、指出程序的运行结果: #include using namespace std; class stack{ int *rep;

int size,top; public:

stack(int n=10):size(n){ cout<<\ rep=new int [size];top=0;

}

stack(stack &s):size(s.size) { cout<<\ rep=new int[size];

for (int i=0;i

~stack(){

cout<<\ delete [] rep;

}

void push(int a) {rep[top]=a;top++;} int pop(){--top; return rep[top];}

bool isEmpty() const{return top == 0;} };

void main(void) {

stack s1;

for(int i=1;i<5;i++) s1.push(i); stack s2(s1);

for(i=1;i<3;i++) cout<

while (!s2.isEmpty()) cout<

2、指出程序的运行结果: #include usingnamespacestd; class stack{ int *rep; int size,top; public: stack(int n=10):size(n)//构造函数 { cout<<\<

int main() { stack *ptr=new stack[2]; for(int i=1;i<5;i++) { ptr[0].push(i); ptr[1].push(i+6); } stack s2(ptr[0]); for(i=0;i<2;i++) cout<