0

Code :

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

Error : Segmentation Fault

This code is for construction of binary tree traversal and conversion of postfix to infix and prefix. I dont know where am going wrong but it keeps saying the same fault. Can anyone help me with this ?

4

4 回答 4

2

你没有正确使用 scanf :你给scanf了一个指向 a 的指针的地址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不安全,如果您想了解更多信息,请阅读此内容。

于 2013-08-20T09:20:15.450 回答
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);
于 2013-08-20T09:17:09.167 回答
1

这条线

printf("%s", t->data);

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

要修复此使用"%c"而不是"%s".

于 2013-08-20T10:00:55.277 回答
0

为了:

  • C 没有malloc.h文件。malloc()函数和友元在stdlib.h. 该malloc.h文件(如果存在)是系统特定的非标准文件,不应使用。
  • int top=-1;? 处理索引的奇怪方式。以零为基础的指数有什么问题?
  • 您正在转换调用的返回值malloc()。在 C 中,通常建议不要这样做。
  • return不是函数调用,而是语句。
  • 您的push()函数不进行边界检查。如果您推送超过 30 个项目,您将覆盖不属于您的内存。
  • 您的pop()函数也没有边界检查。如果堆栈上没有任何内容时尝试弹出会发生什么?
  • 您正在使用"%s"格式说明符来打印 type 的元素char。未定义的行为。(所有三个遍历函数。)
  • 您的preorder()函数正在调用inorder(). 哎呀。
  • 您声明a为 type char *,但随后将其传递给scanf(). 要么将其声明为足够大的数组,要么用于malloc()分配您将传递给 scanf 的存储空间。(无论哪种方式,您都应该将 传递给函数a,而不是传递&ascanf()函数。)
  • 如果我的输入字符串以 开头会发生什么*/-+
于 2013-08-22T01:25:53.287 回答