在c中重建数组

时间:2014-10-09 18:06:48

标签: c arrays vector

给定一个稀疏向量(比其他元素多0),创建一个函数将向量分割成两个向量(一个包含元素,另一个包含元素的位置。另一个函数重建源向量来自位置和值数组(包括原始源中的0)。

所以这不能正确地重建它 - 我不明白为什么。我在main函数中测试了数组val和pos,但它们中没有正确的数字。

这是我到目前为止所拥有的:

用于有效表示(将源向量分成两部分):

void efficient( const int source[], int val[], int pos[], int size)
{
int j = 0;

for (j = 0; j < size; j++)
{
    if (source[j] != 0)
    {
            val[j] = source[j]; 
            pos[j] = j;
    }
}
}

用于重建函数(m是正在重建的源向量的大小,n是位置和值向量的大小):

void reconstruct( int source[], int m, const int val[], const int pos[], int n) {

int i = 0;
int j = 0;
int k = 0;

for (i = 0; i < m; i++)
    source[i] = 0; // sets all elements in source array equal to 0


for (j = 0; j < n; j++){
    source[pos[j]] = val[j];
    }


for (k = 0; k < m; k++)
    printf("%d ", source[k]);

}

这是我的主要测试功能:

int main()
{
int i;
int size;
const int source[] = {0,0,23,0,-7,0,0,48};
int val[3] ;
int pos [3] ;

efficient(source,val,pos,8); // calls function efficient

reconstruct(source, 8, val, pos, 3); // calls function reconstruct with parameters source, source size = 8, value array, position array and size of value and position array
}

所以这不能正确地重建它 - 我不明白为什么。我在main函数中测试了数组val和pos,但它们中没有正确的数字。

1 个答案:

答案 0 :(得分:2)

void efficient( const int source[], int val[], int pos[], int size)
{
    int j = 0;

    for (j = 0; j < size; j++)
    {
        if (source[j] != 0)
        {
                val[j] = source[j];  <-- HERE
                pos[j] = j;
        }
    }
}

你的意思并不是val[j]。您需要一个单独的变量来计算val和pos中的条目数。也许:

void efficient( const int source[], int val[], int pos[], int size)
{
    int j, p;

    for (j = 0, p = 0; j < size; j++)
    {
        if (source[j] != 0)
        {
                val[p] = source[j];
                pos[p] = j;
                ++p;
        }
    }
}