我是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/