我想从文本文件中读取矩阵,例如:

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


第一行表示行和列的大小。然后,我应该读取矩阵中的数据并使用它们创建一个链接列表。我还应该找到总和矩阵(这不是问题)。我写了一些东西,但是我认为它不是链表的实现;它只是结构的二维数组。我做/认为错了吗?你能给我什么建议吗?

最佳答案

希望以下内容能帮助您入门

首先,在singly_linked_list处签出代码。它具有您需要的所有内容,并进行了精心布置和说明-构造NODE,创建,添加和foreach /遍历。实际上,该页面还有很多其他功能。

一些伪代码:


获取行,col //您已经知道了
编写一个辅助函数NODE* process_line(line, col),该函数解析从文件中读取的行,对其进行标记化,执行atoi,然后返回包含该行的链接列表。它可能返回null来指示错误,例如值不足,非整数等。如果返回null,则必须释放内存。
您需要1个主链表来存储行。此链表中的每个节点本身就是一个代表行的链表。 (另一种可能的解决方案是,每行仅由已知长度的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。原谅我的编码风格和任何错误。如果在求和时采用有效矩阵,则可以进一步简化。

关于c - 具有链接列表实现的矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27073369/

10-11 14:02