树遍历 - 分段故障错误

时间:2013-08-20 09:01:03

标签: c dsa

代码:

#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);
}

错误:分段错误

此代码用于构建二叉树遍历并将后缀转换为中缀和前缀。我不知道哪里出错了,但它一直在说同样的错。 任何人都可以帮我这个吗?

4 个答案:

答案 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);

尝试将chart->data)打印为0 - 已终止的char数组(通常称为“字符串”),但这不起作用。< / p>

要解决此问题,请使用"%c"代替"%s"

答案 3 :(得分:0)

按顺序:

  • C没有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()函数。)
  • 如果我的输入字符串以*/-+开头?
  • 会怎样?