2016-11-27 65 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個元素的數組,然後爲每個散列函數結果製作「主」陣列結構;
    • 某種樹(例如紅黑樹),手動實現可能有點複雜。

    最後兩個結構是編程經典的一部分,並在各種文章和書籍中有詳細描述。

    相關問題