如何静态实现两个节点数组......并且还能有效地实现?

时间:2017-05-31 20:01:36

标签: c arrays static

typedef struct NodeStruct NODE;
typedef struct ListStruct LIST; 

struct NodeStruct {
  void *item;
  NODE *previous;
  NODE *next;
  int location;
};

struct ListStruct {
  int ListSize;
  NODE *HeadNode;
  NODE *CurrentNode;
  NODE *TailNode;
  NODE NodeArray[MaxNode];
};

NODE *HeadArray[MaxHead];
static int HeadCount = -1;
int HeadCurrent = 0;
int i;

C的相当新,抱歉听起来非常缺乏经验......

我想在不使用malloc()或free()的情况下实现LIST抽象数据类型,因此将节点存储在静态分配的数组中。 每个列表元素都是一个节点,并且可以包含一个"项目"。 我需要能够使用next和previous来遍历节点,并且具有" current"," tail"," head&#34 ;.

还有两个数组......一个指向"指向"的指针数组,因此对于每个头,有一个"节点"的数组。我还需要能够将当前项目更改为列表中间(或前端或末尾)的任何位置,能够删除该节点,然后以某种方式(这是最令人困惑的部分对我来说,能够再次使用阵列中的那个点,但是,我无法遍历列表以找到一个免费的'节点,因为它没有效率。

我还需要为" head"做同样的事情。数组,所以,有一个最大数量的列表的概念(这意味着头数组已满),我还需要能够删除整个节点数组(这反过来意味着我必须能够从该列表中删除一个头节点,如果我需要那个空间,可以某种方式将其放回那里)。

问题是我在尝试实现这个问题时遇到了可怕的时间!上面的代码是到目前为止我一直在使用的结构,我尝试了两种不同的想法:

1:每次我们"删除"来自阵列的节点(就我而言,它只是将它的ITEM设置为NULL并将其连接的节点连接到彼此之前和之前的相互之间),我们将数组中最右边的节点移动到这个位置。当我们添加一个新节点时,我们总是将它添加到该位置。所以,没有搜索,但绝对是一个噩梦(根据我的经验)。

2:有一个单独的列表(堆栈)"空闲节点",我可以从需要新节点时获取。但是,这意味着我必须最初创建所有这些节点,并且可能不使用它们,这在内存方面不是很好。

我真正想做的事情,无法弄清楚,如下:

对于" head" array:我们有一个指针数组,指向" head"每个节点。 对于每个人来说"我们最初有一个空的节点数组。 对于每个空的节点数组,我们还有一个" free"指针,指向数组中每个自由点的指针,当我们插入一个新项时,我们获取该指针数组的顶部地址以及新节点将放置在节点数组中的位置。当我们从节点数组中删除时,我们将那些节点地址放在堆栈顶部。

然而,我仍然坚持ListCreate的样子,因为它只是一个空的节点数组,而且头部阵列实际上并没有指向任何东西。

这些是我正在处理的规范,因此我无法过多地更改要求。也就是说,我不能有头指针数组。

关于如何有效实施这些要求以及满足这些要求的任何想法?我只需要帮助设置结构以及列出的内容'将看起来像和操纵节点背后的一般想法。我希望能把所有其他事情都搞清楚。我真的坚持一个普遍有效的想法。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您要为每个列表使用节点指针数组,我不认为需要使用链接列表概念,如节点中的上一个和下一个指针,而是代码可以是面向数组的。

问题表明删除节点是通过用数组中的最后一个节点替换要删除的节点来完成的,因此不保留数组顺序。我假设通过将一个节点附加到数组的末尾来完成添加节点。

每个数组结构都可以包含元素数,当前元素的索引和指针数组。

元素的空闲池(静态分配)可能有一个结构,其余的结构最初都是空的(count == 0)。元素将被删除或添加到空闲池指针数组的末尾,类似于堆栈。

项目信息可以包含在元素结构中,而不是通过元素结构中的指针处理。

从当前位置删除节点的逻辑:

    free[count] = list[current];
    free.count++;
    list.count--;
    if(list.count != 0)
        list[current] = list[count];

附加节点的逻辑:

    if(free.count != 0){
        free.count--;
        list[count] = free[count];
        list.count++;
    }