我正在尝试设计一个通用链表,其中每个节点可以存储多个项目,例如颜色、形状和大小。
这是我的 .h 文件的样子
typedef struct linked{
char type;
void * item;
struct linked * next;
struct linked * prev;
}LinkedList;
LinkedList * NewLinkedList();
LinkedList * next(Iterator **I);
int hasNext(Iterator *I);
void insertion(LinkedList **a, void *b);
void printStringList(LinkedList *L);
void printIntList(LinkedList *L);
void printDoubleList(LinkedList *L);
void delete(LinkedList *L, void *n);
我是否应该通过添加 void * item2 和 void * item3 ...来修改结构?或者是否有更好的方法。
我的第二个问题是:是否每次使用 void 指针时都必须对其进行类型转换?这是我的 printIntList
void printList(LinkedList *L)
{
LinkedList *tmp = NULL;
tmp = L;
while(L)
{
printf("%d\n",*(int*)L->item);
L=L->next;
}
}
我有 printIntList
、printDoubleList
和 printStringList
。有什么办法可以将它们组合起来吗?
谢谢!
最佳答案
您需要考虑每个元素定义的项是否真的是动态的。颜色、大小、形状是否限制了您需要存储的内容?
如果这就是您真正需要的,为什么不保持简单并尽量减少间接/内存分配:
enum ShapeFlags { sizeDefined = 0x01, colorDefined = 0x02, shapeDefined = 0x04 };
typedef struct shapeList {
ShapeFlags shapeFlags;
Size size;
Color color;
Shape shape;
struct Linked * next;
struct Linked * prev;
} ShapeList;
另一方面,如果您确实拥有一组非常动态的属性,则列表列表的替代方法可能是拥有一个带有哨兵的列表。
enum FieldFlag { terminator = 0x01, size = 0x02, color = 0x04, shape = 0x08 };
typedef struct list
{
FieldFlag type;
void* value;
struct list* next;
struct list* previous;
} List;
然后您可以正常迭代并使用 terminator
标志来了解对象的结尾。
关于C通用双链表每个节点持有多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15753926/