#6011. 结构体指针与链表专项练习1

结构体指针与链表专项练习1

一、选择题(共15题,每题2分)

  1. 关于结构体嵌套,以下说法正确的是:{{ select(1) }}
  • 结构体不能包含自身类型的成员
  • 结构体可以包含指向自身类型的指针
  • 嵌套结构体的成员访问只能使用一级点运算符
  • 结构体嵌套层次不能超过3层
  1. 给定结构体定义:
    struct Date { int year, month, day; };
    struct Student {
        string name;
        Date birthday;
    } stu;
    
    以下初始化方法正确的是:{{ select(2) }}
  • Student stu = {"Tom", {2000, 1, 1}};
  • Student stu = {"Tom", 2000, 1, 1};
  • Student stu = {name:"Tom", birthday:{2000,1,1}};
  • Student stu = (name="Tom", birthday=(2000,1,1));
  1. 关于结构体指针声明,正确的是:{{ select(3) }}
  • struct Student *p;
  • Student p*;
  • pointer Student p;
  • *Student p;
  1. 访问结构体指针的成员,正确方式是:{{ select(4) }}
  • p->name
  • p.name
  • *p.name
  • &p->name
  1. 循环双链表的头节点指针为head,判断链表为空的表达式是:{{ select(5) }}
  • head == NULL
  • head->next == NULL
  • head->next == head
  • head == NULL && head->next == NULL
  1. 在循环双链表中,遍历所有节点的循环条件通常是:{{ select(6) }}
  • p != NULL
  • p != head
  • p->next != NULL
  • p->next != head
  1. 在循环双链表节点p之后插入节点s错误的操作顺序是:{{ select(7) }}
  • s->next = p->next; p->next->prev = s; p->next = s; s->prev = p;
  • p->next = s; s->prev = p; s->next = p->next; p->next->prev = s;
  • s->prev = p; s->next = p->next; p->next->prev = s; p->next = s;
  • p->next->prev = s; s->prev = p; s->next = p->next; p->next = s;
  1. 删除循环双链表中的节点p(非头节点),正确操作是:{{ select(8) }}
  • p->prev->next = p->next; p->next->prev = p->prev;
  • p->next = p->prev; p->prev = p->next;
  • delete p; p->prev->next = p->next;
  • p->prev = p->next; p->next = p->prev;
  1. 以下哪种不是结构体初始化的合法方式:{{ select(9) }}
  • Student stu = {};
  • Student stu = {"Alice", 18};
  • Student stu("Bob", 19);
  • Student stu { "Charlie", 20 };
  1. 在循环双链表中查找值为val的节点,若找到返回节点指针,否则返回NULL,以下函数头正确的是:{{ select(10) }}
  • Node* search(Node* head, int val)
  • Node search(Node head, int val)
  • int search(Node* head, int val)
  • bool search(Node* head, int val)
  1. 关于结构体指针的动态内存分配,正确的是:{{ select(11) }}
  • Student *p = new Student;
  • Student p = new Student;
  • Student *p = malloc(Student);
  • Student p = (Student*)malloc(sizeof(Student));
  1. 循环双链表中,节点定义如下:
    struct Node {
        int data;
        Node *prev, *next;
    };
    
    在只有头指针head的情况下,要在表尾插入节点s,需要:{{ select(12) }}
  • head->prev->next = s; s->prev = head->prev; s->next = head; head->prev = s;
  • head->next = s; s->prev = head; s->next = head;
  • Node *p = head; while(p->next != head) p=p->next; 然后插入
  • 无法在表尾插入
  1. 对于已初始化的结构体变量stu,以下访问成员方式错误的是:{{ select(13) }}
  • stu.name
  • (&stu)->name
  • *(&stu).name
  • (*(&stu)).name
  1. 循环双链表的节点p是头节点,要删除头节点后的第一个节点,需要:{{ select(14) }}
  • 先判断链表是否只有头节点
  • 直接删除p->next
  • 不需要判断,直接操作
  • 必须先找到尾节点
  1. 关于结构体数组的初始化,正确的是:{{ select(15) }}
  • Student stu[2] = {{"Tom",18},{"Jerry",19}};
  • Student stu[2] = {"Tom",18,"Jerry",19};
  • Student[2] stu = {{"Tom",18},{"Jerry",19}};
  • Student stu[2] = {Tom,18,Jerry,19};

二、判断题(共10题,每题2分)

  1. 结构体可以包含其他结构体类型的成员,但不能包含自身类型的成员。{{ select(16) }}
  • 正确
  • 错误
  1. 使用Student *p = new Student;创建结构体对象后,可以使用p.name访问成员。{{ select(17) }}
  • 正确
  • 错误
  1. 在C++中,定义结构体变量时可以省略struct关键字。{{ select(18) }}
  • 正确
  • 错误
  1. 循环双链表的优点是可以从任意节点出发遍历整个链表。{{ select(19) }}
  • 正确
  • 错误
  1. 在循环双链表中,头节点的prev指针总是指向最后一个节点。{{ select(20) }}
  • 正确
  • 错误
  1. 删除循环双链表节点时,不需要考虑被删除节点是否是头节点。{{ select(21) }}
  • 正确
  • 错误
  1. 结构体变量可以在定义时使用Student stu = {"John"}进行初始化,未指定的成员会被初始化为0。{{ select(22) }}
  • 正确
  • 错误
  1. 在循环双链表中查找元素,平均时间复杂度是O(n)。{{ select(23) }}
  • 正确
  • 错误
  1. 结构体指针变量必须使用->运算符访问成员,不能使用.运算符。{{ select(24) }}
  • 正确
  • 错误
  1. 循环双链表的插入操作只需要修改两个指针。{{ select(25) }}
  • 正确
  • 错误