Vra

Ek sit in die moeilikheid, ongelukkig leer ek steeds die besonderhede van hierdie taal.

Ek het die volgende kode

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

En ek probeer om die waardes in sy skikking in te voeg met behulp van die volgende funksie:

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

En ek gebruik die volgende funksie om elemente aan te toon:

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]);
        }
    }
}

My vraag is dat ek nie dieselfde resultaat kry as ek verskillende hoeveelheid elemente byvoeg nie, as ek 5 elemente invoeg, vertoon die vertoonfunksie al die elemente korrek, maar as ek minder as 5 invoeg, lyk dit asof die eerste item dit is wyser:

Die volgende hoofresultate in 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);
}

Die volgende hoofresultate in 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);
}

Kan iemand my wys waar ek verkeerd is?

Was dit nuttig?

Oplossing

As u 'n element "invoeg", doen u dit by

s->vetor[s->end]

Maar voordat jy dit doen Verhoog s->end, so die eerste element sal wees by s->vetor[1]. Sedert die eerste element (s->vetor[0]) word nie geïnitialiseer nie, u sal 'n ewekansige waarde daar hê. Dit is die rede waarom u eerstens 'n vreemde waarde het in die vierwaarde-insetsel.

As u 'n vyfde waarde invoeg, moet u die tjek hê s->end == SIZE waar jy gestel het s->end tot nul, dus eindig die laaste waarde in daardie geval in die eerste plek in die skikking.

Die oplossing, wat albei die bogenoemde probleme sal oplos, is om te verhoog s->end nadat U het die waarde aan die skikking toegeken.

Ander wenke

As u die stapel druk:

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

U begin by indeks 0, maar u stapelimplementering begin by indeks 1, so as u minder as 5 elemente het, word die eerste item nie geïnitialiseer nie. Miskien kan u dit regstel deur die beginwaarde na 0 te verander.

Eerste probleem: Plaaslike veranderlikes word nie geïnitialiseer nie, dit bevat vullis, tensy u dit initialiseer.

Tweede probleem: u begin toewys by Array Index 1 in plaas van 0. Slegs as u vyf elemente invoeg, sal dit werk, want u kyk of end == SIZE En indien wel. end = 0, maak die Fift -insetsel die eerste element vetor[0].

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top