2012-03-20 28 views
9

Tôi đang học C và cố gắng thực hiện thô sơ một danh sách liên kết trong C. Câu chuyện dài ngắn Tôi có một cấu trúc chỉ chứa một con trỏ rỗng (phần tử) và một con trỏ khác đến nút tiếp theo (mã để làm theo) Câu hỏi của tôi là, khi đi qua nút đầu và một số nút khác vào một hàm mới, có cách nào để đảm bảo hai phần tử có cùng loại không? Hai nút sẽ có thể chứa bất kỳ loại dữ liệu nào. Ive đã thử so sánh với sizeof(), nhưng tôi không thể suy ra một con trỏ void. Cảm ơn trước!Có cách nào để so sánh hai con trỏ void để khẳng định cùng loại trong C?

struct Node{ 
    void* element; 
    struct Node* next; 
} 

Đây là mã cho các nút, tôi chỉ cần cách so sánh chúng để khẳng định danh sách được liên kết với tất cả các loại phần tử giống nhau! Cảm ơn!

+1

Thực sự tôi không thấy tác hại trong việc cho phép các loại khác nhau trong các nút. Tôi không thực sự thấy việc sử dụng nó, nhưng tôi sẽ chỉ tin vào mã gọi điện thoại để không làm điều gì đó kỳ quặc như thế trừ khi người viết nó thực sự muốn. – Corbin

+0

Bạn có thể làm 'if (a-> element == b-> element) {/ * cùng loại * /} else {/ * có thể không cùng loại * /}': P –

+1

Nếu đó là con trỏ đến cùng một vị trí trong trí nhớ? Điều đó có vẻ rất vô nghĩa. – Corbin

Trả lời

8

Không - bạn thường muốn tránh một thiết kế như thế này, nhưng nếu bạn thực sự không thể tránh nó, bạn thường cần phải đặt một enum trong nút để cho bạn biết loại dữ liệu chứa.

+0

Bạn có thể vui lòng nói thêm về việc có một cấu trúc bên trong cho kiểu dữ liệu không? – vidit

+2

Chắc chắn - về cơ bản bạn chỉ làm một cái gì đó như 'enum types {T_CHAR, T_SHORT, T_INT, T_LONG, T_FLOAT , T_DOUBLE}; '(với tên cho bất kỳ loại nào khác mà bạn quan tâm) và đặt giá trị tương ứng với loại bạn đang lưu trữ. Vấn đề lớn là mở rộng nó (bạn phải chỉnh sửa' enum' mỗi khi bạn thêm cùng với đó bạn (thông thường) cần một câu lệnh switch 'switch (type) {case T_CHAR: use_char ((char) x.value); case T_SHORT: use_short ((short) x.value);/* ... * /} ' –

+3

Cách tốt hơn có thể là sử dụng một cái gì đó như' typedef struct {enum type type; int i;} số nguyên; 'cho mỗi loại bạn sẽ cần (trong đó' enum type' định nghĩa một giá trị riêng biệt cho mỗi 'struct') và sử dụng các kiểu này thay cho các số nguyên nguyên - nhưng sau đó bạn về mặt kỹ thuật không sử dụng một' void * 'nhưng một' enum t ype * 'và bạn cũng có thể làm cho nó rõ ràng. Nếu bạn chọn cách tiếp cận này, một vài macro (hoặc x-macro) có thể cắt bỏ một số sự lặp lại nếu bạn sống ở một quốc gia nơi macro hợp pháp. –

1

Khoảng trống * chính xác là một con trỏ không có loại. Nói cách khác, tất cả những gì chương trình của bạn biết là nó là con trỏ đến SOMETHING. Điều này là hữu ích, nhưng nó đặc biệt (cố ý) không phải là những gì bạn đang tìm kiếm.

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