我只是想知道该怎么做。我知道我应该使用malloc
,但我仍然不确定如何进行。
编辑:我意识到我实际想要使用的功能是realloc
我想分配的每一行的大小都会发生变化,而且我还想随着程序代码的进展添加更多的行。
如果你想知道为什么,我正在做一个项目,在这个项目中,我读取了一个.txt
文件,然后打印出出现次数最多的单词,以及出现次数。
对于想要读入行文件的情况,我建议您使用行的链表而不是行的数组,因为您可以通过保留指向最后一个元素的指针来轻松地附加到链表中(自己解决)。如果您愿意,以后可以将该链表转换为数组。
您还可以尝试计算文件的长度,并一次性为整个文件分配所有空间(然后可能一次读取整个文件),这样您就不必一直重新分配。再说一遍,你自己解决细节。
对于您的特定问题,实际上根本不需要将文件读入内存!您可以将单词与出现次数一起保存在trie或类似的数据结构中,并保留到目前为止计数最高的单词的链接。这并不复杂,但细节不在这个问题的范围之内。
根据程序的动态行为,我有几个想法。
首先,您可以考虑链表而不是数组。这将使元素的移除和添加变得非常容易。如果要减少行数,首先必须删除行中的所有元素,然后删除行元素本身。
使用链表的2D矩阵:
[[_]] -> [[_]] -> [[_]] -> [[_]] -> [[_]]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
其次,如果您通常只添加ADD元素,那么您的行的行为可能与C++向量类似。使用内部变量创建每一行,以跟踪填充级别。如果结构变满,则用更大的大小重新分配(有消息称"将大小增加一倍"是一种很好的通用方法)。
可以用来代替链表的数据结构(至少在一行内):
struct d_array(){
int fillevel, size;
void* memory;
}
这个数据结构在每次插入之前都需要一些函数来检查,如果它是满的,并根据需要进行realloc。收缩比较困难,可以尝试运行定期清理。一般来说,您不想过于急切地收缩,因为以后可能会再次需要空间(如果您的行再次增长)。
如果你想知道为什么,我正在做一个项目读取一个.txt文件,然后打印出数字最高的单词出现次数以及出现次数。
您不需要多维数组。文本按顺序存储,新行使用n
字符表示。
但是,您还需要一些关联容器,如地图,以便在解析文本文件时在其中存储唯一的单词。
在"伪代码"中:
for the entire text
parse a word
if word is not in the map insert it with count one
else find and increment the word's count
find the word with higher count value
不幸的是,C没有附带映射容器,您必须找到一个或自己编写一个,这可能仍然超出了您的编程能力。
至于单词的解析,您可以创建一个字符数组,表示有效的文本字符,如AaBbCcDd...
,并为文本的每个字符检查该数组中是否包含该字符。如果它被包含,而前一个不包含(或者这是第一个字符),则在单词开始的地方注册一个索引,如果它不包含,而之前有一个包含,则标记单词的末尾,从索引范围中提取单词,然后在映射中更新它。依此类推,直到你到达文本的末尾。
最后但同样重要的是,地图实际上是可选的。您也可以将单词条目存储为规则数组中char * word
和int count
的结构,但在多个单词的情况下,查找性能可能会很差,因为它将涉及大量字符串比较,而映射将对字符串进行散列并查找整数而不是字符串。