我用Google搜索跳过列表并找到了一本书“算法简介” http://epaperpress.com/sortsearch/index.html 并从以下获取跳过列表教程示例 http://epaperpress.com/sortsearch/skl.html
有一个运行良好的skl.c但是当我研究代码时,我找到了一些东西 让我感到困惑,表现为以下几点:
typedef int keyType; /* type of key */
/* user data stored in tree */
typedef struct {
int stuff; /* optional related data */
} recType;
/* levels range from (0 .. MAXLEVEL) */
#define MAXLEVEL 15
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[1]; /* skip list forward pointer */
} nodeType;
/* implementation independent declarations */
typedef struct {
nodeType *hdr; /* list Header */
int listLevel; /* current level of list */
} SkipList;
SkipList list; /* skip list information */
并且功能让我困惑如下:
void initList() {
int i;
/**************************
* initialize skip list *
**************************/
if ((list.hdr = malloc(
sizeof(nodeType) + MAXLEVEL*sizeof(nodeType *))) == 0) {
printf ("insufficient memory (initList)\n");
exit(1);
}
for (i = 0; i <= MAXLEVEL; i++)
list.hdr->forward[i] = NIL;
list.listLevel = 0;
}
在这个测试中看起来MAXLEVEL = 15,所以在initList()中,它会做list.hdr-&gt; forward [0] = NIL; to list.hdr-&gt; forward [15] = NIL;并且看一下nodeType结构,它有正向var struct nodeTag * forward [1]; ,而不是struct nodeTag * forward [MAXLEVEL];
我认为正确的结构应该是:
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[MAXLEVEL]; /* skip list forward pointer */
} nodeType;
不是
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[1]; /* skip list forward pointer */
} nodeType;
或者我错过了什么?
答案 0 :(得分:1)
我认为原件是正确的。
仔细看看这个malloc:
list.hdr = malloc(sizeof(nodeType) + MAXLEVEL*sizeof(nodeType *)));
注意表达式中的MAXLEVEL * sizeof(nodeType *)。这是做什么的分配 单个malloc中的nodeType AND MAXLEVEL * nodeType *。所以这是分配 节点和nodeType *的数组。这是因为数组是最后一个 结构中的字段。所以节点和数组是一个连续的部分 记忆
argubly更正确的是typedef
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[0]; /* skip list forward pointer */
} nodeType;
注意零数组大小。
当与上面的malloc表达式一起使用时,这是一个常见的C语言。它允许你 在运行时而不是编译时决定数组大小。但请记住 数组必须是struct中的最后一个字段。
Rici在下面的评论中提出了两个非常好的观点。