我遇到了一些麻烦,不幸的是我还在学习这门语言的细节。
我有以下代码
#define SIZE 5
typedef struct
{
int start;
int end;
int nElements;
int vetor[SIZE];
} TSTACK;
我尝试使用以下函数在其数组中输入inser值:
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);
}
有人能告诉我我错在哪里吗?
答案 0 :(得分:1)
当您“插入”元素时,可以在
处执行s->vetor[s->end]
但在你这样做之前你增加 s->end
,所以第一个元素将在s->vetor[1]
。由于第一个元素(s->vetor[0]
)未初始化,因此您将拥有一个随机值。这就是你在四值插入中首先得到奇怪值的原因。
当您插入第五个值时,您检查s->end == SIZE
将s->end
设置为零,因此该情况下的最后一个值将最终位于数组的第一位。< / p>
解决上述两个问题的解决方案是在为数组指定值后增加s->end
。
答案 1 :(得分:0)
第一个问题:局部变量未初始化,除非您初始化它们,否则它们包含垃圾。
第二个问题:你开始在数组索引1而不是0处进行分配。只有在插入五个元素时它才有效,因为你检查end == SIZE
是否设置为end = 0
,进行fift插入设置第一个元素vetor[0]
。
答案 2 :(得分:0)
打印堆栈时:
for (i = 0; i < s->nElements; i++)
{
printf ("value: %d\n", s->vetor[i]);
}
您从索引0开始,但您的堆栈实现从索引1开始,因此当您有少于5个元素时,第一个项目未初始化。也许您可以通过将起始值更改为0来解决此问题。