【发布时间】:2017-03-19 17:01:09
【问题描述】:
我得到了一个字符串数据列表。 10,20,30是行号
10. string 1
20. string 2
30. string 3
如果用户输入“23 字符串数据”。 23 是用户想要插入的行号。数据应该是这样的
10. string 1
20. string 2
23. string data
30. string 3
如果用户输入“40 个字符串数据”。数据应该是这样的
10. string 1
20. string 2
23. string data
30. string 3
40. string data
我对 C 的数据结构比较陌生。 我应该使用哪种数据结构来有效地存储此类数据?我目前的方向是实现动态数组或链表。但是,以下是我遇到的问题列表。
动态数组的问题:
- 使用行号作为索引并创建足够的空间 确保数组长度总是大于或等于最高线 数字。为未使用的索引浪费大量内存。
- 打印数据会是个问题。 例如。索引 0-9 没有分配内存。访问它会导致错误。需要想办法知道使用了哪些索引?
链表问题:
- 我无法跳转索引(不确定)。如何识别后面是哪一行 另一个并在其间轻松插入线?
【问题讨论】:
-
计算是关于权衡的。在您的情况下,您需要决定要权衡什么 - 内存与速度。只有您可以根据您的全部要求来回答。除了直接数组和链表,您可能还想查看哈希表。
-
您可以使用几乎任何您选择的结构。您不能使用“行号”对数组进行索引,因为它们的间距不均匀。这意味着您将进行线性搜索 - 链表可以说更好(至少,在中间插入新行涉及更少的数据移动)。您已经在列表的当前节点和下一个节点中获得了所需的所有信息,以判断新行是否位于这两者之间,然后您可以轻松地进行插入。
-
@kaylum:散列可以让你找到一个特定的行号是否存在,但是在平均散列中找到例如 20 之后的下一个数字是相当困难的,不是吗?
-
@sudo:我不同意你的评价。对于必须线性搜索的结构,哈希表是错误的数据结构。鉴于链表的问题之一是无法“跳转索引”并且提到行相继出现,我认为排序很重要。
-
@sudo:如果列表足够大以保证它,“跳过列表”将是一个很好的改进(20 行可能不需要;可能对 1000 行有帮助;并且会有一个盈亏平衡点介于两者之间)。该描述让人想起(喘气)BASIC 中的行号。
标签: c arrays data-structures linked-list