Question

Je suis coincé dans des ennuis, malheureusement j'apprends toujours les détails de cette langue.

J'ai le code suivant

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

Et j'essaie d'inserter les valeurs dans son tableau en utilisant la fonction suivante:

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

Et j'utilise la fonction suivante pour montrer les éléments:

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

Ma question est que je n'obtiens pas le même résultat lorsque j'ajoute différents éléments, lorsque j'insère 5 éléments, la fonction d'affichage affiche correctement tous les éléments, mais lorsque j'insère moins de 5, le premier élément semble être son aiguille:

Les principaux résultats suivants dans 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);
}

Les principaux résultats suivants 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);
}

Quelqu'un peut-il me montrer où je me trompe?

Était-ce utile?

La solution

Lorsque vous "insérez" un élément, vous le faites à

s->vetor[s->end]

Mais avant de faire ça augmenter s->end, donc le premier élément sera à s->vetor[1]. Depuis le premier élément (s->vetor[0]) n'est pas initialisé, vous y aurez une valeur aléatoire. C'est la raison pour laquelle vous avez d'abord une valeur étrange dans l'insert à quatre valeurs.

Lorsque vous insérez une cinquième valeur, vous avez le chèque pour s->end == SIZE où vous définissez s->end à zéro, donc la dernière valeur dans ce cas se retrouvera en première place dans le tableau.

La solution, qui résoudra les deux problèmes ci-dessus, est d'augmenter s->end après Vous avez attribué la valeur au tableau.

Autres conseils

Lorsque vous imprimez la pile:

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

Vous commencez à l'index 0, mais votre implémentation de pile commence à l'index 1, donc lorsque vous avez moins de 5 éléments, le premier élément n'est pas initialisé. Vous pouvez peut-être résoudre ce problème en modifiant la valeur de démarrage à 0.

Premier problème: les variables locales ne sont pas initialisées, elles contiennent des ordures à moins que vous ne les initiiez.

Deuxième problème: vous commencez à attribuer à l'index du tableau 1 au lieu de 0. uniquement lorsque vous insérez cinq éléments fonctionneront, car vous vérifiez si end == SIZE et si c'est le cas end = 0, ce qui fait que l'insert à cinq définirait le premier élément vetor[0].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top