Domanda

Mi sono bloccato in qualche guaio, purtroppo sto ancora imparando i dettagli di questa lingua.

Ho il seguente codice

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

e cerco di inserire i valori nella matrice utilizzando la seguente funzione:

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 io uso la funzione riportata di seguito per visualizzare gli elementi:

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

La mia domanda è che non si ottiene lo stesso risultato quando ho aggiunto diverse quantità di elementi, quando inserisco 5 elementi, la funzione di Visualizzazione del display di tutti gli elementi correttamente, ma quando inserisco meno di 5, il primo elemento che sembra essere la sua puntatore:

I seguenti risultati principali 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);
}

I seguenti risultati principali 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);
}

Qualcuno può farmi vedere dove ho sbagliato?

È stato utile?

Soluzione

Quando "inserisci" un elemento, lo fai a

s->vetor[s->end]

Ma prima di farlo tu aumento s->end, quindi il primo elemento sarà a s->vetor[1]. Dal primo elemento (s->vetor[0]) non è inizializzato, avrai un valore casuale lì. Questo è il motivo per cui hai uno strano valore per primo nell'inserto a quattro valore.

Quando si inserisce un quinto valore, hai il controllo s->end == SIZE dove hai impostato s->end A zero, quindi l'ultimo valore in quel caso finirà in primo luogo nell'array.

La soluzione, che risolverà entrambi i problemi di cui sopra, è aumentare s->end dopo Hai assegnato il valore all'array.

Altri suggerimenti

Quando si stampa stack:

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

Si inizia nella posizione di indice 0, ma il tuo implementazione dello stack inizia all'indice 1, in modo che quando si hanno meno di 5 elementi, il primo elemento non è inizializzato.Forse si può risolvere questo problema modificando il valore iniziale di 0.

Primo problema: le variabili locali non sono inizializzate, contengono immondizia a meno che non le inizi.

Secondo problema: inizi ad assegnare a Array Index 1 anziché 0. Solo quando si inserisce cinque elementi funzionerà, perché controlli se si controlla se end == SIZE E se così impostato end = 0, facendo l'inserto fift Imposta il primo elemento vetor[0].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top