Pergunta

Eu estou preso em algum problema, infelizmente, eu ainda estou aprendendo a língua.

Eu tenho o seguinte código

#define SIZE 5
typedef struct 
{
    int start;
    int end;
    int nElements;
    int vetor[SIZE];
} TSTACK;

e eu tento inser valores em sua matriz, utilizando a seguinte função:

void Push(TSTACK *s, int elementInsert)
{
    if(IsFull(s))
    {
        printf("%s\n", "# ERROR: full.");
    }
    else
    {
        s->end++;
        if(s->end == SIZE)
        {
            s->end = 0;
        }

        s->vetor[s->end] = elementInsert;
        s->nElements++;
    }
}

e eu uso a seguinte função para mostrar elementos:

void Display(TSTACK *s)
{
    int i;
    if (isEmpty(s))
    {
        printf("%s\n", "# ERROR: empty");
    }
    else
    {
        for (i = 0; i < s->nElements; i++) 
        {
            printf ("value: %d\n", s->vetor[i]);
        }
    }
}

A minha pergunta é que eu não conseguir o mesmo resultado quando eu adicionar uma quantidade diferente de elementos, quando eu inserir 5 elementos, a função de Exibição de apresentar todos os elementos corretamente, mas quando eu inserir menos do que 5, o primeiro item que aparece para ser seu ponteiro:

Os seguintes principais resultados 4201166, 3, 5, 7

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);

    Display(&test);
}

Como principais resultados, em 5, 3, 5, 7, 3

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);
    Push(&test, 5);

    Display(&test);
}

Alguém pode me mostrar onde eu estou errado?

Foi útil?

Solução

Quando você "insere" um elemento, você faz isso em

s->vetor[s->end]

Mas antes de fazer isso você aumentar s->end, então o primeiro elemento estará em s->vetor[1]. Desde o primeiro elemento (s->vetor[0]) não é inicializado, você terá um valor aleatório lá. Essa é a razão pela qual você tem um valor estranho primeiro na inserção de quatro valores.

Quando você insere um quinto valor, você tem o cheque para s->end == SIZE onde você define s->end Para zero, portanto, o último valor nesse caso terminará em primeiro lugar na matriz.

A solução, que resolverá os dois problemas acima, é aumentar s->end depois Você atribuiu o valor à matriz.

Outras dicas

Quando você imprime a pilha:

for (i = 0; i < s->nElements; i++) 
{
    printf ("value: %d\n", s->vetor[i]);
}

Você está começando no índice 0, mas sua implementação da pilha começa no índice 1; portanto, quando você tem menos de 5 elementos, o primeiro item não é inicializado. Talvez você possa corrigir isso alterando o valor inicial para 0.

Primeiro problema:Variáveis locais não são inicializadas contêm lixo, a menos que você inicializá-los.

Segundo problema:Você começar a atribuir no índice de matriz 1 em vez de 0.Somente quando você inserir cinco elementos vai funcionar, porque você verifique se end == SIZE e se assim definir end = 0, fazendo com que o fift inserir define o primeiro elemento vetor[0].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top