//Binary Tree Search 삽입, 삭제, 균형잡기

#include<stdio.h>
#include<stdlib.h>
#define MAX 100

typedef struct _node
{
    char data;
    struct _node* left;
    struct _node* right;
}node;

 int index; 
char array[MAX];

 void print(node*);
void print2(node*);
node* insert(node**, char);
node* del(node**, char);
void bti_balance(node**);
node* balance(int);
void bti_deleteall(node**);
void bti_sort(node**);

 void main()
{
    node* root = NULL;

    insert(&root, 'F');
    insert(&root, 'B');
    insert(&root, 'O');
    insert(&root, 'L');
    insert(&root, 'A');
    insert(&root, 'D');
    insert(&root, 'C');
    insert(&root, 'M');
    insert(&root, 'G');
    insert(&root, 'H');
    insert(&root, 'N');
    insert(&root, 'K');

    print2(root);   printf("\n");   print(root);    printf("\n\n");

    del(&root, 'F');    print2(root);   printf("\n");   print(root);    printf("\n\n");

    bti_balance(&root);
    print2(root);   printf("\n");   print(root);    printf("\n");
}


void bti_balance(node** base)
{
    int i;
    index = 0;
    bti_sort(&(*base));
    i = index;
    bti_deleteall(&(*base));
    index = 0;
    *base = balance(i);
}

 // 이진 트리 균형잡는 함수
node* balance(int n)
{
    int n_left, n_right;
    node* temp;
    if(n > 0)
    {
        n_left = (n-1)/2;
        n_right = n - n_left - 1;
        temp = (node*)malloc(sizeof(node));
        temp->left = balance(n_left);
        temp->data = array[index++];
        temp->right = balance(n_right);
        return temp;
    }
    else
        return NULL;
}

 // 이진 트리 모든 노드 삭제 함수
void bti_deleteall(node** p)
{
    if(*p != NULL)
    {
        bti_deleteall(&(*p)->left);
        bti_deleteall(&(*p)->right);
        free(*p);
    }
}

 // 이진 트리를 순회 하면서 값을 배열에 저장하는 함수
void bti_sort(node** p)
{
    if(*p != NULL)
    {
        bti_sort(&(*p)->left);
        array[index++] = (*p)->data;
        bti_sort(&(*p)->right);
    }
}

node* del(node** base, char key)
{
    node *temp, *son, *nexth, *parent;
    int flag = 0;
    temp = *base;
    while(temp->data != key && temp != NULL)
    {
        flag = 1;
        parent = temp;
        if(temp->data > key)
            temp = temp->left;
        else
            temp = temp->right;
    }
    if(temp == NULL)
        return NULL;
    if(temp->left == NULL && temp->right == NULL)  // 노드의 자식이 없는 경우
        son = NULL;
    else if(temp->left != NULL && temp->right != NULL)  // 노드의 자식이 둘인 경우
    {
        nexth = temp->right;
        if(nexth->left != NULL)  // 노드의 오른쪽 자식의 왼쪽 자식이 있는 경우
        {
            while(nexth->left->left != NULL)
                nexth = nexth->left;
            son = nexth->left;
            nexth->left = son->right;
            son->left = temp->left;
            son->right = temp->right;
        }
        else  // 노드의 오른쪽 자식의 왼쪽 자식이 없는 경우
        {
            son = nexth;
            son->left = temp->left;
        }
    }
    else  // 노드의 자식이 하나인 경우
    {
        if(temp->left != NULL)
            son = temp->left;
        else
            son = temp->right;
    }

    if(flag)
    {
        if(parent->data > key)
            parent->left = son;
        else
            parent->right = son;
    }
    else
        *base = son;
    free(temp);
    return son;
}

 

void print(node* base)
{
    node* temp = base;
    if(temp != NULL)
    {
        print(temp->left);
        printf("%3c",temp->data);
        print(temp->right);
    }
}

 void print2(node* base)
{
    node* temp = base;
    if(temp != NULL)
    {
        printf("%3c",temp->data);
        print2(temp->left);
        print2(temp->right);
    }
}

 node* insert(node** base, char key)
{
    if((*base) == NULL)
    {
        (*base) = (node*)malloc(sizeof(node));
        (*base)->data = key;
        (*base)->left = NULL;
        (*base)->right = NULL;
    }
    else if((*base)->data > key)
        (*base)->left = insert(&(*base)->left, key);
    else
        (*base)->right = insert(&(*base)->right, key);
    return *base;
}

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

typedef struct _node
{
    char* data;
    struct _node* next;
    struct _node* back;
}node;
node *head, *tail;
int total, now;  // 전체페이지, 현재페이지 출력 변수

void init_line(void);
void load_file(void);
void show_header(void);
void show_page(node*);
void key_proc(void);
void move_line(int, node**);
void gotoxy(int, int);

void main()
{
    init_line();
    load_file();
    key_proc();
    puts("Program ends...");
}

//노드 초기화 함수
void init_line(void)
{
    head = (node*)malloc(sizeof(node));
    tail = (node*)malloc(sizeof(node));
    head->next = tail;
    head->back = head;
    tail->back = head;
    tail->next = tail;
}

//파일 로드 함수
void load_file(void)
{
    FILE *fp;
    char buf[256];
    node* temp;
    if((fp = fopen("test.txt","rt"))==NULL)
    {
        puts("Error : Can`t read that file.");
        exit(1);
    }
    while(!feof(fp))
    {
        fgets(buf, 255, fp);
        if(strlen(buf)>80)
            buf[80] = 0;  // 최대길이 80
        if((temp = (node*)malloc(sizeof(node))) == NULL)
        {
            puts("Error : Out of Memory.");
            exit(1);
        }
        if((temp->data = (char*)malloc(strlen(buf))) == NULL)
        {
            puts("Error : Out of Memory.");
            exit(1);
        }
        strcpy(temp->data, buf);
        temp->next = tail;
        temp->back = tail->back;
        tail->back->next = temp;
        tail->back = temp;
        total++;  //전체 갯수 증가
    }
    fclose(fp);
}  

//화면 출력 함수
void show_page(node* temp)
{
    int line = 0;
    system("cls");
    show_header();
    gotoxy(1, 2);
    while(line++ < 23 && temp != tail)
    {
        cprintf("%-80s\r", temp->data);
        temp = temp->next;
    }
}

//키 제어 함수
void key_proc(void)
{
    node* temp;
    now = 1;
    temp = head->next;
    show_page(temp);
    while(1)
    {
        //ESC키 눌렀을때
        if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
            break;
        //PgUp키 눌렀을때
        if(GetAsyncKeyState(VK_PRIOR) & 0x8000)
        {
            move_line(-23, &temp);
            show_page(temp);
        }
        //PgDn키 눌렀을때
        if(GetAsyncKeyState(VK_NEXT) & 0x8000)
        {
            move_line(23, &temp);
            show_page(temp);
        }
        //▲키 눌렀을때
        if(GetAsyncKeyState(VK_UP) & 0x8000)
        {
            move_line(-1, &temp);
            show_page(temp);
        }
        //▼키 눌렀을때
        if(GetAsyncKeyState(VK_DOWN) & 0x8000)
        {
            move_line(1, &temp);
            show_page(temp);
        }
    }
    system("cls");
}

//페이지 이동 함수
void move_line(int d, node** temp)
{
    if(d<0)
    {
        while(d++ < 0 && (*temp)->back != head)
        {
            *temp = (*temp)->back;
            now--;
        }
    }
    else
    {
        while(d-- > 0 && (*temp)->next != tail)
        {
            *temp = (*temp)->next;
            now++;
        }
    }
}

//출력화면의 최상단 화면
void show_header(void)
{
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hout, &csbi);

    //출력색 변환
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    gotoxy(1, 1);
    cprintf("TVIEW : %-12s     Loc : %6d of %6d     By Jeong Jin Hwa     ", "test.txt", now, total);
    //원래색으로 변환
    SetConsoleTextAttribute(hout, csbi.wAttributes);
}

//gotoxy함수
void gotoxy(int x, int y)
{
   COORD Pos = {x - 1, y - 1};
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

//Double Linked List
#include<stdio.h>
#include<stdlib.h>

 typedef struct _node
{
     int data;
     struct _node* back;
     struct _node* next;
}node;
node *head, *tail;

 void print_all(void);
void init_link(void);
void insert_link(int x);
node* find_node(int x);
void insert_before(int x, node* y);
void del_node(node* x);
void all_del_node(void);

 void main()
{
    init_link();
    insert_link(10);
    insert_link(5);
    insert_link(8);
    insert_link(3);
    insert_link(1);
    insert_link(7);
    insert_link(8);

    printf("Inital Linked list is ");
    print_all();

     printf("Finding 4 is %s\n", find_node(4) != tail ? "successful" : "unsuccessful");
    printf("Finding 5 is %s\n", find_node(5) != tail  ? "successful" : "unsuccessful");

     puts("Inserting 7 before 5");
    insert_before(7, find_node(5));
    print_all();

     puts("Deleting 3");
    del_node(find_node(3));
    print_all();

     puts("Inserting node 2 before 10");
    insert_before(2, find_node(10));
    print_all();

     puts("Deleting 2");
    del_node(find_node(2));
    print_all();

     puts("Deleting 1");
    del_node(find_node(1));
    print_all();

     puts("Insering node 15");
    insert_before(15, head->next);
    print_all();

     puts("Deleting all node");
    all_del_node();
    print_all();
}

 //전체 노드 삭제

void all_del_node(void)
{
    node* temp;
    temp = head->next;
    while(temp != tail)
    {
        temp = temp->next;
        free(temp->back);
    }

    //노드 초기화
    head->next = tail;
    tail->back = head;
}

 

//노드를 입력받아 삭제

void del_node(node* x)
{
    if(x != tail)
    {
        x->back->next = x->next;
        x->next->back = x->back;
        free(x);
    }
    else
        puts("!!!!!!!!!!!!!!!!! Not Node !!!!!!!!!!!!!!!!!");
}

 

//찾은 노드 이전에 삽입

void insert_before(int x, node* y)
{
    node* temp = (node*)malloc(sizeof(node));

    temp->data = x;
    y->back->next = temp;
    temp->back = y->back;
    y->back = temp;
    temp->next = y;
}

 

//노드 찾기
node* find_node(int x)
{
    node* temp;
    temp = head->next;
    while(temp->data != x && temp != tail)
        temp = temp->next;
    return temp;
}

 

//노드값 화면에 출력

void print_all(void)
{
    node* temp;
    temp = head->next;
    while(temp != tail)
    {
        printf("%5d",temp->data);
        temp = temp->next;
    }
    printf("\n");
}

 

//노드 초기화

void init_link(void)
{
    head = (node*)malloc(sizeof(node));
    tail = (node*)malloc(sizeof(node));
    head->next = tail;
    head->back = head;
    tail->next = tail;
    tail->back = head;
}

 

//노드 입력 받기
void insert_link(int x)
{
    node *a;
    node* temp = (node*)malloc(sizeof(node));
   
    a = head->next;
    while(a->data <= x && a != tail)
     a = a->next;

    temp->data = x;
    a->back->next = temp;
    temp->back = a->back;
    temp->next = a;
    a->back = temp;
}


//Circular Linked List
//요셉의 문제

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

typedef struct _node
{
    int data;
    struct _node* next;
}node;
node* head;

void step_del(int x);
void init_node(int x);

void main()
{
    int n, step;

    printf("사람의 수와 간격을 입력해 주세요 : ");
    scanf("%d %d", &n, &step);
    fflush(stdin);
   
    init_node(n);
    step_del(step);
}

void init_node(int x)
{
    int i;
    node* temp = (node*)malloc(sizeof(node));
    head = temp;
    temp->data = 1;
   
    for(i=2 ; i<=x ; i++)
    {
        temp->next = (node*)malloc(sizeof(node));
        temp = temp->next;
        temp->data = i;
    }
    temp->next = head;
}

void step_del(int x)
{
    int i;
    node *a, *del;
    a = head;
    while(a != a->next)
    {
        for(i=0; i<x-1 ;i++)
            a = a->next;
        printf("%5d", a->next->data);
        del = a->next;
        a->next = a->next->next;
        free(del);
    }
    printf("%5d\n",a->data);
    free(a);
}



// Simple Linked List
#include<stdio.h>
#include<stdlib.h>

typedef struct _node
{
    int data;
    struct _node* next;
}node;
node *head, *tail;

 void node_print(void);
void init_node(void);
void insert_node(int);
node* find_node(int);
void insert_after(int, node*);
void del_next_node(node*);
void insert_before(int, node*);
void del_node(int);
void del_all(void);

 void main()
{
    init_node();
    insert_node(1);
    insert_node(10);
    insert_node(5);
    insert_node(8);
    insert_node(3);
    insert_node(8);
    insert_node(7);

    puts("Inital Linked list is");
    node_print();

    printf("Finding 4 is %s\n", find_node(4)!=tail ? "successful" : "unsuccessful");
    printf("Finding 5 is %s\n", find_node(5)!=tail ? "successful" : "unsuccessful");
   
    puts("Inserting 9 after 5");
    insert_after(9, find_node(5));
    node_print();

    puts("Deleting next last node");
    del_next_node(find_node(10));
    node_print();

    puts("Deleting next 3");
    del_next_node(find_node(3));
    node_print();

    puts("Inserting 2 before 3");
    insert_before(2, find_node(3));
    node_print();

    puts("Deleting node 2");
    del_node(2);
    node_print();

    puts("Deleting node 1");
    del_node(1);
    node_print();

    puts("Deleting all node");
    del_all();
    node_print();

}

 //노드전체 삭제
void del_all(void)
{
    node *a, *temp;
    a = head->next;
    while(a != tail)
    {
        temp = a;
        a = a->next;
        free(temp);
    }
    head->next=tail;
}

 //선택한 노드 삭제
void del_node(int x)
{
    node *a, *b;
    a = head;
    b = head->next;
    while(b->data != x && b != tail)
    {
        a = a->next;
        b = b->next;
    }
    if(b != tail)
    {
        a->next = b->next;
        free(b);
    }
}
 

//찾는 숫자 이전에 노드 삽입
void insert_before(int x, node* y)
{
    node *a, *b;
    node* insert = (node*)malloc(sizeof(node));
    a = head;
    b = a->next;
    while(b->data != y->data && b != tail)
    {
        a = a->next;
        b = b->next;
    }
    if(b != tail)
    {
        insert->data = x;
        insert->next = b;
        a->next = insert;
    }
}
   
//찾는 숫자 다음에 노드 삭제
void del_next_node(node* x)
{
    node* temp;
    if(x != tail)
    {
        temp = x->next;
        x->next = x->next->next;
        free(temp);
    }
}

 //찾는 숫자다음에 노드 삽입
void insert_after(int x, node* y)
{
    node* insert = (node*)malloc(sizeof(node));
    insert->data = x;
    insert->next = y->next;
    y->next = insert;
}

 //노드 찾기
node* find_node(int x)
{
    node* a;
    a = head->next;
    while(a->data != x && a!=tail)
        a = a->next;
    return a;
}

 //노드 출력하기
void node_print(void)
{
    node* a;
    a = head->next;
    while(a != tail)
    {
        printf("%-7d",a->data);
        a = a->next;
    }
    puts("");
}

 //head, tail 노드 초기화
void init_node(void)
{
    head = (node*)malloc(sizeof(node));
    tail = (node*)malloc(sizeof(node));
    head->next = tail;
    tail->next = tail;
}

 //노드 추가
void insert_node(int x)
{
    node *a, *b;
    node* insert = (node*)malloc(sizeof(node));
    a = head;
    b = a->next;
    while(b->data <= x && b != tail)
    {
        a = a->next;
        b = b->next;
    }  
    insert->data = x;
    a->next = insert;
    insert->next = b;
}

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

#define MAX_SIZE 19
#define ROBOT1   38   // &
 

#define UP      1  
#define RIGHT   2
#define DOWN    4
#define LEFT    8
 

int get_shape(int, int);
void draw_maze(void);
void gotoxy(int , int);
void right_hand(int, int, int);
int wall_ahead(int, int, int);
void right(int*);
void left(int*);
int still_in_maze(int, int);
void foward(int*, int*, int);
void shortest_path(void);
void del_path(int, int);
void record(int, int);

int maze[MAX_SIZE][MAX_SIZE]={
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
        {1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1},
        {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
        {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
        {1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1},
        {1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
        {1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
        {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

int* save;  // 이동경로 저장

void main()
{
    save = (int*)malloc(MAX_SIZE * MAX_SIZE);  // 배열 생성
    if(save==NULL)
    {
        printf("Memory allocation error !!!!\n");
        exit(1);
    }
    draw_maze();  // 미로 그리는 함수 호출
    gotoxy(40, 5);
    cputs("Simulation of Micro Mouse");
    gotoxy(40, 10);
    cputs("\t Press any key to start...");
    getche();

    right_hand(MAX_SIZE-2, MAX_SIZE-1, LEFT);  // 미로 이동 실행   
    gotoxy(40, 10);
    cputs("\t Press any key to see shortest path...");
    getche();

    shortest_path();  // 최단거리 함수 호출
    gotoxy(40, 20);
}
 

// 최단거리 함수 출력
void shortest_path(void)
{
    int init_x, init_y;
    int i, j;  
    for(i=0 ; save[i]>-1 ; i++)
    {
        init_x = save[i++];
        init_y = save[i];
        for(j=i+1 ; save[j]>-1 ; j++)
        {
            if(save[j++] == init_x && save[j] == init_y)
                del_path(i-1, j-1);
        }
    }

    // 출력
    i=0;
    while(save[i]>-1)
    {
        gotoxy(save[i+1]+1, save[i]+1);
        putchar(ROBOT1);
        Sleep(100);
        gotoxy(save[i+1]+1, save[i]+1);
        putchar(' ');
        i+=2;
    }
}
 

// 필요없는 경로 삭제 함수
void del_path(int x, int y)
{
    int i;
    for(i=0; save[y+i]>-1 ; i++)
        save[x+i] = save[y+i];
    save[x+i] = -1; // 배열의 끝을 선언
}

 // 이동경로 저장 함수
void record(int x, int y)
{
    static int i = 0;
    save[i++] = x;
    save[i++] = y;
}
 

// 미로 이동 함수
void right_hand(int x, int y, int dir)
{
    gotoxy(y + 1, x + 1);
    putchar(ROBOT1);
    Sleep(100);
    record(x, y);

    foward(&x, &y, dir);
    while(still_in_maze(x, y))
    {
        right(&dir);
        while(wall_ahead(x, y, dir)) // 앞에 벽이 1이 없을때 까지
        {          
            left(&dir);
        }
        foward(&x, &y, dir);
    }
    record(-1, -1); // 배열 마지막을 선언
}
 

//다음 경로값 1 확인 함수
int wall_ahead(int x, int y, int dir)
{
    switch(dir)
    {
        case UP     : --x; break;
        case RIGHT  : ++y; break;
        case DOWN   : ++x; break;
        case LEFT   : --y; break;
    }
    return maze[x][y];
}
 

// 오른쪽으로 회전
void right(int* dir)
{
    *dir = *dir << 1;
    if((*dir) > LEFT)
        *dir = UP;
}

//왼쪽으로 회전
void left(int* dir)
{
    *dir = *dir >> 1;
    if((*dir) < UP)
        *dir = LEFT;
}

//미로 안에 있는지 판별 함수
int still_in_maze(int x, int y)
{
    if(x>0 && x< MAX_SIZE-1 && y>0 && y<MAX_SIZE-1)
        return 1;
    else
        return 0;
}

//방향에 따라 전진 하는 함수
void foward(int* x, int* y, int dir)
{
    gotoxy((*y)+1, (*x)+1);
    putchar(' ');

    switch(dir)
    {
        case UP     : --(*x); break;
        case RIGHT  : ++(*y); break;
        case DOWN   : ++(*x); break;
        case LEFT   : --(*y); break;
    }
    gotoxy((*y)+1, (*x)+1);
    putchar(ROBOT1);
    Sleep(100);
    record(*x, *y);
}
 

// 미로글 그리는 함수
void draw_maze(void)
{
    int i, j;

    for(i=0 ; i<MAX_SIZE ; i++)
        for(j=0 ; j<MAX_SIZE ; j++)
        {
            gotoxy(j+1 , i+1);
            putchar(get_shape(i ,j));
        }
}

 //미로의 값에 따라 형태를 리턴하는 함수
int get_shape(int x, int y)
{
    static int shape[]= { 32, 5, 6, 3, 5, 5, 1, 25, 6, 4, 6, 21, 2, 23, 22, 16};
    int s=0;

    if(maze[x][y])
    {
        if(x>0 && maze[x-1][y])
            s = s | UP;
        if(x<MAX_SIZE-1 && maze[x+1][y])
            s = s | DOWN;
        if(y>0 && maze[x][y-1])
            s = s | LEFT;
        if(y<MAX_SIZE-1 && maze[x][y+1])
            s = s | RIGHT;
    }

    return shape[s];
}

 //VC 6.0 에서 사용할수 없는 gotoxy()함수 구현
void gotoxy(int x, int y)
{
    COORD Pos = {x-1,y-1};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);
}


+ Recent posts