我遇到了一些麻烦,不幸的是我仍在学习这种语言的细节。

我有以下代码

#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])不初始化,您将在那里有一个随机值。这就是您在四值插入物中首先具有奇怪值的原因。

当您插入第五值时,您会有检查 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来解决此问题。

第一个问题:局部变量未初始化,除非您初始化它们,否则它们包含垃圾。

第二个问题:您开始在数组索引1而不是0中分配。 end == SIZE 如果这样设定 end = 0, ,使FIFT插入设置第一个元素 vetor[0].

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top