我的旋转数组代码给出了较大数组大小的错误

时间:2018-08-22 10:58:30

标签: c++ arrays

问题:我正在尝试通过geeksforgeeks解决数组旋转问题。对于较小的数组大小,该代码似乎工作正常,但对于较大的数组大小,它显示一些垃圾值,然后停止工作。

问题在此链接上:https://practice.geeksforgeeks.org/problems/rotate-and-delete/0

我的代码是:

# include<iostream>

using namespace std;

void rotate_clockwise(int *arr, int size)
{
    int temp = *(arr + size -1);
    for(int i = 0;i < size;++i )
    {
        *(arr +(size -1) - i) = *(arr + (size-1) -(i+1));//*(arr +(size -1)) 
    }
    *arr = temp;
}

void initialize_array(int *arr,int size)
{

   for(int  i= 0; i < size; ++i)
   {
        cin>>*(arr +i);
   }


}

void print_array(int *arr,int size)
{
    for(int i = 0; i< size; i++)
    {
        cout<<*(arr + i)<<" ";
    }
    cout<<endl;
}

void remove_ith_fend(int i, int *arr, int *ptr_size)
{   
    int size = *ptr_size;

    int *last = (arr + size -1);

    i = i-1;

    if(i < size)
    {
        for(int j =0 ;j<size;j++)
        {
            *(last - i + j) = *(last -i + j+1);
        }
    }
    else
    {
        for(int j = 0;j<size;++j)
        {
            *(arr + j) = *(arr + j +1);
        }
    }
    --size;
    *ptr_size = size;
    }

int main()
{
    int size;

    cout<<"Enter size of array: ";

    cin>>size;
    int *ptr_size;
    ptr_size = &size;

    int arr[size];

    initialize_array(arr, size);

    print_array(arr, size);

    for(int i =1;size!=1;++i)
    {
        cout<<"rotating"<<endl;

        rotate_clockwise(arr,size);

        print_array(arr,size);

        remove_ith_fend(i, arr, ptr_size);

        cout<<"removing "<<i<<"th element from the end"<<endl;

        print_array(arr,size);
    }

    return 0;
} 

我只是尝试这样做,所以我不接受他们在问题中给出的测试用例的输入。 抱歉,我没有评论代码,但我正在解决此问题, 在解决方案正确之后将要做的事。

这是我输入数组大小时遇到​​的错误:54

Enter size of array: 54
4741824 0 -1 0 4744768 0 4503683 0 1 0 4745728 0 8 0 4751362 0 4744784 0 
7339432 0 7339436 0 1 0 0 0 -1 0 4741824 0 -1 0 4741824 0 10 0 4254288 
16777216 0 54 8390488 0 224 0 -1 0 4200452 0 0 0 0 0 8 0
rotating
0 4741824 0 -1 0 4744768 0 4503683 0 1 0 4745728 0 8 0 4751362 0 4744784 0 
7339432 0 7339436 0 1 0 0 0 -1 0 4741824 0 -1 0 4741824 0 10 0 4254288 
16777216 0 54 8390488 0 224 0 -1 0 4200452 0 0 0 0 0 8
removing 1th element from the end

它没有要求任何输入,只是在上面打印了这个东西之后退出了。 另外,请指出我刚接触编程时喜欢编写代码的方式所存在的一些问题,并且希望学习更好的编写方式。

我刚刚使用Visual Studio调试了代码,并显示了此消息

Unhandled exception at 0x0000000000401632 in second.exe: 0xC0000005: Access 
violation reading location 0x0000000000000000. occurred

文件名是第二个。

正确的输出也应如下所示:

Enter size of array: 6
1 2 3 4 5 6
1 2 3 4 5 6
rotating
6 1 2 3 4 5
removing 1th element from the end
6 1 2 3 4
rotating
4 6 1 2 3
removing 2th element from the end
4 6 1 3
rotating
3 4 6 1
removing 3th element from the end
3 6 1
rotating
1 3 6
removing 4th element from the end
3 6
rotating
6 3
removing 5th element from the end
3

进行了更多测试,发现它适用于数组大小8和10,但不适用于数组7和9,并且对于大于10的值停止工作。

1 个答案:

答案 0 :(得分:2)

这是一个问题

void initialize_array(int *arr,int size)
{
   for(int  i ; i < size; ++i)
   {
        cin>>*(arr +i);
   }
}

应该是

void initialize_array(int *arr,int size)
{
   for(int i = 0; i < size; ++i)
   {
        cin>>*(arr +i);
   }
}

您的编译器应该已经使您意识到未初始化的变量。请注意编译器警告。