2014-11-22 58 views
0

我想從像文本文件中讀取矩陣:矩陣與鏈表實現

2 3 
52 7 100 
90 36 90 
22 35 62 
56 51 23 
58 98 74 
86 32 45 

第一行顯示的行和列的大小。然後,我應該讀取矩陣中的數據並創建一個鏈表。我也應該找到總和矩陣(這不是問題)。我寫了一些東西,但我認爲這不是鏈接列表實現;它只是2維結構數組。我認爲/錯誤嗎?你能給我任何建議嗎?

+0

你的直覺是對的!就谷歌而言,K&R應該有一個例子。 – Dinesh 2014-11-22 02:53:43

+0

謝謝。我已經搜索,但我找不到對我有用。我應該再寫一遍嗎? – tgcndr 2014-11-22 03:03:27

+0

請參閱['while(!feof(file))'總是錯誤](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong)。 – 2014-11-22 03:13:47

回答

1

我希望以下將幫助您開始

首先,在singly_linked_list檢查代碼。它擁有你需要的一切,很好地佈置和解釋 - 結構NODE,創建,前置和foreach /遍歷。實際上,該頁面提供了更多內容。

一些僞代碼:

  1. GET行,列//你已經得到它

  2. 寫一個輔助函數NODE* process_line(line, col),它解析已經從文件中讀取一行,它標記化,不atoi,並返回一個包含該行的鏈接列表。它可以返回null來指示錯誤,例如沒有足夠的值,非整數等。如果返回null,則必須釋放內存。

  3. 您需要一個存儲行的主鏈表。此鏈接列表中的每個節點本身都是表示該行的鏈接列表。 (另一個可能的解決方案可能是每行僅由一個已知​​長度的int數組表示)。

  4. 逐行讀取文件。處理該行以獲取適當表示形式的行(我假設的鏈接列表)。將其推入行的主要鏈接列表作爲另一個節點

  5. 要計算總和,您需要遍歷外部鏈接列表。爲了處理這個中的每一行/節點,你需要遍歷該行鏈表。

迭代鏈表容易

// 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。原諒我的編碼風格和任何錯誤。如果在達到求和時假定有效矩陣,則可以進一步簡化。

+0

非常感謝您的幫助! – tgcndr 2014-11-22 15:16:54