c - C 中存储字符串的链表或数组

标签 c arrays string linked-list

在 C 中,我需要存储一个可能相对较大(数千个项目)的短字符串 (char*) 列表。
字符串可以删除或插入,但不能修改,并且顺序并不重要。
我不知道什么是更有效的数据结构来做到这一点。
我可以使用一个结构:

struct node_s {
  char *str;
  node_s *next;
}

或 char * 数组:

char **strings;

我不需要直接访问字符串,我只需要它们存在,因为旁边的另一个数据结构(基数特里)维护着字符串某些部分的指针。

最佳答案

当您在初始化时不知道条目的确切数量时,使用链表通常比使用数组更好。

数组有固定的大小。当您不知道将有多少条目并且想要使用数组时,您有两种选择。要么分配一个比您需要的任何东西都大得多的数组,这会浪费大量内存(而且,通常很难提前知道合理的上限应该是多少)。或者你从一个小数组开始,等到它满了。然后分配一个更大的新数组,将所有条目复制到新数组并释放旧数组,这是对 CPU 周期的巨大浪费。

但是使用链接列表,您就不会遇到这个问题,因为它们可以动态增长和收缩。

但要注意各种操作运行时的差异。

在数组中,通过索引获取元素非常快。但是,删除具有特定索引的元素而不留下空条目的成本非常昂贵,因为后面的每个元素都必须向后移动一个索引。在中间插入一个条目而不覆盖现有条目同样昂贵,因为您必须将后面的所有内容向前移动一位。

使用链表,删除或插入中间的节点速度很快(当您已经拥有其前驱节点时),因为除了插入的节点及其前驱节点之外,不需要触及任何节点。但是找到必须执行此操作的节点可能会很昂贵,因为您必须跟踪之前的所有节点的链接。

当您需要快速查找和快速插入/删除时,请使用 binary tree是一个很好的妥协。

关于c - C 中存储字符串的链表或数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822115/

相关文章:

c# - 如何始终如一地读取间歇性硬盘驱动器?

c - 为什么 Knuth 使用这种笨拙的减量?

javascript - Javascript 中连接数组的不同值

php - 从大数组中读取

javascript - 调用 Array.prototype.slice 时 Firefox 错误 'setting a property that only has a getter'

c - 在两个 channel 上播放单声道 WAV

c - 共享内存段内的指针

c# - 如何将这个字符串拆分成 Dictionary<string,string>?

python - 我如何转换像 123245wkjsvd :/' to list and sort? 这样的字符串

android - 在android中读取xml文件 - 解析