具有链接列表实现的矩阵

时间:2014-11-22 02:23:37

标签: c arrays matrix multidimensional-array

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

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

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

1 个答案:

答案 0 :(得分:1)

我希望以下内容可以帮助您入门

首先,查看singly_linked_list处的代码。它拥有您需要的一切,精心布局和解释 - struct NODE,create,prepend和foreach / traversal。实际上,该页面还有更多内容可供选择。

一些伪代码:

  1. 获取行,col //你已经得到了它

  2. 编写一个帮助函数NODE* process_line(line, col),它解析从文件中读取的行,对其进行标记,执行atoi,并返回包含该行的链接列表。它可以返回null来指示错误,例如没有足够的值,非整数等。如果要返回null,必须释放内存。

  3. 您需要1个存储行的主链接列表。此链接列表中的每个节点本身都是表示该行的链接列表。 (另一种可能的解决方案是每行只用一个已知长度的整数数组表示。)

  4. 逐行读取文件。处理该行以获得合适的表示行(链接列表,我假设)。将其作为另一个节点

  5. 推入主链接列表中
  6. 要计算总和,您需要遍历外部链接列表。要处理此行中的每个行/节点,您需要遍历该行链接列表。

  7. 迭代链接列表很容易

    // 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。原谅我的编码风格和任何错误。如果在达到求和时假设有效矩阵,则可以进一步简化。