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

struct pnode{  //구조체 선언
 char data;  //테이터 수식
 int num;  //트리구조의 번지
 struct pnode *left;   //왼쪽 노드의 포인터 변수
 struct pnode *right;  //오른쪽 노드의 포인터 변수
 };
typedef struct pnode NODE;  //이름을 노드로 정의한다.



NODE *insert(NODE *p, int num, char x)  //삽입 함수
{ //포인터 변수와 번지와 데이터를 받음
 NODE *temp1; //포인터 선언
 NODE *temp2;
 if(p==NULL)  //포인터 p에 데이터가 없을 경우
 {
  p=(NODE *)malloc(sizeof(NODE)); //포인터 생성b
  if(p==NULL)
  { //생성을 실패했을 경우 에러발생
   printf("에러\n");
   exit(0);
  }
  p->num=num;  //번지를 구조체에 대입
  p->data=x;  //계수를 구조체에 대입
  p->left=NULL; //왼쪽을 NULL지정
  p->right=NULL; //오른쪽을 NULL지정
 }
 else    //포인터 p에 데이터가 있을 경우
 {
  temp1 = p;  //temp1에 p의 주소를 대입
  while (temp1 != NULL) //temp1이 NULL 아닐때까지 반복
  { 
   temp2 = temp1;  //temp2에 temp1의 주소를 대입
   if(temp1->num > num)//temp1의 번지가 입력받은 번지보다 작을 경우
   {
    temp1=temp1->left;  //왼쪽 노드로 이동
   }
   else    //temp1의 번지가 입력받은 번지보다 클 경우
   {
    temp1 =temp1->right; //오른쪽 노드로 이동
   }
  } //반복문의 종료되면 더 이상 하위 노드는 없다
   if(temp2->num > num)//temp2의 번지가 입력받은 번지보다 작을 경우
   { //왼쪽으로 노드 생성
    temp2->left = (NODE *)malloc(sizeof(NODE));
    temp2 = temp2->left;
    if(temp2 == NULL){ //노드 생성 실패시 에러 발생
     printf("에러\n");
     exit(0);  
    }
    temp2 -> num = num;  //temp2에 번지 대입
    temp2 -> data = x;  //tmep2에 데이터 대입
    temp2 -> left = NULL; //temp2의 왼쪽과 오른쪽을 NULL 입력
    temp2 -> right = NULL;
   }
   else{ //temp2의 번지가 입력받은 번지보다 클 경우
    temp2->right = (NODE *)malloc(sizeof(NODE));
    //오른쪽으로 노드 생성
    temp2 =temp2 ->right;
    if(temp2 == NULL){ //노드 생성 실패시 에러 발생
     printf("에러\n");
     exit(0);
    }
    temp2 -> num = num;  //temp2에 번지 대입
    temp2 -> data = x;  //temp2에 데이터 대입
    temp2 -> left = NULL; //temp2의 왼쪽과 오른쪽을 NULL입력
    temp2 -> right = NULL;
   }
  }
 return (p);  //리턴 포인터 p  
}

NODE *searching(NODE* p, int num, NODE **parent) //검색 함수
{
 NODE* current;  //노드 포인터 선언

 current = p;  //current에 입력받은 포인터 p의 주소 대입
 *parent = NULL;  //이중포인터 parent을 NULL 지정

 if(current == NULL) //current가 NULL이면 에러
  return(NULL); //리턴 NULL을 해줌

 while(current != NULL){  //current가 NULL아닐때까지 반복
  if(current->num ==num) //current의 번지가 입력 받은 번지와 같을 경우
   return(current); //리턴 current
  else{     //번지가 다를 경우
   *parent = current; //부모포인터를 current로 지정 후
   if(num < current->num) //입력 받은 번지 값보다 current의 번지 같이 클 경우
    current = current->left; //current는 왼쪽 지정
   else     //작을 경우
    current = current->right; //current는 오른쪽 지정
  }
 }
 return(NULL);
}

NODE *deletion(NODE* p, int num) //삭제 함수
{
 NODE* current, *parent, *temp; //포인터 선언

 current = searching(p, num, &parent); //검색 함수를 호출
 if(current == NULL)  //검색되어 리턴된 값이 NULL이면 에러
 {
  printf("데이터번지가 없습니다.\n");
  return(p);
 }
 else  //검색된 값이 NULL 아니면
 {
  if(current == p) //검색된 값이 루트와 같을 경우
  {
   temp = current ->left;  //temp에 검색된 값의 왼쪽을 대입하고
   parent = current ->right; //parent에 검색된 값의 오른쪽을 대입한다.
   p = temp;     //p에 temp를 대입
   while(temp ->right != NULL) //temp의 오른쪽 같이 NULL아닐 때까지 반복
    temp = temp ->right; //temp에 temp 오른쪽 노드값을 대입
   temp ->right = parent;  //반복문이 끝나면 temp의 오른쪽 노드에 parent의 값을 대입
   free(current);    //current를 포인터를 해제한다.
   return(p);
  }
  if(current ->left != NULL && current ->right !=NULL)
  { //검색된 값이 루트는 아니지만 양쪽다 노드를 가지고 있을 경우
   if(parent ->left == current) //부모 노드의 왼쪽노드와 검색된 값이 같은 경우
   {
    temp = current ->left;   //temp에 검색된 값의 왼쪽노드를 대입
    parent ->left = current ->left; //parent의 왼쪽 노드에 검색된 왼쪽 노드를 대입
    while(temp ->right != NULL)  //temp의 오른쪽 노드가 NULL아닐 때까지 반복
     temp = temp->right;   //temp에 temp의 오른쪽 노드를 대입
    temp->right = current ->right;
    //반복이 끝나면 temp의 오른쪽 노드에 검색된 노드의 오른쪽 노드를 대입
    current ->left=NULL;   //검색된 왼쪽 노드에 NULL을 대입
    current ->right=NULL;   //검색된 오른쪽 노드에 NULL을 대입
   }
   else       //부모 노드의 오른쪽노드와 검색된 값이 같은 경우
   {
    temp = current ->right;   //temp에 검색된 값의 오른쪽노드를 대입
    parent ->right = current ->right;//parent의 오른쪽 노드에 검색된 오른쪽 노드를 대입
    while(temp ->left != NULL)  //temp의 왼쪽 노드가 NULL아닐 때까지 반복
     temp = temp->left;   //temp에 temp의 오른족 노드를 대입
    temp->left = current ->left;
    //반복이 끝나면 temp의 왼쪽 노드에 검색된 노드의 왼쪽 노드를 대입
    current ->left=NULL;   //검색된 왼쪽 노드에 NULL을 대입
    current ->right=NULL;   //검색된 오른쪽 노드에 NULL을 대입
   }
   free(current);      //current를 포인터를 해제한다.
   return(p);
  }
  if(current->left == NULL && current ->right != NULL)
  { //검색된 값이 루트는 아니지만 왼쪽에는 NULL이고 오른쪽은 값을 가지고 있을 경우
   if(parent ->left ==current)  //부모 노드의 왼쪽노드와 검색된 겂이같은 경우
    parent ->left = current ->right;//부모의 왼쪽노드와 검색된 노드의 오른쪽 노드 대입
   else       //부모 노드의 오른쪽 노드와 검색된 값이 같은 경우
    parent ->right = current ->right;//부모의 오른쪽노드와 검색된 노드의 오른쪽 노드 대입
   current ->right = NULL;   //검색된 노드의 오른쪽 노드에 NULL 대입
   free(current);     //currenat를 포인터를 해제한다.
   return(p);
  }
  if(current ->left != NULL && current ->right ==NULL)
  { //검색된 값이 루트는 아니지만 왼쪽에는 값이 있고 오른쪽에는 값이 NULL일 경우
   if(parent ->left == current) //부모노드의 왼쪽 값이 검색된 값과 같을 경우
    parent ->left = current ->left;//부모노드의 왼쪽 노드에 검색된 노드의 왼쪽 값을 대입
   else       //부모노드의 오른쪽 값이 검색된 값과 같을 경우
    parent->right = current ->left;//부모노드의 오른쪽 노드에 검색된 노드의 왼쪽 값을 대입
   current ->left = NULL;   //검색된 노드의 왼쪽 값에 NULL을 대입
   free(current);     //current를 포인터를 해제한다.
   return(p);
  }
  if(current ->left == NULL && current ->right == NULL)
  { //검색된 값이 루트는 아니지만 왼쪽과 오른쪽 모두 NULL인 경우
   if(parent ->left == current) //부모 노드의 왼쪽 노드와 검색된 값이 같은 경우
    parent ->left = NULL;  //부모 노드의 왼쪽 값을 NULL로 해준다.
   else       //부모 노드의 오른쪽 노드와 검색된 값이 같은 경우
    parent ->right = NULL;  //부모 노드의 오른쪽 값을 NULL로 해준다.
   free(current);     //current를 포인터를 해제한다.
   return(p);
  }
 }
 return (p);
}


void preOrder(NODE *ptr){   //전위 운행법 함수
 if(ptr){      //재귀적으로 호출
  printf("%c ",ptr->data); //루트노드부터 출력후 왼쪽 노드부터 출력
  preOrder(ptr->left);  //왼쪽 서브 트리를 모두 방문
  preOrder(ptr->right);  //오른쪽 서브 트리들은 방문
 }        //모든 노드에 재귀적으로 적용 모든 노드를 한번씩 방문
}
void inOrder(NODE *ptr){   //중위 운행법 함수
 if(ptr){      //재귀적으로 호출
  inOrder(ptr->left);   //먼저 왼쪽 서브 트리를 모두 방문
  printf("%c ",ptr->data); //왼쪽 방문이 끝난 노드부터 출력
  inOrder(ptr->right);  //오른쪽 서브 트리들을 방문
 }        //모든 노드에 재귀적으로 적용 모든 노드를 한번씩 방문
}
void postOrder(NODE *ptr){   //후위 운행법 함수
 if(ptr){      //재귀적으로 호출
  postOrder(ptr->left);  //왼쪽 서브트리를 모두 방문
  postOrder(ptr->right);  //오른쪽 서브트리를 모두 방문
  printf("%c ",ptr->data); //자식노드가 없거나 출력된 상태이면 출력
 }        //모든 노드에 재귀적으로 적용 모든 노드를 한번식 방문
}
void printTree(NODE *point)   //운행법을 호출 하는 함수
{
 printf("\n전위 운행법으로 출력 >> ");
 preOrder(point);    //전위 운행법 호출
 printf("\n");
 printf("중위 운행법으로 출력 >> ");
 inOrder(point);     //중위 운행법 호출
 printf("\n");
 printf("후위 운행법으로 출력 >> ");
 postOrder(point);    //후위 운행법 호출
 printf("\n");
}
void main(){     //메인 함수
 int i, j, del, num;   //각종 변수 선언
 int k=2;
 char x, yn, ny;
 NODE *point = NULL;  
 
 printf("컴퓨터정보학과 2006270191 정 훈 승\n");

 printf("포화 이진 트리의 원하는 레벨을 입력하세요! >> ");
 scanf("%d",&j);   //레벨을 입력을 받는다.
 for(i=2;i<=j;i++){  //레벨 값에 맞는 포화 이진 트리의 노드를 계산
  k = k * 2;   //2의 k승에 빼기 1을 하면  
 } k = k - 1;   //포화 이진 트리의 총 노드가 나온다.


 for (i=1; i<=k;i++){ //총 노드수 만큼 입력을 받는다.
  printf("%d번째 부터 번지와 데이터값순으로 입력하세요! >> ",i);
  scanf("%d %s",&num, &x);  //입력은 번지와 데이터값을 받는다.
  point = insert (point, num, x); //삽입 함수를 호출한다.
 }        
 printTree(point); //삽입 함수가 완료하면 운행법을 호출 한다.
 
 printf("삭제를 원하시면 y 종료를 원하시면 n? >> ");
 scanf("%s", &yn); //삭제 여부를 물어본다.
 if(yn == 'y')  //삭제를 원할 경우
 {
  do
  {
   printf("삭제할 번지를 입력하세요! >>");
   scanf("%d", &del);    //삭제할 번지를 입력 받는다
   point = deletion(point, del); //입력받은 번지로 삭제 함수를 호출
   printf("더 삭제 하실꺼면 y, 그만 삭제를 원하시면 n? >> ");
   scanf("%s", &ny);    //더 삭제를 원할 경우 계속 반복
   if(ny == 'n')     //그만 삭제를 원할경우 반복이 종료
   {
    break;
   }
  }while(1);     //삭제를 원하면 무한 반복
 }
 else{
  exit(0);  //처음 삭제를 원하지 않을 경우 종료
 }
 printTree(point); //만약 삭제를 한번이라도 했으면 운행법 호출
 
}

// 참 쉽죠? ^^ 재밌게 공부하세요

Posted by 정훈승

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 20

int data[MAX];
int random[MAX];
int tmp[MAX]; // 합병정렬에서 사용
double result[6];
clock_t start, end;

void ArrayReset(); // 배열 초기화
void swap(int*, int*); // 값 바꾸는 함수
void print_sorted();

void SelectionSort(); // 선택정렬
int Small(int);

void InsertionSort(); // 삽입정렬

void BubbleSort(); // 버블정렬

void MergeSort(int, int); // 합병정렬
void Merge(int, int, int);

void QuickSort(int, int); // 퀵정렬

void firstNode(int); // 이진탐색트리
struct node* makeNode(int);
void searchNode(struct node*,int);
void inOrder(struct node*);

/*구조체 선언*/
struct node
{
 int value;
 struct node *Alink;
 struct node *Blink;
};
struct node *Root=NULL;

/*랜덤으로 수를 정해줌*/
int main(){
 
 int i, j, k, x, count;
 srand((unsigned)time(NULL));
 for(j=0;j<MAX;j++){
  do{
   x=rand()%101;
   count=0;
   for(k=0;k<j;k++){
    if(random[k]==x) count++;
   }
  }while(count!=0);
  random[j]=x;
 }

 printf("☞정렬 데이터\n");
 for(i=0;i<MAX;i++) printf("%d ", random[i]);
 printf("\n\n");
 
 ArrayReset();
 start=clock();
 SelectionSort();
 end=clock();
 printf(" ☞ 선택정렬\n");
 print_sorted();
 result[0]=(double)(end-start)/CLOCKS_PER_SEC;
 
 ArrayReset();
 start=clock();
 InsertionSort();
 end=clock();
 printf(" ☞ 삽입정렬\n");
 print_sorted();
 result[1]=(double)(end-start)/CLOCKS_PER_SEC;
 
 ArrayReset();
 start=clock();
 BubbleSort();
 end=clock();
 printf(" ☞ 버블정렬\n");
 print_sorted();
 result[2]=(double)(end-start)/CLOCKS_PER_SEC;
 
 ArrayReset();
 start=clock();
 MergeSort(0, MAX-1);
 end=clock();
 printf(" ☞ 합병정렬\n");
 print_sorted();
 result[3]=(double)(end-start)/CLOCKS_PER_SEC;
 
 ArrayReset();
 start=clock();
 QuickSort(0, MAX-1);
 end=clock();
 printf(" ☞ 퀵정렬\n");
 print_sorted();
 result[4]=(double)(end-start)/CLOCKS_PER_SEC;
 
 ArrayReset();
 printf(" ☞ 이진탐색트리\n");
 start=clock();
 firstNode(random[0]);
 for(i=1;i<MAX;i++)
  searchNode(Root,random[i]);
 end=clock();
 inOrder(Root);
 result[5]=(double)(end-start)/CLOCKS_PER_SEC;
 
 printf("\n\n");
 for(i=0;i<6;i++)
  printf("%2.3f ", result[i]);
 
 printf("\n");
 return 0;
 
}
/*정렬할 배열 데이터 초기화*/
void ArrayReset(){
 int i;
 for(i=0;i<MAX;i++){
  data[i]=random[i];
 }
}

void swap(int *a, int *b){
 int tmp;
 tmp=*a;
 *a=*b;
 *b=tmp;
}

/*정렬 결과 출력*/
void print_sorted(){
 int i;
 for(i=0;i<MAX;i++) printf("%d ", data[i]);
 printf("\n");
}

/* 선택정렬*/
void SelectionSort(){
 int i, j;
 for(i=0;i<MAX-1;i++){
  j=Small(i+1);
  if(data[i]>data[j]){
   swap(&data[i], &data[j]);
  }
 }
}
 
/*가장 작은 수를 찾는 함수 */
int Small(int a){
 int i, j=a, small=data[a];
 for(i=a;i<MAX;i++){
  if(data[i]<small){
   small=data[i];
   j=i;
  }
 }
 return j;
}

/* 삽입정렬 */
void InsertionSort(){
 int tmp, i, j;
 for(i=1;i<MAX;i++){
  tmp=data[i];
  j=i;
  while(data[j-1]>tmp && j>=1){
   data[j]=data[j-1];
   j--;
   
  }
  data[j]=tmp;
 }
}

/* 버블정렬*/
void BubbleSort(){
 int i, j;
 for(i=MAX;i>=0;i--){
  for(j=0;j<i-1;j++){
   if(data[j]>data[j+1]){
    swap(&data[j], &data[j+1]);
   }
  }
 }
}

/* 합병정렬 */
void MergeSort(int low, int high){
 int mid;
 if(low<high){
  mid=(low+high)/2;
  MergeSort(low,mid);
  MergeSort(mid+1,high);
  Merge(low, mid,high);
 }
}

void Merge(int low, int mid, int high){
 int i, l, m, k;
 l=low;
 m=mid+1;
 k=low;
 while(l<=mid && m<=high){
  if(data[l]<=data[m]){
   tmp[k++]=data[l++];
  }
  else{
   tmp[k++]=data[m++];
  }
 }
 if(l>mid){
  for(i=m;i<=high;i++){
   tmp[k++]=data[i];
  }
 }
 else{
  for(i=l;i<=mid;i++){
   tmp[k++]=data[i];
  }
 }
 
 for(i=low;i<=high;i++){
  data[i]=tmp[i];
 }
}

/* 퀵정렬*/
void QuickSort(int left, int right){
 int pivot=data[left], i=left, j=right+1;
 if(left<right){
  do{
   do{
    i++;
   }while(pivot>data[i]);
   
   do{
    j--;
   }while(pivot<data[j]);
   
   if(i<j){
    swap(&data[i], &data[j]);
   }
  }while(i<j);
 
  swap(&data[left], &data[j]);
  QuickSort(left, j-1);
  QuickSort(j+1, right);
 }
}

/* 이진탐색트리 */
void firstNode(int a){
 Root=makeNode(a);
}

struct node* makeNode(int b){
 struct node *mnode;
 mnode=(struct node*)malloc(sizeof(struct node));
 mnode->value=b;
 mnode->Alink=NULL;
 mnode->Blink=NULL;
 return mnode;
}

void searchNode(struct node *T,int a){
 struct node *snode;

 if(T->value>a) {
  if(T->Alink!=NULL){
   searchNode(T->Alink,a);
  }
  else {
   snode=makeNode(a);
   T->Alink=snode;
  }
 }

 else{
  if(T->Blink!=NULL){
   searchNode(T->Blink,a);
  }
  else{
   snode=makeNode(a);
   T->Blink=snode;
  }
 }
}

void inOrder(struct node* T){
 if(T!=NULL){
  inOrder(T->Alink);
  printf("%d ", T->value);
  inOrder(T->Blink);
 }
}

// 뭐 이정도 쯤은 암기-_-해줘야 컴퓨터를 전공한다 할 수 있겠지요

Posted by 정훈승

#include <stdio.h>


void hanoi(int n, char from, char to, char temp);
double count = 0;

int main(int argc, char* argv[])
{
int num;

printf("옮길 원판의 갯수를 입력하시오 (1~64) : ");
scanf("%d", &num);

hanoi(num, 'A', 'C', 'B');
printf("원판의 갯수는 %d개 이고, 옮긴 횟수는 %g번 입니다. \n", num, count);
 return 0;
}


void hanoi(int n, char from, char to, char temp)
{
 count++;

 if ( n == 1 ) {

  printf("원판 1 을 %c 에서 %c 로 이동합니다. \n", from, to);
  }
 else {
  hanoi(n-1, from, temp, to);
  printf("원판 %d 을 %c 에서 %c 로 이동합니다. \n", n, from, to);
  hanoi(n-1, temp, to, from);
 }
}
// 그 유명한 하노이의 탑이죠...
// C를 공부한 학생이라면 발로 짤 수 있는 소스입니다.

Posted by 정훈승

#include<stdio.h>
#include<stdlib.h>//문자열을 정수형으로 변환함
#include<math.h>//x값보다 가장 작은 정수값을 구함
#include<malloc.h>//메모리할당
#include<conio.h>//현재텍스트 윈도우의 내용을 지운후 커서를 왼쪽위로 이동시킴
#include<dos.h>
#include<ctype.h>//문자를 분류하는 함수들을 정의


#define MAX 100   //배열의 최대개수를 지정
#define MAX_ROW 100  //화면의 최대 행의 수
#define MAX_COL 100  //화면의 최대 열의 수

typedef struct s_item
{
 char value;
 struct s_item *back;
}//구조체 s_item


STACK;   /*스택을 구성하는 노드는
      (데이타, 그 전 노드를 가르키는 포인터)로 구성*/

STACK *top ; //스택의 최상위를 가르키는 포인터

void make_stack(void);

void delete_stack(void);  //스택을 malloc와 free를 사용하여 생성,소멸시킴

int create_to_stack(int push); //노드를 하나 더 생성
int delete_to_stack(void);  //노드를 지움(free사용)
int check_top_stack(void);  //스택의 꼭대기에 있는 값을 체크
int check_empty_stack(void); //스택이 비었는지 체크

void in_to_post(char *before,char *after);
//intofix형태의 수식을 postfix형식으로 고치를 함수

int calculator(char *ques);
//after에 있는 수식을 계산하여 그 값을 리턴

int operator01(int opr1);  //operator01값 부여
int operator02(int opr2);  //operator02값 부여


void main(void)
{
 char infix[MAX];  //처음에 입력받은 수식을 넣음
 char postfix[MAX];  //후에 변환된 수식을 넣음
 int result;    //결과값을 넣어둠
    printf("\n");
 printf("컴퓨터정보학과 2006270181 이재정\n");
 printf("중위 표기법에서 후위 표기법으로 변환 후 계산하기!!!\n\n");

 printf("중위 표기법으로 입력하시오 : ");
 scanf("%s",infix);  //입력받는 수식을 문자열로 받음
 in_to_post(infix,postfix);//함수 in_to_post를 호출함

 printf("후위 표기법으로 계산한 값 : %s\n",postfix);

 in_to_post(infix,postfix);

 result = calculator(postfix);//함수 calculator에서 계산된 값을 가져옴
 printf("결과 값 : %d\n\n끝\n",result);//출력


}

//스택 형성
void make_stack(void)
{
 top = (STACK *)malloc(sizeof(STACK));
 //동적 메모리 할당
 top->value = -1;
 top->back = NULL;
}

//스택 삭제: free를 사용하여 메모리에 반환
void delete_stack(void)
{
 free(top);//동적 메모리 할당 취소
}

//스택 추가
int create_to_stack(int push_value)
{
 STACK *addptr;
 addptr = (STACK *)malloc(sizeof(STACK));
 if(addptr == NULL)
 {
  printf(" E R R O R \n");
  exit(1);
 }
 addptr->value = push_value;
 addptr->back = top;
 top = addptr;
 return push_value;
}

//스택에서 값을 catch
int delete_to_stack(void)
{
 int pop_value;
 int delptr;

 if(top->back ==NULL)
 {
  printf(" E R R O R \n");
  exit(1);
 }
 delptr = top;
 pop_value = top->value;
 top = top->back;
 free(delptr);
 return pop_value;
}

//스택의 꼭대기에 있는 값을 리턴해주거나 비었으면 -1을 리턴
int check_top_stack(void)
{
 if(top->back == NULL) return -1;
 else return top->value;
}

//스택이 비었으면 참값을 그렇지 않으면 거짓값을 리턴해준다.   
int check_stack_empty(void)
{
 return (top->back == NULL);
}

//각각의 연산자들에 operator01값을 넣어줌(계산에 쓰이는 연산자)
int operator01(int opr1)
{
 switch(opr1)
 {
  case '^':return 3;
  case '*':return 2;
  case '/':return 2;
  case '+':return 1;
  case '-':return 1;
 }
 return 0;
}

//각각의 연산자들에 operator02값을 넣어줌(계산에 쓰이는 연산자)
int operator02(int opr2)
{
 switch(opr2)
 {
  case '^':return 4;
  case '*':return 2;
  case '/':return 2;
  case '+':return 1;
  case '-':return 1;
 }
 return 0;
}

//infix -> postfix 형식으로 바꾸어주는 함수
void in_to_post(char *before, char *after)
{
 make_stack();    //default노드를 생성
 while(*before)
 {  
  //입력된 문자열의 끝에 도달할 때까지 검사
  switch(*before)
  {
   //입력된 문자열을 하나 하나 검사
   case '\0': while (!check_stack_empty())
   {
    *after++ = delete_to_stack();
    *after++ = ' ';
   }
   *after = '\0';
     break;
   case ' ':before++;
     break;
    //빈칸이면 건너 뛴다.
   case '(':create_to_stack(*before);
     before++;
     break;
    //'('면 그냥 스택에 push 한다.
   case ')':while(check_top_stack()!='(')/*if ) -> to see ( -> loop */
   {
    *after++ = delete_to_stack();
    *after++ = ' ';
   }
    delete_to_stack();
    before++;
    break;
    //')' 면 '('를 만날 때 까지 pop 한다.
   case '+':

   case '-':

   case '*':

   case '/':

   //스택에 있는 연산자의 operator01과 들어오는 연산자의 operator02를 비교
   case'^': while(operator01(check_top_stack()) >= operator02(*before))
   {
    *after++ = delete_to_stack();
    *after++ = ' ';
   }
   //결과가 크거나 값으면 POP한다.
   create_to_stack(*before);
   //그렇지 않으면 PUSH한다.
     before++;
     break;
   default: //operand 인 경우
     // 1자리 이상의 숫자가 들어 올 수 있으므로
     while(*before >= '0' && *before <= '9')
     *after++ = *before++;
     *after++ = ' ';
  }
 }
   //문자열의 끝이므로, 스택에 남아 있는 값들을 pop한다.
 while(!check_stack_empty())
 {
  *after++ = delete_to_stack();
  *after++ = ' ';
 }
 after--;
 *after = 0;
}

//수식을 연산함
int calculator(char *ques)
{
 int oper1;
 int oper2;
 int operand;
 make_stack();  //operand의 임시 대피 장소

 //수식의 끝을 만날 때까지 검사
 while(*ques)
 {
  switch(*ques)
  {
   case ' ':ques++;
      break;
   case '+':   // +이면 두 번 pop하여 더한다.
      oper1 = delete_to_stack();
      oper2 = delete_to_stack();
      create_to_stack(oper1 + oper2);
      ques++;
      break;
   case '*':   // *이면 두 번 pop하여 곱한다.  
      oper1 = delete_to_stack();
      oper2 = delete_to_stack();
      create_to_stack(oper1 * oper2);
      ques++;
      break;
   case '-':   // -이면 후에 pop한 값에서 처음에 pop한 값을 뺀다.
      oper1 = delete_to_stack();
      oper2 = delete_to_stack();
      create_to_stack(oper2 - oper1);
      ques++;
      break;
   case '/':   // '/'면 후에 pop한 값에서 처음에 pop한 값을 나눈다.
      oper1 = delete_to_stack();
      oper2 = delete_to_stack();
      create_to_stack(oper2/oper1);
      ques++;
      break;
   case '^':   // ^면 후에 pop한 값을 처음에 pop한 값으로 pow한다.
      oper1 = delete_to_stack();
      oper2 = delete_to_stack();
      create_to_stack(pow(oper2,oper1));
      ques++;
      break;
   default:   // 현재 숫자가 문자로 인식되고 있으므로
        //char -> int형으로 바꿔주는 작업이 필요.
      operand = 0;
     do{
       operand = operand*10 + *ques - '0';
       ques++;
       }while(*ques >= '0' && *ques <= '9');
     create_to_stack(operand);
     break;
   }
 }
 // 그 결과 값을 리턴해준다.
 return delete_to_stack();
}

// 자료구조 과목에서 후달리면 나중에 알고리즘 과목가서 개후달립니다.
// 자료구조는 100% 마스터 해주는 센스

Posted by 정훈승

#include <stdio.h>
#include <math.h>

int pow(int x, int y);  //함수선언 x=실제 x값(xvalue), y=지수값(up1~up4)

void main()
{
 int no1, no2, no3, no4, up1, up2, up3, up4, xvalue;
 long int val1, val2, val3, val4; //각각의 지수부 계산
 long int total;      //result 값


 printf("1번째 지수 입력 : ");
 scanf("%d", &no1);

 printf("2번째 지수 입력 : ");
 scanf("%d", &no2);

 printf("3번째 지수 입력 : ");
 scanf("%d", &no3);

 printf("4번째 지수 입력 : ");
 scanf("%d", &no4);

 printf("1번째 차수 입력 : ");
 scanf("%d", &up1);

 printf("2번째 차수 입력 : ");
 scanf("%d", &up2);

 printf("3번째 차수 입력 : ");
 scanf("%d", &up3);

 printf("4번째 차수 입력 : ");
 scanf("%d", &up4);

 printf("x값 입력 : ");
 scanf("%d", &xvalue);

 val1 = no1 * pow(xvalue, up1);  //지수부를 먼저 계산하여 각 val1~4의 값에 할당(pow함수 호출)
 val2 = no2 * pow(xvalue, up2);
 val3 = no3 * pow(xvalue, up3);
 val4 = no4 * pow(xvalue, up4);
 total = val1 + val2 + val3 + val4; //total변수 = 총 결과값

 printf("\n\n");
 printf("----------------------------\n");
 printf(" 지수 :  %d  %d  %d  %d\n", no1, no2, no3, no4);
 printf(" 차수 :  %d  %d  %d  %d\n", up1, up2, up3, up4);
 printf("----------------------------\n");
 printf("  x값 :  %d\n", xvalue);
 printf("\n\n");
 printf("---------------------------------------\n");
 printf("  식 : %dx^%d + %dx^%d + %dx^%d + %dx^%d\n", no1, up1, no2, up2, no3, up3, no4, up4);
 printf("\n");
 printf("  결과값 : %d \n" , total);
 printf("---------------------------------------\n");
 
 


 printf("\n");
}


int pow(int x,int y) //x=xvalue, y=차수(up1~4)
{      
 int c;   //차수를 계산하기 위한 변수
 int result=1;

    c = 0; 

 while ( c < y ) //c가 y(차수 up1~up4)보다 작을때까지 반복
 {   
 c++;  
 result =  result  * x ;  //차수 계산
 }
 
 return  result ;   //pow함수에 대한 반환값
}

// 너무 쉽죠? 너무 쉬운 제 소스를 보고 많은 분들이 이해를 했으면 좋겠습니다.

Posted by 정훈승

#include <stdio.h>
int fibo1 ( int n );  //순환함수
int fibo2 ( int n );  //반복함수

void main ( )
{
 int result1, result2, num;  //순환함수 결과값, 반복함수 결과값, n값
 
 printf("피보나치 수열구하기... \n숫자를 입력하세용^^ : ");
 scanf("%d",&num);
 
 result1 = fibo1 ( num );
 result2 = fibo2 ( num );
 //결과 출력

 printf("순환함수 수행결과 : f(%d) = %d\n반복함수 수행결과 : f(%d) = %d\n", num, result1, num, result2);
}

int fibo1 ( int n )
{
 if ( n == 0 || n == 1 )
  return n;
 else
  return fibo1 ( n - 1 ) + fibo1 ( n - 2 );
}

int fibo2 ( int n )
{
 int f1 = 0;
 int f2 = 1;
 int i;
 int fibonacci;
   
 if( n == 0 || n ==1 )
 {
  return n;
 }
 else
 {
  for( i = 2 ; i <= n ; i++ )
  {
   fibonacci = f1 + f2;
   f1 = f2;
   f2 = fibonacci;
  }
  return fibonacci;
    }
}

// 아주 기초적인 소스입니다. 이정도면 C를 모르는 사람도 마치 1+1이 2인것을 아는것과 같습니다.

Posted by 정훈승

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

// 자기 참조 구조체
struct treeNode {
   struct treeNode *leftPtr; // 왼쪽 하위 트리를 가리키는 포인터
   int data;     // 노드 값
   struct treeNode *rightPtr; // 오른쪽 하위 트리를 가리키는 포인터
};        // treeNode 구조체 끝

typedef struct treeNode TreeNode; // struct treeNode와 동의어
typedef TreeNode *TreeNodePtr;  // TreeNode*와 동의어

// 프로토 타입
void insertNode( TreeNodePtr *treePtr, int value );
void inOrder( TreeNodePtr treePtr );
void preOrder( TreeNodePtr treePtr );
void postOrder( TreeNodePtr treePtr );

// 프로그램 실행은 메인 함수에서 스타트
int main()
{
 int i;      // 1~10까지 루프하기 위한 카운터
 int item;     // 무작위 수를 포함할 변수
 TreeNodePtr rootPtr = NULL; // 트리를 NULL로 초기화

 srand( time( NULL ) );
 printf( "트리에 숫자를 입력하세요 : \n" );

 // for문을 이용해 트리에 1~15 사이의 무작위 값을 삽입
 for ( i = 1; i <= 10; i++ ) {
  item = rand() % 15;
  printf( "%3d", item );
  insertNode( &rootPtr, item );
 }

 // 트리를 전위로 순회
 printf( "\n\n전위표현식 : \n" );
 preOrder( rootPtr );

 // 트리를 중위로 순회
 printf( "\n\n중위표현식 : \n" );
 inOrder( rootPtr );

 // 트리를 후위로 순회
 printf( "\n\n후위표현식 : \n" );
 postOrder( rootPtr );

 return 0; // 종료
}

// 트리에 노드 추가
void insertNode( TreeNodePtr *treePtr, int value )
{
 // 트리가 비어있다면
 if ( *treePtr == NULL ) {  
  *treePtr = malloc( sizeof( TreeNode ) );

  // 메모리를 할당하면 데이터 대입
  if ( *treePtr != NULL ) {
   ( *treePtr )->data = value;
   ( *treePtr )->leftPtr = NULL;
   ( *treePtr )->rightPtr = NULL;
  }

  else {
   printf( "%d 값이 잘못되었거나, 에러입니다.\n", value );
  }

 }

 // 트리가 비어있지 않으면
 else {

  // ① 현재 노드의 데이터보다 삽입할 데이터가 작을 경우
  if ( value < ( *treePtr )->data ) {
   insertNode( &( ( *treePtr )->leftPtr ), value );
  }

  // ② 현재 노드의 데이터보다 삽입할 데이터가 더 클 경우
  else if ( value > ( *treePtr )->data ) {
   insertNode( &( ( *treePtr )->rightPtr ), value );
  }

  // 중복된 값은 무시
  else {
   printf( "중복" );
  }

 }
}  // insertNode 함수 끝

// 트리를 중위로 순회
void inOrder( TreeNodePtr treePtr )
{
 // 만약 트리가 비어있지 않으면 순회
 if ( treePtr != NULL ) {
  inOrder( treePtr->leftPtr );
  printf( "%3d", treePtr->data );
  inOrder( treePtr->rightPtr );
 }
} // inOrder 중위 함수 끝

// 트리를 전위로 순회
void preOrder( TreeNodePtr treePtr )
{
 // 만약 트리가 비어있지 않으면 순회
 if ( treePtr != NULL ) {
  printf( "%3d", treePtr->data );
  preOrder( treePtr->leftPtr );
  preOrder( treePtr->rightPtr );
 }
} // preOrder 전위 함수 끝

// 트리를 후위로 순회
void postOrder( TreeNodePtr treePtr )
{
 // 만약 트리가 비어있지 않으면 순회
 if ( treePtr != NULL ) {
  postOrder( treePtr->leftPtr );
  postOrder( treePtr->rightPtr );
  printf( "%3d", treePtr->data );
 }
} // postOrder 후위 함수 끝

// 아주 쉽죠? 이정도 소스는 다들 아시리라 믿습니다만, 혹시나 모르는 분이 계실까봐...
// (DEITEL출판사) C HOW TO PROTRAM 제4판을 참조했습니다.

Posted by 정훈승