代码:
#include<stdio.h>
#include<malloc.h>
typedef struct tree
{
char data;
struct tree *left;
struct tree *right;
}*pos;
pos stack[30];
int top=-1;
pos newnode(char b)
{
pos temp;
temp=(struct tree*)malloc(sizeof(struct tree));
temp->data=b;
temp->left=NULL;
temp->right=NULL;
return(temp);
}
void push(pos temp)
{
stack[++top]=temp;
}
pos pop()
{
pos p;
p=stack[top--];
return(p);
}
void inorder(pos t)
{
if(t!=NULL)
{
inorder(t->left);
printf("%s",t->data);
inorder(t->right);
}
}
void preorder(pos t)
{
if(t!=NULL)
{
printf("%s",t->data);
preorder(t->left);
inorder(t->right);
}
}
void postorder(pos t)
{
if(t!=NULL)
{
postorder(t->left);
postorder(t->right);
printf("%s",t->data);
}
}
void main()
{
char *a;
pos temp,t;
int j,i;
puts("Enter the expression :");
scanf("%s",&a);
for(i=0;a[i]!='\0';i++)
{
if(a[i]=='*' || a[i]=='/' || a[i]=='+' || a[i]=='-')
{
temp=newnode(a[i]);
temp->right=pop();
temp->left=pop();
push(temp);
}
else
{
temp=newnode(a[i]);
push(temp);
}
}
inorder(temp);
printf("\n");
preorder(temp);
printf("\n");
postorder(temp);
}
错误:分段错误
此代码用于构建二叉树遍历并将后缀转换为中缀和前缀。我不知道哪里出错了,但它一直在说同样的错。 任何人都可以帮我这个吗?
答案 0 :(得分:2)
scanf("%s",&a); // is the problem.
scanf接受指针,并且您正在传递指针的地址。 你必须只传递指针。
scanf("%s",a); // since a is already pointer, just use a.
而你没有分配内存。 你需要分配内存来保存扫描的字符串,就像这样...
a = (char*)malloc(sizeof(*a) * MAX_SIZE);
答案 1 :(得分:2)
您没有正确使用scanf:您向scanf
提供指向char
的指针的地址,但它未初始化:它可能指向错误的内存地址然后您将得到分段错误。
你可以这样做:
# define MAX_BUFF_SIZE (64)
void main()
{
char a[MAX_BUFF_SIZE];
pos temp,t;
int j,i;
puts("Enter the expression :");
scanf("%s", a);
/* ... */
return 0;
}
或者如果你喜欢动态分配:
# define MAX_BUFF_SIZE (64)
void main()
{
char *a;
pos temp,t;
int j,i;
a = malloc(sizeof(*a) * MAX_BUFF_SIZE);
if (a == NULL)
return -1;
puts("Enter the expression :");
scanf("%s", a);
/* ... */
free(a);
return 0;
}
顺便提一下,请注意使用scanf
并不安全,如果您想了解更多信息,请阅读this。
答案 2 :(得分:1)
这一行
printf("%s", t->data);
尝试将char
(t->data
)打印为0
- 已终止的char
数组(通常称为“字符串”),但这不起作用。< / p>
要解决此问题,请使用"%c"
代替"%s"
。
答案 3 :(得分:0)
按顺序:
malloc.h
个文件。 malloc()
函数和朋友在stdlib.h
中声明。 malloc.h
文件(如果存在)是特定于系统的非标准文件,不应使用。int top=-1;
?处理索引的奇怪方法。一个以零为基础的指数有什么问题?malloc()
来电的返回值。在C中,通常建议不要这样做。return
不是函数调用,而是声明。push()
函数没有边界检查。如果你推送超过30个项目,你将覆盖不属于你的内存。pop()
函数也没有边界检查。如果您在堆栈中没有任何内容时尝试弹出会发生什么?"%s"
格式说明符来打印char
类型的元素。未定义的行为。 (所有三个遍历函数。)preorder()
函数正在调用inorder()
。糟糕。a
属于char *
类型,但随后将其传递给scanf()
。要么将其声明为足够大的数组,要么使用malloc()
来分配您将传递给scanf的存储。 (无论哪种方式,您都应该将a
而不是&a
传递给scanf()
函数。)*/-+
开头?