이진트리 삽입관련

여리왕자의 이미지

한동안 짜지 않다가 오랜만에 건드렸더니...

또 했갈리네요...

이진트리 삽입부랑 프린트 함수만 조금 짠 소스인데요...

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


typedef struct man MAN;

struct man {
			int age;
			MAN * left;
			MAN * right;
};

MAN * start, * imsi;


int init( void );
void insert( void );
void del( void );
void search( void );
void print( void );

void main( void )
{
	int sel;
	
	start = NULL;

	while ( sel != 5 ) {
		sel = init();
		
		switch ( sel ) {
			case 1 : insert();
				break;
			case 2 : del();
				break;
			case 3 : search();
				break;
			case 4 : print();
				break;
			case 5 : sel = 5;
		}
	}

}

int init( void )
{
	int sel;
	
	printf("*** Binary Tree ***\n");
	printf("1.insert\n2.del\n3.search\n4.printf\n5.end\n");

	printf("select: ");
	scanf("%d", &sel);

	return sel;
}

void insert( void )
{
	int num;
	
	MAN * temp;
	temp = imsi = start;
	
	printf("insert: ");
	scanf("%d", &num);

	while ( temp != NULL ) {
		if ( num < temp->age ) temp = temp->left ; 			
		else temp = temp->right ;
			
	}

	temp = ( MAN * )malloc( sizeof( MAN ) );

	if ( start == NULL ) start = temp;

	temp->age = num;
	temp->left = NULL;
	temp->right = NULL;

}

void del( void )
{

}

void search( void )
{

}

void print( void )
{
	printf("%d\t%d\t%d\n\n", start->age, start->left, start->right);
}

insert함수 안의 while문이 문제네요...

조건 분기까지 다 돌아가는데... 구조체가 연결이 안되네요...

이전에 링크드 리스트 만질때도 2중 포인터로 어떻게 해서 연결시켰던거 같던데....

생각이 안나네요... 왜 연결이 안되는거죠?

고수님들... 헬프 미~~

정태영의 이미지

박정열 wrote:
   while ( temp != NULL ) {
      if ( num < temp->age ) temp = temp->left ;          
      else temp = temp->right ;
         
   }

   temp = ( MAN * )malloc( sizeof( MAN ) ); 

insert 에 있는 부분입니다 :) 뭔가 이상하지 않나요?

while 를 벗어나고 나면 언제나 temp 에 있는 값은 NULL 입니다... while 안에서 하려고 했던 것들에 어떠한 의미도 부여할 수가 없네요 ...

new = malloc(...);
new->age = num;
new->left = NULL;
new->right = NULL;

if ( root == NULL ){
    root = new;
    return;
}

do {
    if ( num < temp->age ){
        if( temp->left == NULL ){
            temp->left = new;
            return;
        }
        temp = temp->left ;
    }
               
    else{
        if( temp->right == NULL ){
            temp->right = new;
            return;
        }
        temp = temp->right ;
    }
} while( 1 );

정도가 되어야 하지 않을까 싶습니다 :)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

여리왕자의 이미지

근데 님 소스가... 에러가 뜨는데요... ㅡ,.ㅡ;;

소스 다시 분석하기 귀찮아서 다시 짲는데....

제대로 돌아가네요...

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


typedef struct man MAN;

struct man {
			int age;
			MAN * left;
			MAN * right;
};

MAN * start, * imsi;


int init( void );
void insert( void );
void del( void );
void search( void );
void print( void );

void main( void )
{
	int sel;
	
	start = NULL;

	while ( sel != 5 ) {
		sel = init();
		
		switch ( sel ) {
			case 1 : insert();
				break;
			case 2 : del();
				break;
			case 3 : search();
				break;
			case 4 : print();
				break;
			case 5 : sel = 5;
		}
	}

}

int init( void )
{
	int sel;
	
	printf("*** Binary Tree ***\n");
	printf("1.insert\n2.del\n3.search\n4.printf\n5.end\n");

	printf("select: ");
	scanf("%d", &sel);

	return sel;
}

void insert( void )
{
	int num;
	
	MAN * temp, * imsi;

	printf("insert: ");
	scanf("%d", &num);

	temp = (MAN * )malloc( sizeof(MAN) );
	temp->age = num; 
	temp->left = NULL; 
	temp->right = NULL; 

	imsi = start;

	while ( start != NULL ) {
		if ( num < imsi->age ) {
			if ( imsi->left != NULL ) imsi = imsi->left;
			else if ( imsi->left == NULL ) {
				imsi->left = temp;
				imsi = imsi->left;
				break;
			}
		}
		else if ( num > imsi->age ) {
			if ( imsi->right != NULL ) imsi = imsi->right;
			else if ( imsi->right == NULL ) {
				imsi->right = temp;
				imsi = imsi->right;
				break;
			}
		}
		else {
			printf("\n\nThere is the thing of same!\n");
			printf("insert again!\n");
			printf("insert: ");
			scanf("%d", &num);
		}
	}
	if ( start == NULL ) start = temp;
}

void del( void )
{

}

void search( void )
{

}

void print( void )
{
	printf("%d", start->age);
	if ( start->left != NULL ) printf("\t%d", start->left->age);
	if ( start->left->left != NULL ) printf("\t%d", start->left->left->age);
	if ( start->right != NULL ) printf("\t%d\n\n", start->right->age);
}

요렇게 짯답니다.... ㅡ.ㅡ;;

아... 끝없는 프로그래밍의 세계... 정복하고파...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.