Pregunta

Estoy atrapado en algunos problemas, desafortunadamente todavía estoy aprendiendo los detalles de este idioma.

Tengo el siguiente código

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

e intento inser los valores en su matriz utilizando la siguiente función:

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++;
    }
}

Y uso la siguiente función 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]);
        }
    }
}

Mi pregunta es que no obtengo el mismo resultado cuando agrego diferentes cantidades de elementos, cuando inserto 5 elementos, la función de visualización muestra todos los elementos correctamente, pero cuando inserto menos de 5, el primer elemento parece ser es su puntero:

Los siguientes resultados principales en 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);
}

Los siguientes resultados principales en 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);
}

¿Alguien puede mostrarme dónde estoy equivocado?

¿Fue útil?

Solución

Cuando "inserte" un elemento, lo haces en

s->vetor[s->end]

Pero antes de hacer eso tu aumentar s->end, entonces el primer elemento será en s->vetor[1]. Desde el primer elemento (s->vetor[0]) no se inicializa, tendrá un valor aleatorio allí. Esa es la razón por la que tiene un valor extraño primero en el inserto de cuatro valores.

Cuando inserta un quinto valor, tiene el cheque para s->end == SIZE Donde te pones s->end a cero, por lo que el último valor en ese caso terminará en primer lugar en la matriz.

La solución, que resolverá los dos problemas anteriores, es aumentar s->end después Asignó el valor a la matriz.

Otros consejos

Cuando imprime la pila:

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

Está comenzando en el índice 0, pero su implementación de pila comienza en el índice 1, por lo que cuando tiene menos de 5 elementos, el primer elemento no se inicializa. Quizás pueda solucionar esto cambiando el valor de inicio a 0.

Primer problema: las variables locales no se inicializan, contienen basura a menos que las inicialice.

Segundo problema: comienza a asignar en la matriz Índice 1 en lugar de 0. solo cuando inserta cinco elementos funcionará, porque verifica si end == SIZE Y si es tan listo end = 0, haciendo que el inserto de quince establezca el primer elemento vetor[0].

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top