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:
struct S1 {int info; struct S1 *next;} *head;
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?
Trả lời:
Đáp án đúng: A
Đề bài yêu cầu thêm một phần tử vào **đầu** danh sách liên kết đơn.
Để thêm một phần tử vào đầu danh sách, ta cần thực hiện các bước sau:
- Tạo một node mới (trong đoạn code, node mới được trỏ bởi con trỏ
p
). - Cho 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 (địa chỉ được lưu tronghead
). - Cập nhật
head
để nó trỏ đến node mới (p
), biến node mới thành node đầu tiên của danh sách.
Phân tích các đáp án:
- Đáp án A:
p->next = head; head = p;
- Câu lệnh
p->next = head;
gán địa chỉ của phần tử đầu tiên hiện tại (được trỏ bởihead
) vào trườngnext
của phần tử mới (được trỏ bởip
). Điều này đảm bảo phần tử mới sẽ liên kết đến phần còn lại của danh sách. - Câu lệnh
head = p;
gán địa chỉ của phần tử mới (p
) chohead
. Điều này làm cho phần tử mới trở thành phần tử đầu tiên của danh sách.
=> Đáp án A đúng.
- Câu lệnh
- Đáp án B:
p->next = head; head->p; head = p->next;
p->next = head;
gán địa chỉ của phần tử đầu tiên hiện tại cho trường next của node mới.head->p;
Câu lệnh này không hợp lệ về mặt cú pháp vì không có trường 'p' trong struct S1, và hơn nữa cũng không thực hiện chức năng gì có ý nghĩa trong việc thêm phần tử vào danh sách.head = p->next;
gán địa chỉ mà p trỏ tới (chính là địa chỉ của phần tử đầu tiên trước đó) cho head. Như vậy head vẫn trỏ vào phần tử đầu tiên ban đầu, và phần tử mới không được thêm vào đầu danh sách.
=> Đáp án B sai.
- Đáp án C:
head->next = p; p = head;
- Câu lệnh
head->next = p;
gán địa chỉ của phần tử mới (p
) vào trườngnext
của phần tử đầu tiên hiện tại (được trỏ bởihead
). Điều này thêm phần tử mới vào *sau* phần tử đầu tiên, chứ không phải vào đầu danh sách. - Câu lệnh
p = head;
gán địa chỉ của phần tử đầu tiên (head
) chop
, làm chop
trỏ đến phần tử đầu tiên ban đầu. Điều này không thay đổi cấu trúc danh sách.
=> Đáp án C sai.
- Câu lệnh
- Đáp án D: Không có câu nào đúng.
Vì đáp án A đúng, nên đáp án D sai.