Cho một danh sách liên kết đôi đã sắp xếp chứa các giá trị nguyên. Mục tiêu là tìm các bộ ba có tích bằng giá trị x cho trước. Nếu danh sách liên kết đầu vào là 3-4-1-2 và x là 6 thì số lượng sẽ là 1 (bộ ba (3,1,2)).

Ví dụ
Đầu vào
danh sách liên kết: [200-4-16-5-10-10-2] x=200
Đầu ra
Số bộ ba trong danh sách liên kết đôi đã sắp xếp có tích bằng x là: 3
Giải thích
Các bộ ba sẽ là: (4,5,10), (4,5,10) và (10,10,2)
Đầu vào
danh sách liên kết: [4-3-1-5-2-4-2] x=12
Đầu ra
Số bộ ba trong danh sách liên kết đôi đã sắp xếp có tích bằng x là: 3
Giải thích
Các bộ ba sẽ là: (4,3,1), (3,1,4) và (3,2,2)
Phương pháp sử dụng
Trong phương pháp này:
- Chúng ta lấy nút danh sách liên kết là struct chứa phần dữ liệu
int datavà con trỏ tự tham chiếunextvàprevious. - Hàm
insert_node(struct block** head, int data)thêm nút vào đầu danh sách liên kết với dữ liệu. - Hàm
Product_x(struct block* head, int x)nhận con trỏ đến đầu danh sách liên kết đôi và số nguyênxvà trả về số bộ ba các nút có tích phần dữ liệu bằngx. - Khởi tạo biến đếm ban đầu là 0.
- Lấy ba con trỏ
temp_1,temp_2vàtemp_3kiểustruct block. - Bắt đầu từ
temp_1trỏ đến đầu danh sách liên kết,temp_2trỏ đến kế tiếptemp_1vàtemp_3trỏ đến kế tiếptemp_2, ta có ba con trỏ trỏ đến ba nút đầu tiên. - Duyệt bằng các con trỏ này cho đến nút cuối cùng.
- Nếu phần dữ liệu hiện tại của tất cả các con trỏ trên có tích bằng
x((temp_1->data * temp_2->data * temp_3->data) == x) thì tăng biến đếm. - Cuối cùng, chúng ta đếm được số bộ ba và lưu trong biến đếm.
- Trả về biến đếm làm kết quả.
Ví dụ mã
#include <iostream>
using namespace std;
struct block {
int data;
struct block *next, *prev;
};
void insert_node(struct block** head, int data) {
struct block* ptr = new block();
ptr->data = data;
ptr->next = NULL;
ptr->prev = NULL;
if ((*head) == NULL) {
(*head) = ptr;
} else {
ptr->next = *head;
(*head)->prev = ptr;
(*head) = ptr;
}
}
int Product_x(struct block* head, int x) {
int count = 0;
struct block *temp_1, *temp_2, *temp_3;
for (temp_1 = head; temp_1 != NULL; temp_1 = temp_1->next) {
for (temp_2 = temp_1->next; temp_2 != NULL; temp_2 = temp_2->next) {
for (temp_3 = temp_2->next; temp_3 != NULL; temp_3 = temp_3->next) {
if ((temp_1->data * temp_2->data * temp_3->data) == x) {
count++;
}
}
}
}
return count;
}
int main() {
struct block* head = NULL;
insert_node(&head, 200);
insert_node(&head, 100);
insert_node(&head, 16);
insert_node(&head, 14);
insert_node(&head, 10);
insert_node(&head, 10);
insert_node(&head, 2);
int x = 200;
cout << "Số bộ ba trong danh sách liên kết đôi đã sắp xếp có tích bằng x là: " << Product_x(head, x);
return 0;
}
Đầu ra
Nếu chạy mã trên, sẽ tạo ra đầu ra sau:
Số bộ ba trong danh sách liên kết đôi đã sắp xếp có tích bằng x là: 1