我正在为项目编写代码,我需要在向量中移动值!例如,我有一个完全“空”的向量:
[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!该功能与我的代码完美配合!
答案 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是数组中当前实际元素的数量。