Cho một danh sách móc nối với các phần tử trong danh sách có kiểu S1 được định nghĩa như sau. Biết con trỏ “*head” lưu địa chỉ của phần tử đầu tiên trong danh sách. Nhóm câu lệnh nào sau đây xóa phần tử đầu tiên ra khỏi danh sách: struct S1 { int info; struct S1 * next; }* head;
Trả lời:
Đáp án đúng: B
Đề bài yêu cầu xóa phần tử đầu tiên ra khỏi danh sách móc nối đơn. Điều này có nghĩa là con trỏ head
(vốn đang trỏ đến phần tử đầu tiên) cần được cập nhật để trỏ đến phần tử thứ hai trong danh sách. Trong danh sách móc nối đơn, mỗi phần tử chứa một con trỏ next
trỏ đến phần tử kế tiếp. Vì vậy, để head
trỏ đến phần tử thứ hai, ta cần gán head
bằng giá trị của head->next
.
Phân tích các phương án:
- A.
head->next=head;
: Câu lệnh này gán con trỏnext
của phần tử đầu tiên trỏ ngược lại chính nó, tạo thành một vòng lặp. Nó không xóa phần tử đầu tiên khỏi danh sách. - B.
head=head->next;
: Câu lệnh này gánhead
bằng địa chỉ của phần tử kế tiếp (phần tử thứ hai). Như vậy, phần tử đầu tiên bị loại khỏi danh sách vì không còn con trỏ nào trỏ đến nó nữa. Đây là phương án đúng. - C.
head=head->next->next;
: Câu lệnh này gánhead
bằng địa chỉ của phần tử thứ ba trong danh sách. Điều này sẽ xóa cả phần tử đầu tiên và phần tử thứ hai ra khỏi danh sách, không đúng với yêu cầu đề bài (chỉ xóa phần tử đầu tiên). - D. B và C đều đúng: Vì C sai nên D cũng sai.
Vậy, phương án B là phương án đúng duy nhất.