我想從像文本文件中讀取矩陣:矩陣與鏈表實現
2 3
52 7 100
90 36 90
22 35 62
56 51 23
58 98 74
86 32 45
第一行顯示的行和列的大小。然後,我應該讀取矩陣中的數據並創建一個鏈表。我也應該找到總和矩陣(這不是問題)。我寫了一些東西,但我認爲這不是鏈接列表實現;它只是2維結構數組。我認爲/錯誤嗎?你能給我任何建議嗎?
我想從像文本文件中讀取矩陣:矩陣與鏈表實現
2 3
52 7 100
90 36 90
22 35 62
56 51 23
58 98 74
86 32 45
第一行顯示的行和列的大小。然後,我應該讀取矩陣中的數據並創建一個鏈表。我也應該找到總和矩陣(這不是問題)。我寫了一些東西,但我認爲這不是鏈接列表實現;它只是2維結構數組。我認爲/錯誤嗎?你能給我任何建議嗎?
我希望以下將幫助您開始
首先,在singly_linked_list檢查代碼。它擁有你需要的一切,很好地佈置和解釋 - 結構NODE,創建,前置和foreach /遍歷。實際上,該頁面提供了更多內容。
一些僞代碼:
GET行,列//你已經得到它
寫一個輔助函數NODE* process_line(line, col)
,它解析已經從文件中讀取一行,它標記化,不atoi,並返回一個包含該行的鏈接列表。它可以返回null來指示錯誤,例如沒有足夠的值,非整數等。如果返回null,則必須釋放內存。
您需要一個存儲行的主鏈表。此鏈接列表中的每個節點本身都是表示該行的鏈接列表。 (另一個可能的解決方案可能是每行僅由一個已知長度的int數組表示)。
逐行讀取文件。處理該行以獲取適當表示形式的行(我假設的鏈接列表)。將其推入行的主要鏈接列表作爲另一個節點
要計算總和,您需要遍歷外部鏈接列表。爲了處理這個中的每一行/節點,你需要遍歷該行鏈表。
迭代鏈表容易
// modeling after
int list_foreach(NODE *node, int(*func)(void*))
{
while(node) {
if(func(node->data)!=0) return -1;
node=node->next;
}
return 0;
}
// a more general purpose traversal which tracks state (a reduce-like op)
int list_traverse(NODE *node, void* state, int(*func)(void* state, void*data))
{
while(node) {
if (func(state, node->data)!=0) return -1; // something broke
node=node->next;
}
return 0;
}
//你的實際求和函數
int sum_a_row(void* prev_state, void* data){
int* psum = (int*)prev_state;
*psum += (int)data;
return 0; // a successful summing
}
int sum_matrix(void* prev_state, void* data) {
NODE* row = (NODE*)data;
int* psum = (int*)prev_state;
int row_sum = 0;
int error = list_traverse(row, &row_sum, sum_a_row);
*psum += row_sum;
return 0; // success in summing
}
int matrix_sum = 0;
int error = list_traverse(matrix_head_node, &matrix_sum, sum_matrix);
HTH。原諒我的編碼風格和任何錯誤。如果在達到求和時假定有效矩陣,則可以進一步簡化。
非常感謝您的幫助! – tgcndr 2014-11-22 15:16:54
你的直覺是對的!就谷歌而言,K&R應該有一個例子。 – Dinesh 2014-11-22 02:53:43
謝謝。我已經搜索,但我找不到對我有用。我應該再寫一遍嗎? – tgcndr 2014-11-22 03:03:27
請參閱['while(!feof(file))'總是錯誤](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong)。 – 2014-11-22 03:13:47