2011-10-02 17 views
18

Hiện nay, tôi đã thực hiện một danh sách đơn lẻ liên kết, như vậy:Cách sử dụng danh sách từ sys/queue.h?

struct PeerNode { 
    struct Peer* cargo; 
    struct PeerNode* next; 
}; 

... và tôi có một cấu trúc có chứa một vài các danh sách liên kết, như vậy:

struct Torrent { 
    ... 
    struct PeerNode* peer_list; 
    struct PeerNode* unchoked_peers; 
    ... 
} 

tôi muốn thay thế điều này bằng cách sử dụng các macro được cung cấp bởi sys/queue.h. Tôi tập hợp mà tôi có thể thay thế mã của tôi với một cái gì đó như thế này:

struct Torrent { 
    ... 
    LIST_ENTRY(PeerNode, Peer) peer_list; 
    struct PeerNode* unchoked_peers; 
    ... 
} 

Sau đó, từ nhìn vào man queue, tôi tin rằng tôi sẽ khởi tạo danh sách bằng cách làm một cái gì đó như thế này:

LIST_INIT(&peer_list); 
LIST_INIT(unchoked_peers); 

Tuy nhiên, tôi không hiểu làm thế nào LIST_ENTRY yếu tố vào việc sử dụng danh sách. Từ trang man, nó nói: "Macro LIST_ENTRY tuyên bố một cấu trúc kết nối các phần tử trong danh sách", nhưng tôi thực sự không hiểu ý nghĩa của nó.

Tại sao tôi muốn khai báo cấu trúc để kết nối các yếu tố trong danh sách? Không nên mỗi nút được kết nối với nút tiếp theo thông qua một con trỏ, như triển khai danh sách liên kết ban đầu của tôi? Làm cách nào để thay thế danh sách được liên kết của tôi bằng cách triển khai được cung cấp bởi sys/queue.h? Làm cách nào để chèn một phần tử vào danh sách?

Trả lời

25

LIST_ENTRY tạo các trường để đưa vào cấu trúc của bạn phù hợp để liên kết các phần tử, do đó bạn không phải lo lắng về bản thân với các chi tiết cụ thể của các con trỏ đó.

struct foo { 
    int a, b, c; 
    /* This is instead of "struct foo *next" */ 
    LIST_ENTRY(foo) pointers; 
}; 

Để sau đó tạo ra một danh sách mà bạn muốn sử dụng LIST_HEAD():

struct Torrent { 
    LIST_HEAD(foo_list, foo) bar; 
}; 

Bạn có thể khởi tạo tiêu đề danh sách sử dụng LIST_INIT():

struct Torrent t; 
LIST_INIT(&t.bar); 

Bạn có thể chèn các yếu tố sử dụng các macro LIST_INSERT _ *():

struct foo *item = malloc(sizeof(struct foo)); 
LIST_INSERT_HEAD(&t.bar, item, pointers); 

này được lấy từ ví dụ danh sách trong trang người đàn ông ở http://www.manpagez.com/man/3/queue/

Đối với một ví dụ đầy đủ: http://www.ideone.com/T1EID

+0

Hi, tôi đang tìm một ví dụ sử dụng toàn diện cho hàng đợi dựa trên ' 'và nó có vẻ như liên kết ví dụ không còn hợp lệ .. có lẽ bạn có một Liên kết thay thế không? – osxUser

Các vấn đề liên quan