2013-08-20 6 views
0

Код:дерево обхода - ошибка ошибка Сегментация

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

Ошибка: Сегментация Fault

Этот код предназначен для построения бинарного дерева обхода и преобразования постфикса в Infix и префиксов. Я не знаю, где это происходит, но он продолжает говорить ту же ошибку. Может ли кто-нибудь помочь мне с этим?

+0

Вы пробовали использовать отладчик вообще? – easuter

+0

Что здесь делает тэг [dsa]? – alk

ответ

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); 
+0

Помимо просто указания на проблемную конструкцию, вы должны предоставить решение: это 'scanf («% s », a)'! – alk

+0

@alk Уверенный брат, я буду помнить об этом и буду исправлять свой ответ. –

+1

+1 также для предложения использовать '* a' :-). Однако в C нельзя отбрасывать возвращаемое значение 'malloc/calloc/realloc', поскольку оно не является необходимым и не рекомендуется: http://stackoverflow.com/a/605858/694576 – alk

2

Вы не используете зсапЕ правильно: вы даете 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, если вы хотите больше информации.

+1

, чтобы завершить ответ: не только scanf ожидает char * (т. Е. Строка, из-за форматирования% s), также важно зарезервировать некоторую память для результата и указать на нее. В противном случае scanf просто продолжит работу и попытается перезаписать все, что происходит в месте назначения указателя, что приводит к ошибке сегментации. – Tobias

+0

Он не работает снова:/Он говорит, что нарушение прав доступа на 0x405888 считалось адресом 0x31 –

+0

Это сработало! Проблема здесь тоже ---> printf («% s», t-> data); Я использовал формат как строку. Изменил его характер, и он работал безупречно! :) –

1

Эта линия

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

пытается напечатать char (t->data) как 0 -завершённый char массив (обычно называемый «строка»), которая не работает.

Исправить это использование "%c" вместо "%s".

+0

Спасибо, ребята! :) –

0

В порядке:

  • C не имеет malloc.h файл. Функция malloc() и друзья объявлены в stdlib.h. Файл malloc.h, если он присутствует, является нестандартным для системы и не должен использоваться.
  • int top=-1;? Нечетный способ обработки индексирования. Что случилось с индексом, заземленным на ноль?
  • Вы выбрали возвращаемое значение вызова malloc(). В C это обычно рекомендуется против.
  • return не является вызовом функции, это утверждение.
  • Ваш push() функция не имеет границ проверка. Если вы нажмете более тридцати предметов, вы перепишете память, которая не принадлежит вам.
  • Ваш pop() функция также без границ проверка.Что произойдет, если вы попытаетесь выскочить, когда в стеке ничего нет?
  • Вы используете спецификатор формата "%s" для печати элемента типа char. Неопределенное поведение. (Все три функции обхода.)
  • Функция preorder() вызывает inorder(). К сожалению.
  • Вы объявляете a как тип char *, но затем вы передаете его scanf(). Либо объявите его как достаточно большой массив, либо используйте malloc(), чтобы выделить хранилище, которое вы будете передавать scanf. (В любом случае, вы должны пройти a, а не &a, до функции scanf().)
  • Что произойдет, если моя входная строка начинается с */-+?
+0

В стеках обычно верхнее значение берется как -1 справа? Вот почему я проиндексировал его с помощью -1. Спасибо anyways :) Это научило меня много! –

Смежные вопросы