2013-08-20 5 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); 
} 

오류 : 분할 고장이 코드는 이진 트리 탐색 및 중위하는 접미사와 접두사의 변환의 건설을위한

. 나는 어디에서 잘못 될지는 모르지만 같은 잘못을 계속 말합니다. 아무도 도와 줄 수 있습니까?

+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와 사용하지 않는 ... 스캔 한 문자열이 같은 몇 가지 일을 유지하기 위해 메모리를 할당해야합니다 당신이 charscanf에 대한 포인터의 주소를 제공하지만, 그렇지 않습니다 초기화 됨 : 잘못된 메모리 주소를 가리킬 수 있고 세그먼테이션 오류가 발생합니다.

당신은 같은 것을 할 수 :

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

을 아니면 동적 할당 prefere 경우 : 당신이 원하는 경우 그렇고

# 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 배열로 끝나는 char (t->data) 0 A와 인쇄합니다.

"%s" 대신 "%c"을 수정하십시오. 위해

+0

너희들 고마워! :) –

0

:

  • C는 malloc.h 파일이 없습니다. malloc() 함수와 친구는 stdlib.h에 선언되어 있습니다. 파일이있는 경우 malloc.h 파일은 시스템 특정 비표준이므로 사용하면 안됩니다.
  • int top=-1;? 색인 생성을 처리하는 이상한 방법. 제로에 기초한 지표의 문제점은 무엇입니까?
  • malloc() 호출의 반환 값을 전송 중입니다. C에서는 일반적으로 권장됩니다.
  • return은 함수 호출이 아니며 명령문입니다.
  • push() 함수는 경계 검사를하지 않습니다. 30 개가 넘는 항목을 푸시하면 사용자가 소유하지 않은 메모리를 덮어 쓰게됩니다.
  • pop() 함수도 경계 검사를하지 않습니다.스택에 아무것도 없을 때 팝업하려고하면 어떻게됩니까?
  • 형식 지정자 "%s"을 사용하여 char 유형의 요소를 인쇄하고 있습니다. 정의되지 않은 동작. (세 가지 탐색 함수 모두)
  • preorder() 함수는 inorder()을 호출합니다. 죄송합니다.
  • achar * 유형으로 선언했지만이 값을 scanf()으로 전달합니다. 충분히 큰 배열로 선언하거나 malloc()을 사용하여 scanf로 전달할 저장소를 할당하십시오. (어느 쪽이든 이 아니라 ascanf() 함수로 전달해야합니다.)
  • 입력 문자열이 */-+으로 시작하면 어떻게됩니까?
+0

스택에서 일반적으로 최상위 값은 -1로 간주됩니까? 그래서 -1로 색인을 생성했습니다. 어쨌든 고마워요 :) 그게 내게 많이 가르쳐 줬어! –