#include "stdio.h"
#include "stdlib.h"
struct node_type {
int data;
struct node_type *next;
};
struct stack_type{
node_type *top;
int length;
};
void push(node_type *head,stack_type stack);
int main()
{
struct stack_type stack;
node_type *list;
list = (node_type *)malloc(sizeof(node_type));
list->next = NULL;
node_type *head;
head = list;
stack.length = 0; //set stack empty
push(head, stack);
list = head->next;
printf("The entegers are:");
do {
printf("%d", stack.top->data);
list = list->next;
stack.top = list;
} while (list->next != 0);
system("pause");
return 0;
}
void push(node_type *head,stack_type stack)
{
int i, n;
node_type *p;
p = (node_type*)malloc(sizeof(node_type));
p = head;
printf("Enter the integers(0 to end):");
for (;;) {
scanf("%d", &n);
if (n == 0)
break;
stack.top->data = n;
p->next = stack.top;
stack.length++;
}
}
当我调试时,它说p-> next = NULL并停止,我不清楚这个。
为什么我错了?如何修复它,我不清楚使用NULL和顶部手指 谢谢你的答案。
答案 0 :(得分:3)
两个问题:首先在main
函数中,你没有初始化stack.top
意味着它将有一个不确定值,取消引用这个看似随机的指针,就像你在push
函数将导致未定义的行为。
第二个问题是您将stack
结构按值传递给push
,这意味着它已被复制并且所有更改都在push
函数中完成仅在结构的本地副本上完成。您需要使用指针和地址操作符&
模拟按值传递 。
答案 1 :(得分:2)
该计划没有意义。
它是用C语言编写的,但是像C ++程序一样编译。
功能push
完全错误。
void push(node_type *head,stack_type stack)
{
int i, n;
node_type *p;
p = (node_type*)malloc(sizeof(node_type));
p = head;
//...
堆栈被值接受。因此原始堆栈将不会更改。存在内存泄漏,因为在分配内存后重新分配指针p
。对象top
的数据成员stack
未初始化。所以这句话
stack.top->data = n;
导致程序的行为未定义。
首先,您应该将程序编译为C程序。在这种情况下,编译器将报告大量错误,因为没有名称声明
node_type
和stack_type
。
所以即使第二个结构声明也是无效的
struct stack_type{
node_type *top;
^^^^^^^^^^^^^^
int length;
};
必须有
struct stack_type{
struct node_type *top;
^^^^^^^^^^^^^^^^
int length;
};
函数push
应至少声明为
void push( struct stack_type *stack, int data );
它应该只做一件事:在堆栈中推送data
的vakue。
考虑到没有参数的函数main应声明为
int main( void )
函数push
的定义可以采用以下方式
void push( struct stack_type *stack, int data );
int main( void )
{
struct stack_type stack = { NULL, 0 };
//...
int data;
while ( scanf( "%d", &data ) == 1 && data != 0 )
{
push( &stack, data );
}
//...
}
void push( struct stack_type *stack, int data )
{
struct node_type *node = malloc( sizeof( struct node_type ) );
if ( node != NULL )
{
node->data = data;
node->next = stack->top;
stack->top = node;
++stack->length;
}
}