2010-10-21 33 views
28

Tôi đang viết một LinkedList trong C, đoạn mã dưới đây thể hiện định nghĩa Node của tôi.Làm thế nào để xác định một cấu trúc typedef có chứa con trỏ cho chính nó?

typedef struct { 
    int value; 
    struct Node* next; 
    struct Node* prev; 
} Node; 

Tôi hiểu (hoặc nghĩ rằng tôi làm) rằng struct Node không giống như typedef struct Node. Cấp mã của tôi biên dịch và chạy như nó được cho là, tuy nhiên, tôi nhận được rất nhiều cảnh báo khi gán nextprev (cảnh báo: chuyển nhượng từ loại con trỏ không tương thích). Tôi đoán rằng điều này có liên quan đến cách tôi định nghĩa chúng trong cấu trúc Node. Tôi đã tải lên nguồn đầy đủ here

Vì vậy, nếu đó thực sự là vấn đề, làm thế nào tôi nên xác định nextprev bên trong typedef struct Node?

Tôi đã lo lắng điều này có thể là một repost, nhưng không thể tìm thấy những gì tôi đang tìm kiếm. Cảm ơn.

+0

Danh sách được liên kết của bạn trông rất lạ đối với tôi. Khi bạn có trước và sau đó tại sao bạn cần đầu và đuôi sau đó? Tìm một danh sách được liên kết tốt trong c và học hỏi từ nó. Tôi sẽ giới thiệu thư viện Apache Runtime. Tôi nghĩ rằng nó có một danh sách liên kết. – frast

+2

có con trỏ để đầu và đuôi làm cho nối thêm và thêm O (1) thay vì O (n). Hãy cho tôi biết nếu bạn thấy các lỗi khác vì đây chủ yếu chỉ là một bài tập để giữ cho các kỹ năng C của tôi có chút tươi mới sau tất cả những năm Java này .. –

Trả lời

55

Bạn cần phải làm điều đó theo thứ tự này:

typedef struct Node Node; 

struct Node 
{ 
    int value; 
    Node *next; 
    Node *prev; 
}; 

Điều đó không thực hiện chính xác những gì bạn hỏi, nhưng nó giải quyết vấn đề và là cách thường này được thực hiện. Tôi không nghĩ có cách nào tốt hơn.

Loại khai báo chuyển tiếp này có cách sử dụng thứ hai, trong ẩn dữ liệu. Nếu danh sách đã được thực hiện trong thư viện, bạn có thể có chỉ là typedef trong tiêu đề công cộng, cùng với các chức năng như:

Node * list_new(void); 
Node * list_append(Node *head, Node *new_tail); 
size_t list_length(const Node *head); 

Bằng cách này, người sử dụng của thư viện không có dễ dàng truy cập vào bên trong của bạn thư viện, tức là các trường của cấu trúc Node.

+2

Có. Một tờ khai chuyển tiếp (http://en.wikipedia.org/wiki/Forward_declaration) là chính xác những gì cần thiết. –

+0

Oh wow. Tôi nghĩ tôi đã thử mọi sự kết hợp ngoại trừ cái kết hợp đó! cảm ơn! cảnh báo tất cả đã biến mất! :) –

+0

Phải, tôi biết các khai báo trước và sử dụng chúng trong suốt C++, nhưng chưa bao giờ có trường hợp cụ thể này xuất hiện trước đây, hãy để một mình với typedef/structs :) –

17

Một cách khác có thể chấp nhận và với sự thay đổi ít nhất để mã OP là như sau:

typedef struct NodeT { 
    int value; 
    struct NodeT * next; 
    struct NodeT * prev; 
} Node; 

Lưu ý sự ra đời của NodeT và sử dụng của nó trong nextprev cho đến khi Node có sẵn.

+0

Đây thực sự là những gì tôi đã làm khi triển khai. :) theo nhận xét của @R .. –

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