Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C圆阵_C_Algorithm - Fatal编程技术网

C圆阵

C圆阵,c,algorithm,C,Algorithm,我想制作一个固定大小的圆形数组,我想向其中添加元素,然后应该能够打印它,当数组已满时,新添加的元素应该取代旧元素 范例 ... 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' li

我想制作一个固定大小的圆形数组,我想向其中添加元素,然后应该能够打印它,当数组已满时,新添加的元素应该取代旧元素

范例

...

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'
...
起初我认为,用一些黑客手段很容易,但这让我头疼:( 这就是我所做的

#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]);
}
#包括
#包括
无效列表\添加(字符元素);
作废列表_print();
字符列表[3]={0,0,0};
int-idx=0;
int main(){
列表_添加('a');
列表_添加('b');
列表_添加('c');
list_print();
列表_添加('d');
列表_添加('e');
list_print();
返回0;
}
无效列表\添加(字符元素){
列表[idx]=元素;
idx++;
如果(idx==3)idx=0;
}
作废清单(打印){
int i;

对于(i=0;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;
    }
};
int指标=0;
无效列表\添加(字符元素){
如果((idx<3)&&!指示符){
列表[idx]=元素;idx++;
}否则{
指标=1;
列表[idx-1]=元素;idx--;
如果(idx==0){
idx=3;
}
};
那现在呢?:)

void list\u add(字符元素){
如果((idx<3)&&!指示符){
列表[idx]=元素;idx++;
}否则{
指标=1;
列表[idx-3]=列表[idx-2];
列表[idx-2]=列表[idx-1];
列表[idx-1]=元素;
};
}

它通常填充数组直到3。然后它通过移动所有元素来循环,然后插入一个新值。如果你想创建一个动态数组,你必须给它添加一些动态(循环)。

如果你想从最旧的元素打印出来,请查看你的
列表添加
代码和
列表打印

list\u add
“知道”插入点在哪里,但
list\u print
始终从0开始

您可能希望从
idx
开始,作为“最早的”元素。 我会检查它是否为
0
,因为在循环完成之前,它们是“空”插槽

尝试:


你到底有什么问题?提示:使用模运算符。@slnowak当我打印它们时,请不要问这个问题,顺序是错误的。这里的人喜欢对每个问题进行向下投票。这一个不值得向下投票。@slnowak我试图制作两个变量来保存第一个和最后一个元素,但对我无效,或者至少我不知道如何使用它们来完成我想要的任务@JuanLopes谢谢,我真的不知道他们为什么否决我,至少他们可以留下评论告诉我为什么.OP希望他的列表从最旧的条目打印到最新的条目。我知道了。但是它不再是一个圆了。正如slnowak所说,输出应该是{c,d,e}从最老的到最新的,也许我称之为错误的,因为我真的不知道它叫什么:)@ilvinasVerseckas不,那给了我一个{a,e,d},这不是我想要的。你比我强:)(+1)你可以用i=i++%size替换if块;@slnowak
i=i++%size;
是错误的。这可能是UB。@slnowak当然可以。但我想我们在尝试运行之前应该先走一走!我刚刚复制了OP的功能。哇,你让它看起来很简单。这是迄今为止最好、最优雅的解决方案。
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;
    };
}
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");
}