C圆阵

时间:2015-01-11 22:02:00

标签: 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'
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]);
}

3 个答案:

答案 0 :(得分:2)

如果您希望从最早的元素打印出来,请查看您的list_add代码和list_print

list_add&#39;知道&#39;插入点的位置,但list_print始终从0开始。

您可能希望从idx开始,作为最老的&#39;元件。 我会查看是否0,因为它们是空的&#39;圆圈完成前的插槽。

尝试:

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.
 }

答案 1 :(得分:0)

您是否有可能没有注意到您的代码没问题?它的工作方式应该如此。你添加一个,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.然后它通过移动所有元素循环然后插入一个新值。如果你想创建一个动态数组,你将不得不为它添加一些动态(循环)。

答案 2 :(得分:0)

#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");
}