从书中跳过列表源代码,结构让我很困惑

时间:2013-09-12 02:12:28

标签: c algorithm linked-list

我用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;

或者我错过了什么?

1 个答案:

答案 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在下面的评论中提出了两个非常好的观点。