C通用双链表每个节点持有多个项目

标签 c generics linked-list

我正在尝试设计一个通用链表,其中每个节点可以存储多个项目,例如颜色、形状和大小。

这是我的 .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;
    }
}

我有 printIntListprintDoubleListprintStringList。有什么办法可以将它们组合起来吗?

谢谢!

最佳答案

您需要考虑每个元素定义的项是否真的是动态的。颜色、大小、形状是否限制了您需要存储的内容?

如果这就是您真正需要的,为什么不保持简单并尽量减少间接/内存分配:

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/

相关文章:

c - 使用 LibJpeg 将 YUV 转换为 jpeg 时出现段错误

c - 使用C中的数据结构实现堆栈

c - 重新定位单链表中的节点会导致无限循环

java - 如何在Java类层次结构中实现泛型类型安全的深度克隆?

c# - 在 C# 中传递通用列表 <>

c - 使用函数释放双指针链表

java - 比较 Java 中的堆栈弹出和队列出队(回文)

c - 冒泡排序到 char 指针

c - 当输入长度未知时,如何读取以逗号分隔的数字?

ios - (空)协议(protocol)符合测试