Như đã đề cập ở trên, tôi đã cố gắng sử dụng cách tiếp cận macro để tạo ra các chức năng danh sách các thao tác. Dễ dàng tạo quy trình hoạt động INSERT nhưng rất khó để tạo ra các thao tác Xóa và di chuyển. Sau đó cấu trúc danh sách và chữ ký thông thường INSERT:
#define LIST_DEFINE(type) \
struct list_node_##type \
{ \
type *data; \`
struct list_node_##type *next; \
};
LIST_INSERT(&ListHead,&Data, DataType);
đâu:
ListHead
- Trưởng danh sách liên kết
Data
- Các dữ liệu mà một nút mới sẽ được tạo ra và dữ liệu được chèn vào trong nút DataType
- Là loại dữ liệu của dữ liệu được chuyển qua
FYI, tôi cấp phát bộ nhớ trong hàm và sao chép tất cả dữ liệu được chuyển vào nút mới tạo và thêm nút trong danh sách được liên kết.
Bây giờ, khi một thói quen LIST_DELETE
được tạo, nút cần xóa sẽ được xác định bằng cách sử dụng số nhận dạng duy nhất trong dữ liệu. Mã định danh đó cũng được chuyển trong quy trình MACRO
làm khóa sẽ được thay thế trong phần mở rộng MACRO
. Chữ ký thói quen có thể là:
LIST_DELETE(&ListHead, DataType, myvar->data->str, char*);
đâu:
ListHead
- Trưởng danh sách liên kết
DataType
- Là dữ liệu kiểu của dữ liệu
myvar->data->str
- Unique key
char*
- loại chính
Bây giờ, khi khóa được mở rộng, bạn không thể sử dụng cùng một khóa đó để so sánh như thể chúng tôi viết
if((keytype)ListHead->data->key == (keytype)key)
Nó mở rộng để
ListHead->data->myvar->data->str == myvar->data->str
Và đây không có biến như: ListHead->data->myvar->data->str
Vì vậy, phương pháp này không thể làm việc để viết xóa thói quen và là traversal và tìm kiếm thói quen cũng sử dụng khóa duy nhất, tương tự vấn đề cũng sẽ phải đối mặt với họ.
Và, trên ghi chú không liên quan, cách xác định logic phù hợp cho khóa duy nhất, vì khóa duy nhất có thể là bất kỳ thứ gì.