#6012. 结构体指针与链表专项练习2
结构体指针与链表专项练习2
一、选择题(共15题,每题2分)
- 关于结构体嵌套访问,以下代码正确的是:{{ select(1) }}
struct A { int x; }; struct B { A a; int y; } b;
b.a.x = 10;b->a.x = 10;b.a->x = 10;b->a->x = 10;
- 关于
delete和free释放结构体内存的区别,以下说法正确的是:{{ select(2) }}
delete会调用结构体的析构函数,free不会free会调用结构体的析构函数,delete不会delete和free都会调用结构体的析构函数delete和free都不会调用结构体的析构函数
- 关于
new创建结构体数组并初始化,正确的是:{{ select(3) }}
Student *p = new Student[3]{{"Tom",18}, {"Jerry",19}, {"Alice",20}};Student *p = new Student[3] = {{"Tom",18}, {"Jerry",19}, {"Alice",20}};Student p[3] = new Student[3]{{"Tom",18}, {"Jerry",19}, {"Alice",20}};Student *p = new Student[3]; p = {{"Tom",18}, {"Jerry",19}, {"Alice",20}};
- 已知
Student *p = new Student;,释放内存的正确方式是:{{ select(4) }}
free(p);delete p;malloc_free(p);delete[] p;
- 循环双链表中,在节点
p之前插入节点s,正确操作是:{{ select(5) }}
s->prev = p->prev; p->prev->next = s; s->next = p; p->prev = s;p->prev = s; s->next = p; s->prev = p->prev; p->prev->next = s;s->next = p; s->prev = p->prev; p->prev = s; p->prev->next = s;s->prev = p->prev; p->prev = s; p->prev->next = s; s->next = p;
- 以下关于结构体大小说法正确的是:{{ select(6) }}
- 结构体大小等于各成员大小之和
- 结构体大小可能大于各成员大小之和(内存对齐)
- 结构体大小一定小于各成员大小之和
- 空结构体大小为0
- 循环双链表遍历打印所有节点(不含头节点)的正确代码是:{{ select(7) }}
-
Node *p = head; while(p != NULL) { cout << p->data; p = p->next; } -
Node *p = head->next; while(p != head) { cout << p->data; p = p->next; } -
Node *p = head; do { cout << p->data; p = p->next; } while(p != head); -
for(Node *p = head; p->next != head; p = p->next) cout << p->data;
- 定义结构体
Student时,以下哪个成员类型是不允许定义在结构体内部的:{{ select(8) }}
Student *next;Student *arr[10];Student self;vector<Student> v;
- 关于
typedef定义结构体,正确的是:{{ select(9) }}
typedef struct Student {} Stu;之后可用Stu定义变量typedef struct {} Student;之后Student是结构体标签typedef struct Student {};之后只能用struct Student定义变量- 以上都不对
-
循环双链表中查找值为
val的节点,以下实现正确的是:{{ select(10) }}Node* search(Node* head, int val) { Node *p = head->next; while(p != head) { if(p->data == val) return p; p = p->next; } return NULL; }-
Node* search(Node* head, int val) { for(Node *p = head; p != NULL; p = p->next) if(p->data == val) return p; return NULL; } -
Node* search(Node* head, int val) { Node *p = head; do { if(p->data == val) return p; p = p->next; } while(p != head); return NULL; } -
Node* search(Node* head, int val) { if(head->data == val) return head; return search(head->next, val); }
-
-
结构体作为函数参数时,以下说法正确的是:{{ select(11) }}
- 默认是值传递,会拷贝整个结构体
- 默认是引用传递,不会拷贝
- 结构体不能作为函数参数
- 只能传递结构体指针
-
循环双链表删除所有节点的正确代码是:{{ select(12) }}
Node *p = head->next; while(p != head) { Node *q = p; p = p->next; delete q; }-
Node *p = head; while(p != NULL) { Node *q = p; p = p->next; delete q; } -
for(Node *p = head; p != NULL; p = p->next) delete p; -
delete head;
-
-
以下关于结构体指针运算正确的是:{{ select(13) }}
p + 1指向下一个结构体元素p++指向下一个字节- 两个结构体指针可以相减
- 结构体指针不支持算术运算
-
循环双链表中,统计节点个数(不含头节点)的函数正确的是:{{ select(14) }}
int count(Node* head) { int cnt = 0; Node *p = head; while(p->next != head) { cnt++; p = p->next; } return cnt; }-
int count(Node* head) { int cnt = 0; Node *p = head->next; while(p != head) { cnt++; p = p->next; } return cnt; } -
int count(Node* head) { int cnt = 0; for(Node *p = head; p != NULL; p = p->next) cnt++; return cnt; } -
int count(Node* head) { return sizeof(head) / sizeof(Node); }
-
-
关于结构体与类的区别,错误的是:{{ select(15) }}
- 结构体默认成员是public,类默认是private
- 结构体不能有成员函数
- 结构体可以继承
- 结构体可以有构造函数
二、判断题(共10题,每题2分)
- 结构体变量可以直接赋值给另一个同类型结构体变量。{{ select(16) }}
- 正确
- 错误
- 使用
Student *p = &stu;后,(*p).name和p->name是等价的。{{ select(17) }}
- 正确
- 错误
- 循环双链表必须带有头节点。{{ select(18) }}
- 正确
- 错误
- 结构体中可以定义静态成员变量。{{ select(19) }}
- 正确
- 错误
- 在循环双链表中,尾节点的
next指向头节点,头节点的prev指向尾节点。{{ select(20) }}
- 正确
- 错误
struct Student和class Student在C++中除了默认访问权限外没有区别。{{ select(21) }}
- 正确
- 错误
- 结构体数组名可以作为指针使用。{{ select(22) }}
- 正确
- 错误
- 循环双链表的插入操作时间复杂度是O(1)。{{ select(23) }}
- 正确
- 错误
Student *p = new Student{"Tom", 18};是C++11及以后版本合法的初始化方式。{{ select(24) }}
- 正确
- 错误
- 使用
malloc分配的结构体内存,需要用delete释放。{{ select(25) }}
- 正确
- 错误