C圆阵
C circular array
我想制作一个固定大小的圆形数组,我想向其中添加元素然后应该可以打印它,当数组已满时,新添加的元素应该取代旧元素
例子
...
list_add('a'); //add element 'a'
list_add('b'); //add element 'b'
list_add('c'); //add element 'c'
list_print(); // should print 'a', 'b', 'c'
list_add('d'); //add element 'd'
list_add('e'); //add element 'e'
list_print(); // should print 'c', 'd', 'e'
...
虽然一开始我觉得通过一些 hack 会很容易,但这让我很头疼 :(
这是我所做的
#include <stdio.h>
#include <stdlib.h>
void list_add(char element);
void list_print();
char list[3] = {0, 0, 0};
int idx = 0;
int main(){
list_add('a');
list_add('b');
list_add('c');
list_print();
list_add('d');
list_add('e');
list_print();
return 0;
}
void list_add(char element){
list[idx] = element;
idx++;
if(idx==3) idx=0;
}
void list_print(){
int i;
for (i=0;i<3;i++) printf("%c\n", list[i]);
}
您是否有可能只是没有注意到您的代码没有问题?它按应有的方式工作。您添加 a、b、c。然后添加循环替换数组的 d 和 e:d、e、c。插图:
{0,0,0}
{a,0,0}
{a,b,0}
{a,b,c}
{d,b,c}
{d,e,c}
还是我漏掉了什么?
这是你想要的方式吗?
int indicator = 0;
<...>
void list_add(char element) {
if((idx < 3) && !indicator) {
list[idx] = element; idx++;
} else {
indicator = 1;
list[idx - 1] = element; idx--;
if (idx == 0) {
idx = 3;
}
};
那现在呢? :)
void list_add(char element){
if((idx < 3) && !indicator) {
list[idx] = element; idx++;
} else {
indicator = 1;
list[idx - 3] = list[idx - 2];
list[idx - 2] = list[idx -1];
list[idx - 1] = element;
};
}
它正常填充数组直到3。然后它通过移动所有元素循环然后插入一个新值。如果你想创建,比方说,一个动态数组,你将不得不向它添加一些动态(循环)。
如果您希望它从最早的元素打印出来,请查看您的 list_add
代码和 list_print
.
list_add
'knows' 插入点所在但 list_print
始终从 0 开始。
您可能希望从 idx
作为 'oldest' 元素开始。
我会检查它是否是 0
,因为在圆圈完成之前它们是 'empty' 个插槽。
尝试:
void list_print(){
int i=idx;//Start at the insertion point - just after the last insert - if any.
do{
if(list[i]!=0){//Don't output unfilled entries. Just a suggestion.
//You can't now store 0 but that's probably OK for most purposes.
printf("%c\n", list[i]);
}
++i;//Increment i and watch for looping like you did in list_add().
if(i==3){
i=0;
}
}while(i!=idx);//Stop when we're back at the beginning.
}
#define SIZE 3
char list[SIZE] = {0};
//...
void list_print(void){
int n = SIZE;
int i = idx;
while(n--){
printf("%c ", list[i++ % SIZE]);
}
printf("\n");
}
我想制作一个固定大小的圆形数组,我想向其中添加元素然后应该可以打印它,当数组已满时,新添加的元素应该取代旧元素
例子
...
list_add('a'); //add element 'a'
list_add('b'); //add element 'b'
list_add('c'); //add element 'c'
list_print(); // should print 'a', 'b', 'c'
list_add('d'); //add element 'd'
list_add('e'); //add element 'e'
list_print(); // should print 'c', 'd', 'e'
...
虽然一开始我觉得通过一些 hack 会很容易,但这让我很头疼 :( 这是我所做的
#include <stdio.h>
#include <stdlib.h>
void list_add(char element);
void list_print();
char list[3] = {0, 0, 0};
int idx = 0;
int main(){
list_add('a');
list_add('b');
list_add('c');
list_print();
list_add('d');
list_add('e');
list_print();
return 0;
}
void list_add(char element){
list[idx] = element;
idx++;
if(idx==3) idx=0;
}
void list_print(){
int i;
for (i=0;i<3;i++) printf("%c\n", list[i]);
}
您是否有可能只是没有注意到您的代码没有问题?它按应有的方式工作。您添加 a、b、c。然后添加循环替换数组的 d 和 e:d、e、c。插图:
{0,0,0}
{a,0,0}
{a,b,0}
{a,b,c}
{d,b,c}
{d,e,c}
还是我漏掉了什么?
这是你想要的方式吗?
int indicator = 0;
<...>
void list_add(char element) {
if((idx < 3) && !indicator) {
list[idx] = element; idx++;
} else {
indicator = 1;
list[idx - 1] = element; idx--;
if (idx == 0) {
idx = 3;
}
};
那现在呢? :)
void list_add(char element){
if((idx < 3) && !indicator) {
list[idx] = element; idx++;
} else {
indicator = 1;
list[idx - 3] = list[idx - 2];
list[idx - 2] = list[idx -1];
list[idx - 1] = element;
};
}
它正常填充数组直到3。然后它通过移动所有元素循环然后插入一个新值。如果你想创建,比方说,一个动态数组,你将不得不向它添加一些动态(循环)。
如果您希望它从最早的元素打印出来,请查看您的 list_add
代码和 list_print
.
list_add
'knows' 插入点所在但 list_print
始终从 0 开始。
您可能希望从 idx
作为 'oldest' 元素开始。
我会检查它是否是 0
,因为在圆圈完成之前它们是 'empty' 个插槽。
尝试:
void list_print(){
int i=idx;//Start at the insertion point - just after the last insert - if any.
do{
if(list[i]!=0){//Don't output unfilled entries. Just a suggestion.
//You can't now store 0 but that's probably OK for most purposes.
printf("%c\n", list[i]);
}
++i;//Increment i and watch for looping like you did in list_add().
if(i==3){
i=0;
}
}while(i!=idx);//Stop when we're back at the beginning.
}
#define SIZE 3
char list[SIZE] = {0};
//...
void list_print(void){
int n = SIZE;
int i = idx;
while(n--){
printf("%c ", list[i++ % SIZE]);
}
printf("\n");
}