質問

私はいくつかのトラブルに巻き込まれていますが、残念ながら私はまだこの言語の詳細を学んでいます。

次のコードがあります

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

そして、次の関数を使用して、その配列に値を挿入しようとします。

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

次の関数を使用して要素を表示します。

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

私の質問は、5つの要素を挿入すると、異なる量の要素を追加すると同じ結果が得られないということです。表示関数はすべての要素を正しく表示しますが、5未満の挿入の場合、最初のアイテムはそのように見えますポインター:

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

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

誰かが私が間違っている場所を私に見せてもらえますか?

役に立ちましたか?

解決

要素を「挿入」すると、

s->vetor[s->end]

しかし、あなたがそれをする前にあなたはあなたです 増加 s->end, 、したがって、最初の要素があります s->vetor[1]. 。最初の要素以来(s->vetor[0])初期化されておらず、そこにランダムな値があります。それが、4値インサートで最初に奇妙な値を持っている理由です。

5番目の値を挿入すると、 s->end == SIZE あなたが設定する場所 s->end したがって、その場合の最後の値は、アレイの最初の場所になります。

上記の問題の両方を解決する解決策は、増加することです s->end 値を配列に割り当てました。

他のヒント

スタックを印刷するとき:

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

インデックス0で始まりますが、スタックの実装はインデックス1で始まるため、5つ未満の要素がある場合、最初のアイテムは初期化されません。おそらく、開始値を0に変更することでこれを修正できます。

最初の問題:ローカル変数は初期化されておらず、初期化しない限りガベージが含まれています。

2番目の問題:0の代わりに配列インデックス1で割り当て始めます。5つの要素を挿入した場合にのみ機能します。 end == SIZE そして、もしそうなら end = 0, 、FIFT INSERTを最初の要素に設定します vetor[0].

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top