我需要知道,如何将整数从stdin中保存到数组中,这是由第一个整数在排队中给出的... ehm ...希望您能理解。我会给你一个例子。
在stdin上我有:
0 : [ 1, 2, 3 ]
5 : [ 10, 11, 12, 13]
6 : [ 2, 4, 9 ]
0 : [ 4, 9, 8 ]
5 : [ 9, 6, 7 ]
5 : [ 1 ]
我需要将这些整数保存到这样的数组中:
0={1, 2, 3, 4, 9, 8}
5={10, 11, 12, 13, 9, 6, 7, 1}
6={2, 4, 9}
我绝对不做什么。存在一个问题,即数组数(在这种情况下-0、5、6-因此3个数组)可能很高,我需要有效地与内存一起工作...所以我想我需要诸如malloc
和之类的东西free
解决了这个问题,还是我错了?数组(0、5、6)的名称可以更改。括号中的整数数量没有最大限制。
感谢您的任何帮助。
我有假设,这是家庭作业,我做了这个假设,这不是您的第一个作业,所以我不会为您提供解决方案,而是一些解决方案可以帮助您自己解决的技巧。
给定输入线
5:[10,11,12,13]
我将调用" 5"数组名称"和10、11、12和13要添加的值。
- 您应该实现一些系统以将数组名称映射到索引。一种微不足道的方法就是这样:
。
size_t num_arrays;
size_t * array_names;
在这里,在您的示例输入中,num_arrays
最终将用3
为CC_4。如果找到一个新数组名称,请添加新数组名称。您也需要值的实际数组:
int * * array;
您需要为每个新数组名称(就像您的 realloc
array_names一样)为realloc
数组。array[0]
将表示数组array_names[0]
此处阵列0
,array[1]
将代表阵列array_names[1]
此处阵列5
,并且array[2]
将代表阵列array_names[2]
这里的CC_16数组6
。
要访问数组,找到像这样的索引:
size_t index;
for (size_t index = 0; index < num_arrays && array_names[index] != search; ++index) ;
- 第二步很容易。一旦找出出来,您需要使用数组[索引]添加elemens,
realloc
(array[index] = realloc(array[index], new size)
)并在那里添加元素array[index][i+old_size] = new_value[i]
。
显然,您还需要跟踪单独的数组中的元素数量;)
提示:如果搜索数组名称花费太长,则必须通过一些更复杂的数据结构(例如哈希地图或二进制搜索树)替换该琐碎的映射部分。其余的概念可能会或多或少地保持不变。
我建议您是否有问题来解析输入行,您打开一个针对此解析部分的新问题。
在算法术语中,您需要从 int
s到数组的地图(关联数组)。这是很久以前在大多数高级语言中解决的。
如果您必须手动实施它,则有一些选择:
- 简单的"主"阵列,您在其中存储0、5、6、1000000,然后 map 每次在
for
中进行搜索时,您必须访问0、1、2、3它(
时太耗时了 - 哈希表:写简单的哈希函数,以映射0、5、6、1000000(它们称为键)到小于1000的值,分配1000个元素的数组,然后为每个哈希函数制作"主"数组结构;
- 某种树(例如红黑树),手动实现可能有点复杂。
最后两个结构是编程经典的一部分,在各种文章和书籍中都得到了很好的描述。