【问题标题】:Finding the order i add elements to a 2d array查找我将元素添加到二维数组的顺序
【发布时间】:2018-04-23 19:54:28
【问题描述】:

所以我从一个充满零的矩阵开始,我定义了一个名为 Point 的结构,一个点具有我想要添加的值和添加该值的索引。例如,如果我添加的第一个元素是 3.4,它的索引是 1,下一个是 2,依此类推。

typedef struct 
{
int index;
double value;

}Point;



void adds(int line, int column, double value, Point matrix [100] [100] ){
static int c = 1;
matrix[line][column].value = value;
matrix[line][column].index = c;
c++;
}

我有向我想要的行和列添加值的结构和方法,我已经测试过并且值的索引在我添加它们时是正确的。我有一种方法,应该按索引的新月顺序打印值

void list(Point matrix [100][100]){

int i, j, c;

if(zeros(matrix) == 0)
    printf(" empty matrix\n");

for(i = 0; i < 100; i++){
    for(j = 0; j < 100; j++){
        for(c = 1; c <= nelem(matrix); c++){
           if( matrix[i][j].index == c)
              printf("[%d;%d] = %0.3lf\n", i, j, matrix[i][j].value);
         }

    }
}

}

我不知道为什么,但这会按行和列的顺序而不是按索引顺序打印值,我不知道出了什么问题,谁能帮我找出来?

【问题讨论】:

  • 提示 1:您最里面的 for 循环(在 c 上)除了减慢程序速度之外什么也没做。提示2:当你交换内循环和外循环的嵌套时,你会首先发现你的程序需要很长时间才能运行,然后输出是正确的。您确实需要一种不同的数据结构,您可以使用众所周知的排序算法轻松按索引进行排序。
  • @TypeIA 我还是 C 的新手,如果是一个项目,我们甚至不应该使用指针。如果我把最里面的for 作为外循环,输出是否正确?
  • 我不可能这么说,因为您还没有发布您的完整代码(请参阅minimal reproducible example),但看起来确实如此。你为什么不试试呢?您可以使用调试器来单步调试代码并查看发生了什么——这是一个绝对不可或缺的工具,您应该尽快学会使用它。祝你好运!

标签: c multidimensional-array


【解决方案1】:

不会是sort

void qsort (void* base, size_t num, size_t size, 
            int (*comparator)(const void*,const void*));

使用适当的比较器功能:

qsort(matrix, 100*100, sizeof(matrix[0][0]), cmp);

cmp 将是:

int cmp(const void *a,const void *b)
{
  struct Point *a1 = (struct Point *)a;
  struct Point *a2 = (struct Point*)b;
  if((*a1).index>(*a2).index)return -1;
  else if((*a1).index<(*a2).index)return 1;
  else return 0;
}

比较函数

int comparator(const void* p1, const void* p2);

返回值含义:

  • 0 p1 指向的元素等价于 p2
  • >0 p1指向的元素在p2指向的元素之后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2012-08-19
    • 2014-10-03
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多