2016-11-27 80 views
0

我需要知道,如何将stdin中的整数保存到数组中,由行中的第一个整数给出...... Ehm ...希望你明白。我会给你一个例子。将整数保存到第一个整数给出的数组中

标准输入我:

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个数组)可以非常高,我需要与内存有效地工作...所以我想我会需要像mallocfree解决这个问题,还是我错了?数组的名称(0,5,6)可以更改。括号中的整数数量没有最大限制。

谢谢你的帮助。

+1

是的,使用'malloc'。继续尝试。 – kaylum

+0

至少尝试一些东西,只要开始,然后上传你的代码,如果你有问题。 – Sniper

+0

'fgets'来读取每一行。然后用某种解析代码来确定组号和项目。 'strtok'和'strtol'可以用于解析器,但是一个简单的'for'循环可能是相同数量的代码。对于内存管理,你需要'malloc'和'realloc'。后者是允许你的阵列增长的。最后,“免费”在最后。 – user3386109

回答

1

我去的假设,这是家庭作业,和我一起去的假设,这是不是你的第一个功课要做,所以我不会为您呈现的解决方案,而是一些技巧,将帮助您解决它自己。

鉴于输入线

5:[10,11,12,13]

我将称之为 “5” 中的 “阵列名称” 和10,11,12和13要添加的值。

  1. 您应该实现一些将数组名称映射到索引的系统。一个平凡的做法是这样的:

size_t num_arrays; 
size_t * array_names; 

这里,在你的榜样输入,num_arrays最终会被3array_names[3] = { 0, 5, 6}。如果您发现一个新的阵列名称,realloc并添加新的阵列名称。你也需要实际的阵列来值:

int * * array; 

需要realloc阵列为每个新阵列的名称(如你realloc array_names)。 array[0]将代表阵列array_names[0]这里阵列0array[1]将代表阵列array_names[1]这里阵列5array[2]将代表阵列array_names[2]这里阵列6

要访问的数组,发现它的指标像这样:

size_t index; 
for (size_t index = 0; index < num_arrays && array_names[index] != search; ++index) ; 
  • 第二步是容易的。一旦你想通了,你需要使用array [index]来添加elemens,realloc那一个(array[index] = realloc(array[index], new size))并且在那里添加元素array[index][i+old_size] = new_value[i]
  • 显然,你需要随时跟踪你的单独的数组元素的数量,以及;)

    提示:如果搜索的数组名花太长的时间,你将不得不更换琐碎映射部分由更复杂的数据结构组成,如哈希映射或二叉搜索树。其余概念可能保持不变。

    如果您在解析输入行时遇到问题,我建议您在此解析部分中打开一个特定的新问题。

    +0

    好的,感谢您的建议......我决定将所有整数保存到二维数组中,并且我的程序运行良好。但只有静态二维数组,所以我有内存问题... 我试图实现动态分配与'malloc'像这样: int ** array1 array1 = malloc(col * sizeof(int *)) ;对于(i = 0; i

    +0

    'array1 =(int **)realloc(array1,(maxCol + 1)* sizeof(int *)); array1 [i] =(int *)malloc(lines * sizeof(int));' 其中maxCol是我需要的新列数,行数是我需要的行数... 我试图在这里找到的东西,在stackoverflow,但我仍然有这个错误:/ 我应该创建这个问题的新线程? –

    +0

    是的,请发布一个新问题。在评论中给出这个答案有点乏味。我建议像“如何调整多维数组的大小”这样的标题。然后提供完整的源代码,以便我们提供具体的建议。另外,如果它能帮助你,请接受这个答案。 –

    0

    在算法方面,您需要从int到阵列的映射(关联数组)。很久以前,这在大多数高级语言中得到解决。

    如果你必须手动实现它,你有几种选择:

    • 简单的“大师”数组,其中存储您的0,5,6,1000000然后地图他们索引0, 1,2,3,通过在for中进行搜索,每次需要访问时(它太浪费时间;
    • 散列表:写简单的散列函数来映射0,5,6,1000000(它们被称为键)为小于1000的值,分配1000个元素的数组,然后为每个散列函数结果制作“主”阵列结构;
    • 某种树(例如红黑树),手动实现可能有点复杂。

    最后两个结构是编程经典的一部分,并在各种文章和书籍中有详细描述。

    相关问题