2010-11-15 34 views
5

Có triển khai thực hiện cấu trúc dữ liệu hàng đợi nào với "C" hay tôi phải tự phát triển (điều này là dành cho một dự án trường học, vì vậy tôi phải sử dụng cái gì đó tồn tại trong cài đặt gcc chuẩn hoặc phải thực hiện bản thân mình!)Có triển khai hàng đợi chuẩn cho C không?

Còn về các cấu trúc dữ liệu chung khác như Danh sách được liên kết, Ngăn xếp, v.v ...?

Cảm ơn

+0

http://stackoverflow.com/questions/1819416/standard-data-structure-library-in-c http://stackoverflow.com/questions/14001652/does-standard-c-library-provides-linked-list-etc-data-structures –

Trả lời

2

Bạn phải tự triển khai. C có rất ít cấu trúc dữ liệu và buộc bạn phải sử dụng các thủ thuật để thực hiện các loại dữ liệu trừu tượng: xem một bài viết có tiêu đề “Các kiểu chưa hoàn thành như trừu tượng” nếu bạn có thể tìm thấy hoặc xem các nguyên tắc được áp dụng như thế nào PolarSSL's bignum.h file. Mặt khác, C++ cho phép bạn thực hiện khá nhiều thứ bạn có thể làm trong C và cung cấp cho bạn các cách để triển khai các cấu trúc dữ liệu trừu tượng.

+0

... và C++ có loại hàng đợi trong STL trong mọi trường hợp. – Clifford

0

GDSL sẽ là một nơi tuyệt vời để bắt đầu. This thread cung cấp cho một vài người khác.

+0

Điều đó có vẻ giống như một thư viện. Trừ khi nó đi kèm với gcc sau đó nó không phải của bất kỳ sử dụng với tôi. –

+2

Hmm. Có vẻ như một yêu cầu kỳ lạ ... sau khi tất cả những gì bạn sẽ sử dụng sẽ ở trong một số thư viện hoặc khác. Không thể nhìn thấy vấn đề trừ khi dự án là về cấu trúc dữ liệu, nhưng tôi không phải là người điều tra của bạn! – spender

0

Bạn phải triển khai cấu trúc dữ liệu của riêng mình, nhưng có nhiều thư viện cấu trúc dữ liệu ngoài đó.

1

Bạn có thể sử dụng named pipe. Đó là cấu trúc dữ liệu FIFO và là một phần của tiêu chuẩn posix. Nếu tất cả các bạn muốn là enque để trở lại và loại bỏ từ phía trước nó sẽ làm việc. Bạn sẽ cần phải theo dõi các ranh giới thông điệp bằng tay, có lẽ bằng cách có phần tử đầu tiên là số byte trong thư tiếp theo.

+0

Điều này sẽ chậm và không di động, cũng như đòi hỏi sự hiểu biết về các cuộc gọi hệ thống Unix để gỡ lỗi nó. –

+1

@larsmans: Tôi nghĩ rằng đó là một câu trả lời hợp lý cho các thẻ câu hỏi. – Clifford

21

Hãy thử điều này. Unix đi kèm với một số loại danh sách được liên kết - bạn có thể sử dụng một trong số chúng để tạo các cấu trúc dựa trên danh sách có thể khác như ngăn xếp.

man queue 
+3

+1, với nhận xét rằng đây không phải là giao diện chuẩn. Linux, BSD và tôi nghĩ rằng Mac OS X cung cấp nó, mặc dù. –

+0

Không phải về mặt kỹ thuật câu trả lời đúng nhưng điều này chắc chắn là hella hữu ích^_ ^ – Goahnary

0

Nếu đây là "dự án trường học" thì việc thực hiện cấu trúc dữ liệu của riêng bạn có thể nằm trong lược đồ đánh dấu và sử dụng cuộc gọi thư viện có thể ngăn người kiểm tra trao các điểm đó.

Thư viện chuẩn ISO C không chứa cấu trúc dữ liệu như vậy, nhưng GNU libc không chỉ bao gồm tiêu chuẩn ISO. Điều này bao gồm Pipes and FIFOs có thể đáp ứng các yêu cầu của bạn.

0

Không có tiêu chuẩn exacly, nhưng nhiều hệ thống có bsd/sys/queue.hbsd/sys/tree.h là thư viện dựa trên macro.

Xem documentation here.

0

Sử dụng BSB lib. sys/queue.h và sys/tree.h có triển khai các danh sách và cây khác nhau.

0

số Nhưng đây là một việc thực hiện rất đơn giản:

typedef struct node { 
    int val; 
    struct node *next; 
} node_t; 

void enqueue(node_t **head, int val) { 
    node_t *new_node = malloc(sizeof(node_t)); 
    if (!new_node) return; 

    new_node->val = val; 
    new_node->next = *head; 

    *head = new_node; 
} 

int dequeue(node_t **head) { 
    node_t *current, *prev = NULL; 
    int retval = -1; 

    if (*head == NULL) return -1; 

    current = *head; 
    while (current->next != NULL) { 
     prev = current; 
     current = current->next; 
    } 

    retval = current->val; 
    free(current); 

    if (prev) 
     prev->next = NULL; 
    else 
     *head = NULL; 

    return retval; 
} 

nguồn Complete here

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