我是C语言的新手,正在练习一些常见数据结构的实现。您能否解释为什么在执行列表操作(例如push_front)时首选双指针,而不是使用SList包装器包含对head以及列表的size的引用,即Java方式如下所示。

typedef
struct SListNode
{
    int value;
    struct SListNode* next;
} SListNode;

typedef
struct SList
{
    /* Private members */
    int size;
    SListNode* head;
} SList;

/* API */
typedef
struct SListInterface
{
    int (*get_size)(SList*);
    bool (*empty)(SList*);
    SListNode* (*push_front)(SList*);
} SListInterface;

/* API Implementation */
int
get_size(SList* list)
{
    return list->size;
}

bool
empty(SList* list)
{
    return list->head == NULL;
}

SListNode*
push_front(int value, SList* list)
{
    SListNode* node = (SListNode*) malloc(sizeof(SListNode));
    node->value = value;
    node->next = list->head;
    list->head = node;
    list->size++;
}

SList*
List(void)
{
    SList* list = (SList*) malloc(sizeof(SList));
    list->size = 0;
    list->head = NULL;

    return list;
}

SListInterface*
Interface(void)
{
    SListInterface* interface = (SListInterface*) malloc(sizeof(SListInterface));
    interface->get_size = get_size;
    interface->is_empty = is_empty;

    return interface;
}

最佳答案

这是“我们如何设计解决方案”和“我们如何希望其他人访问库”的问题。

此特定问题可以被视为“抽象”问题。通常,在OOPS概念中考虑抽象,但是它也是C等过程编程的一部分。在C语言中,可以使用static关键字在某种程度上获得抽象。

在这里,没有对与错。我们可以提供一个包装器,以使访问列表更加抽象,只考虑数据,但是这也会增加维护包装器的复杂性。另外,由于C不支持泛型,因此对于不同的数据类型,您将需要不同的包装器/结构,或者,您将需要将数据存储空间设置为void *,并为列表保留类型。

因此,添加包装器可以使列表使用对其用户变得简单,但是将其维护在开发人员级别将很复杂且容易出错。

关于c - 使用C中的链接数据结构时的双指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50493607/

10-12 16:18
查看更多