#6012. 结构体指针与链表专项练习2

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

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

  1. 关于结构体嵌套访问,以下代码正确的是:{{ 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;
  1. 关于deletefree释放结构体内存的区别,以下说法正确的是:{{ select(2) }}
  • delete会调用结构体的析构函数,free不会
  • free会调用结构体的析构函数,delete不会
  • deletefree都会调用结构体的析构函数
  • deletefree都不会调用结构体的析构函数
  1. 关于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}};
  1. 已知Student *p = new Student;,释放内存的正确方式是:{{ select(4) }}
  • free(p);
  • delete p;
  • malloc_free(p);
  • delete[] p;
  1. 循环双链表中,在节点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;
  1. 以下关于结构体大小说法正确的是:{{ select(6) }}
  • 结构体大小等于各成员大小之和
  • 结构体大小可能大于各成员大小之和(内存对齐)
  • 结构体大小一定小于各成员大小之和
  • 空结构体大小为0
  1. 循环双链表遍历打印所有节点(不含头节点)的正确代码是:{{ 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;
    
  1. 定义结构体 Student 时,以下哪个成员类型是不允许定义在结构体内部的:{{ select(8) }}
  • Student *next;
  • Student *arr[10];
  • Student self;
  • vector<Student> v;
  1. 关于typedef定义结构体,正确的是:{{ select(9) }}
  • typedef struct Student {} Stu; 之后可用Stu定义变量
  • typedef struct {} Student; 之后Student是结构体标签
  • typedef struct Student {}; 之后只能用struct Student定义变量
  • 以上都不对
  1. 循环双链表中查找值为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);
      }
      
  2. 结构体作为函数参数时,以下说法正确的是:{{ select(11) }}

  • 默认是值传递,会拷贝整个结构体
  • 默认是引用传递,不会拷贝
  • 结构体不能作为函数参数
  • 只能传递结构体指针
  1. 循环双链表删除所有节点的正确代码是:{{ 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;
      
  2. 以下关于结构体指针运算正确的是:{{ select(13) }}

  • p + 1 指向下一个结构体元素
  • p++ 指向下一个字节
  • 两个结构体指针可以相减
  • 结构体指针不支持算术运算
  1. 循环双链表中,统计节点个数(不含头节点)的函数正确的是:{{ 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);
      }
      
  2. 关于结构体与类的区别,错误的是:{{ select(15) }}

  • 结构体默认成员是public,类默认是private
  • 结构体不能有成员函数
  • 结构体可以继承
  • 结构体可以有构造函数

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

  1. 结构体变量可以直接赋值给另一个同类型结构体变量。{{ select(16) }}
  • 正确
  • 错误
  1. 使用Student *p = &stu;后,(*p).namep->name是等价的。{{ select(17) }}
  • 正确
  • 错误
  1. 循环双链表必须带有头节点。{{ select(18) }}
  • 正确
  • 错误
  1. 结构体中可以定义静态成员变量。{{ select(19) }}
  • 正确
  • 错误
  1. 在循环双链表中,尾节点的next指向头节点,头节点的prev指向尾节点。{{ select(20) }}
  • 正确
  • 错误
  1. struct Studentclass Student在C++中除了默认访问权限外没有区别。{{ select(21) }}
  • 正确
  • 错误
  1. 结构体数组名可以作为指针使用。{{ select(22) }}
  • 正确
  • 错误
  1. 循环双链表的插入操作时间复杂度是O(1)。{{ select(23) }}
  • 正确
  • 错误
  1. Student *p = new Student{"Tom", 18};是C++11及以后版本合法的初始化方式。{{ select(24) }}
  • 正确
  • 错误
  1. 使用malloc分配的结构体内存,需要用delete释放。{{ select(25) }}
  • 正确
  • 错误