代码中的错误是什么?
在下面的函数中。我尝试使用堆栈和实现使用数组。我做了创建堆栈,推,弹出,功能。但编译时显示错误。请帮我弄清楚问题是什么?代码中的错误是什么?
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
struct stack_struct {
char a[100];
int top;
};
typedef struct stack_struct *stack;
stack charc;
stack createstack() {
stack s = (stack) malloc(sizeof(struct stack_struct));
s->top = -1;//initialize the stack
return s;
}
void push(stack s, char x) {
s->top++;
s->a[s->top] = x;
}
char pop(stack s) {
assert(s->top > 0);
char x;
x = s->a[s->top];
s->top--;
return x;
}
void printstack(stack s) {
while (s->top != -1) {
printf("%c", s->a[s->top]);
s-> top--;
}
void main() {
charc = createstack();
push(charc, 3);
printstack(charc);
pop(charc);
printstack(charc);
push(charc, 4);
printstack(charc);
push(charc, 5);
printstack(charc);
push(charc, 6);
printstack(charc);
push(charc, 7);
printstack(charc);
}
}
您在printstack功能月底失踪}
,并有一个额外的}
在你的代码的末尾。添加缺少的并删除额外的一个,它会编译。此外,您的主要功能应该返回INT(int main()
而不是void main()
),你从你的主要功能应该return 0;
我已经知道返回0;在最后没有必要。甚至在做完这些之后(你告诉我的)它显示出流行音乐;断言功能失败。 – 4rshdeep
这是因为你的printstack函数有效地清空你的堆栈,所以's-> top'被设置为-1。断言失败,因为's-> top'不大于'0'。即使你的程序会用'void main()'编译,你不应该这样做,正确的方法是'int main()'或'int main(int argc,char * argv [])''。 –
确实有代码中的问题:
有在年底失踪
}
为printstack
既然你已经在文件的结尾额外
}
的main()
的定义后,自gcc
函数定义允许本地FUNC这个错误信息可能很难解释。pop
中的断言应为assert(s->top >= 0);
,因为s->top == 0
表示存在一个元素的堆栈。main
的原型应该是int main(void)
或int main(int argc, char *argv[])
或等效的。在结束时返回0
在C99和更高版本中是可选的,但被认为是很好的风格。铸造返回值
malloc()
是不必要的,如果你忽略了包括<stdlib.h>
,不要在C代码中隐藏一些问题。不推荐隐藏指针
typedef
s,它往往会使代码更难以阅读,并且通常会导致编程错误。 Astack
是对象,而不是指向对象的指针。使用隐式指针会使差异变得不那么明显,并造成混淆。-
printstack
不应该修改stack
,应该使用局部变量:void printstack(const struct stack_struct *s) { for (int i = s->top; i >= 0; i--) { printf("%c", s->a[i]); } printf("\n"); }
使用全局变量不需要你的代码,在退出之前进行
charc
本地的main
功能和free
它程序。堆栈元素类型应为
int
而不是char
,因为您将数字推入堆栈。
这里是一个简化的版本:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct stack {
int a[100];
int top;
} stack;
stack *createstack(void) {
stack *s = malloc(sizeof(*s));
s->top = -1; // initialize the stack as empty
return s;
}
void push(stack *s, int x) {
s->a[++s->top] = x;
}
int pop(stack *s) {
assert(s->top >= 0);
return s->a[s->top--];
}
void printstack(const stack *s) {
for (int i = s->top; i >= 0; i--) {
printf("%d ", s->a[i]);
}
printf("\n");
}
int main(void) {
stack *st = createstack();
push(st, 3);
printstack(st);
pop(st);
printstack(st);
push(st, 4);
printstack(st);
push(st, 5);
printstack(st);
push(st, 6);
printstack(st);
push(st, 7);
printstack(st);
free(st);
return 0;
}
什么是错误和行号? –
也许不相关,但你不应该''malloc' – UnholySheep
隐藏指针'typedef'容易出错,被认为是不好的做法,使代码难以阅读... – chqrlie