文本编辑器中的双链接列表与数组

时间:2013-06-19 03:21:13

标签: c text-processing

我使用ncurses启动了一个实验代码编辑器。我正在使用双链表来存储/解析/打印文本。即使我已经深入实现,我还没有完全决定使用双链表是否是最好的想法(而不是使用数组)。

请注意,当我指的是数组时,我的意思是每行一个字符数组 - 而不是单个线性数组。

以下是我权衡利弊的方法:

双重链接列表:

  • 更快的角色和线条插入
  • 更快的代码折叠

阵列:

  • 使用更少的内存
  • 解析速度更快
  • 打印速度更快 我是否正确使用链接列表?或者,他们是更好的方式吗?

注意:

阵列的打印速度更快,因为只需要一次打印printw即可打印整行。与每个角色调用printw相反。

1 个答案:

答案 0 :(得分:1)

将评论转移到答案中,因为没有其他人正在切入。

为什么不使用(双向链接)字符串列表,其中列表中的每个项目都是一行,因此您可以像每个数组一样调用printw()一行?您还可以大幅降低存储需求;在64位计算机上,单个字符的双向链表可能会使用每个字符24个字节,这是一个相当高的开销。

  

我实际上刚刚开始这样做。它似乎是一个相当不错的妥协(我有预感,这是纳米使用的)。我可能会删除这个问题,因为我认为这是我将要解决的问题。另外,在每次插入/删除时都使用realloc()是个坏主意吗?

我可能会按以下方式设计列表节点:

struct Line
{
    struct Line *next;
    struct Line *prev;
    char        *line;
    size_t       line_len;
    size_t       line_max;
};

line_len记录当前行长度,line_max记录分配的空间。

删除字符时我不会调用realloc();除非在实际尺寸和最大尺寸之间存在相当大的(256字节?)差异,否则我可能不会这样做。

对于插入,我只会在没有空格时重新分配(当line_len == line_max时,但要注意一个一个)并且我将以至少16个字符的增量分配(因为这可能是无论如何malloc()等实际分配的最小金额,加上当用户插入一个字符时,他们经常插入几个字符)。因此,您希望避免每个字符更改内存分配(调用realloc()),而不必担心在必要时重新分配。