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 thêm một phần tử vào đầu danh sách: struct S1 { int info; struct S1 * next; }* head;
Trả lời:
Đáp án đúng: A
Để thêm một phần tử mới vào đầu danh sách liên kết đơn, chúng ta cần thực hiện các bước sau:
1. **Tạo một node mới:** Giả sử node mới này được trỏ bởi con trỏ `p`. Giá trị của `info` trong node này đã được gán (không thể hiện trong các đáp án, nhưng đó là điều kiện tiên quyết).
2. **Liên kết node mới vào danh sách:** Đặt con trỏ `next` của node mới (`p->next`) trỏ đến node đầu tiên hiện tại của danh sách (được trỏ bởi `head`). Như vậy, `p->next = head;`.
3. **Cập nhật `head`:** Chuyển `head` sang trỏ đến node mới (`p`). Như vậy, `head = p;`.
Vậy, đáp án đúng phải là `p->next = head; head = p;`
* **Giải thích tại sao các đáp án khác sai:**
* **B:** `head->p` là một cú pháp sai. `head` là một con trỏ, không phải một struct có trường `p`. Hơn nữa, `head = p->next` sẽ làm mất node đầu tiên vừa thêm vào.
* **C:** `head->next = p` sẽ thêm node mới vào *sau* node hiện tại `head`, không phải vào đầu danh sách. `p = head` chỉ gán địa chỉ của `head` cho `p`, không thay đổi cấu trúc danh sách.
* **D:** Có một câu đúng, do đó câu này sai.