【发布时间】:2016-07-19 21:31:04
【问题描述】:
我想我对跳过列表的工作原理有一个基本的了解,但是除了作为 C 初学者之外,对它们来说是新手让我在一些方面感到困惑,尤其是列表的初始化。这是我要遵循的代码:
#define MAXSKIPLEVEL 5
typedef struct Node {
int data;
struct Node *next[1];
} Node;
typedef struct SkipList {
Node *header;
int level;
} SkipList;
// Initialize skip list
SkipList* initList() {
SkipList *list = calloc(1, sizeof(SkipList));
if ((list->header = calloc(1, sizeof(Node) + MAXSKIPLEVEL*sizeof(Node*))) == 0) {
printf("Memory Error\n");
exit(1);
}
for (int i = 0; i < MAXSKIPLEVEL; i++)
list->header->next[i] = list->header;
return list;
}
我还没有在 C 语言中对指针数组做过任何事情,所以我想我对它们的工作原理有点了解。如果有人愿意帮助我,我有几个问题。
首先,我sizeof(int) 得到了 4,sizeof(Node*) 得到了 8,所以我预计 sizeof(Node) 等于 12,但结果是 16,这是为什么呢?与其内容的大小相比,SkipList 的大小同样令人困惑。我把typedef 和[1] 拿出来看看是不是它们中的任何一个是原因,但大小仍然是16。
第二,为什么struct Node *next[1]中的[1]?以后需要list->header->next[i] 吗? next[i] 会高于 1 可以吗?是不是因为每个节点的指针数量是可变的,所以你把它变成一个数组,然后再单独增加它?
第三,为什么最初是list->header->next[i] = list->header而不是NULL?
非常感谢任何建议/cmets,谢谢。
【问题讨论】:
-
SkipList *list = calloc(1, sizeof(SkipList));- 你忘了检查这个是否失败。
标签: c arrays pointers skip-lists