移动C

时间:2015-05-25 14:08:45

标签: c vector

我正在为项目编写代码,我需要在向量中移动值!例如,我有一个完全“空”的向量: [0][0][0][0][0]

然后我会在它的第一个位置添加一个值:[10][0][0][0][0]

好的,现在我需要再次向第一个位置添加一个值,但我不能丢失那里的值,我想将它移到右边,如: [0][10][0][0][0]

将新的那个放在那里:[5][10][0][0][0]

然后再次执行此操作,再次向右移动5和10,在第一个中添加新的,依此类推! 我希望我足够清楚!

@EDIT:

它完成的人! 感谢大家试图提供帮助!

使用@AkashPradhan函数解决了问题:

void changeposition(int* vetor, unsigned int size, int valor)
{
    unsigned int i = size - 1;
    for(; i > 0; --i)
        vetor[i] = vetor[i-1] ;
    vetor[0] = valor ;
}

谢谢@AkashPradhan!该功能与我的代码完美配合!

4 个答案:

答案 0 :(得分:0)

您可以使用链接列表并添加到前节点,也可以使用数组并将元素移动一个位置。

在这种情况下,我建议使用链接列表,因为插入例程不会涉及移动每个元素。但是,如果频繁随机访问所需的元素,请使用数组方法。

void insert_front(int* array, unsigned int size, int value)
{
    unsigned int i = size - 1;
    for(; i > 0; --i)
        array[i] = array[i-1] ;
    array[0] = value ;
}

请注意,例程不会检查您是否插入了更多数组大小的元素。

答案 1 :(得分:0)

您可以将其实现为ring buffer,在这种情况下,您无需一直复制元素。一个例子是:

typedef struct
{
    size_t bufferSize;
    size_t currentPos;
    int *data;
} ring_buffer;

void init_buffer(ring_buffer *buffer, size_t N)
{
    buffer->bufferSize = N;
    buffer->currentPos = 0;
    buffer->data = malloc(N*sizeof(int));
}
void free_buffer(ring_buffer *buffer)
{
    free(buffer->data);
}
void push_buffer(ring_buffer *buffer, int value)
{
    ++buffer->currentPos;
    if (buffer->currentPos >= buffer->bufferSize)
        buffer->currentPos = 0;

    buffer->data[buffer->currentPos] = value;
}

int get_buffer(ring_buffer *buffer, size_t pos)
{
    size_t dataPos = buffer->currentPos + pos;
    if (dataPos >= buffer->bufferSize)
      dataPos -= buffer->bufferSize;

    return buffer->data[dataPos];
}

或者您可以使用@AkashPradhan建议的链接列表。

答案 2 :(得分:0)

定义自己的数组,实现推送操作,在推送新元素时移位正确的数据。此实现将删除陈旧元素。

typedef struct Array {
  int *data;
  size_t len; // current size of the array
  size_t cap; // capacity of the array
}Array;

Array * new_array (size_t cap_){
   Array *arr = (Array *)malloc(sizeof(Array));
   arr->cap = cap_;
   arr->len = 0;
   arr->data = (int*)malloc(sizeof(int) * cap);
   return arr;
}

void free_array(Array * arr){
    if (arr->data != NULL) 
        free(arr->data);
    free(arr);
}

void push(int x, Array *arr) {
  int ptr = std::min(len, cap) - 2;
  for(int i = ptr;i >= 0;i --) {
    arr->data[ptr + 1] = arr->data[ptr];
  }
  arr->data[0] = x;
  len = std::max(cap, len + 1);
}

更新:您也可以使用TamásSzabó的答案来避免数据移动。

答案 3 :(得分:0)

如果您需要自己编写相应的功能,那么它可以采用以下方式

size_t move( int a[], size_t n )
{
    if ( n++ != 0 )
    {
        for ( size_t i = n; --i != 0;  ) a[i] = a[i-1];
    }

    return n;
} 

你可以用以下方式使用它

size_t n = 0;

n = move( a, n );
a[0] = 10;
n = move( a, n );
a[0] = 5;

for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );        

否则你必须按照以下方式使用标准C函数memmove

memmove( a + 1, a, n * sizeof( int ) );
++n;       

其中n是数组中当前实际元素的数量。