언어/c언어

작업중 (double linked circle)

파아랑새 2016. 3. 6. 10:53

#include <stdio.h>
#include <stdlib.h>
#define OR ||
typedef struct double_circle {
 int data;
 struct double_circle* left_link;
 struct double_circle* right_link;
}double_circle;
typedef struct nodeType {
 double_circle* head_node;
 double_circle* tail_node;
 int dataCnt;
}nodeType;
//------------------------<< Function  >>-------------------------------
void double_circle_setting_function(nodeType* cir); //[1]
void circle_data_insert_function(nodeType* cir);      //[2] plus +
void Printf_right(nodeType* cir);                          //[3] printf
void RPrintf_left(nodeType* cir);                          //[4] Reverse Printf
void First_remove(nodeType* cir);         //[5] Remove First
//---------------------------------------------------------------------------
//------------------------------<< Main >>-----------------------------
int main(void) {
 nodeType start;
 double_circle_setting_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 circle_data_insert_function(&start);
 Printf_right(&start);
 RPrintf_left(&start);
 First_remove(&start);
 Printf_right(&start);
 RPrintf_left(&start);
 return 0;
}
//-----------------------------------------------------------------------
void double_circle_setting_function(nodeType* cir) { //[1]
 cir->head_node = (double_circle*)malloc(sizeof(double_circle));
 cir->tail_node   = (double_circle*)malloc(sizeof(double_circle));

 if (cir->head_node == NULL OR  cir->tail_node == NULL) {
  printf("fail !! \n");
  return;//END
 }
 else { // cir->head_node != NULL AND cir->tail_node != NULL

  //[1] HEAD
  cir->head_node->data = 0;
  cir->head_node->left_link = NULL;
  cir->head_node->right_link = NULL;

  //[2] TAIL
  cir->tail_node->data = 0;
  cir->tail_node->left_link = NULL;
  cir->tail_node->right_link = NULL;

  //[3] DATA COUNT
  cir->dataCnt = 0;
 }
}
void circle_data_insert_function(nodeType* cir) { //[2] plus +
 double_circle* newNode = NULL; //새로 삽입 할 데이터
 newNode = (double_circle*)malloc(sizeof(double_circle));

 if (newNode == NULL) {
  printf("fail \n");
  return;//END
 }
 else {// newNode != NULL

   //---------- << new data setting >> ----------
  newNode->left_link = NULL;
  newNode->right_link = NULL;
  newNode->data = 0;
  //--------------------------------------------------

  //----------- << new data insert >> -----------
  printf(" Insert data >>>  ");
  scanf_s("%d", &newNode->data);
  //--------------------------------------------------

  //Case[1]
  if (cir->head_node->right_link == NULL) {
   cir->head_node->right_link = newNode;
   cir->tail_node->right_link = newNode;
   newNode->right_link = cir->head_node->right_link;
   newNode->left_link = cir->tail_node->right_link;
   cir->dataCnt++;
  }
  //Case[2]
  else {// cir->head_node->right_link != NULL
   newNode->left_link = cir->tail_node->right_link;
   cir->tail_node->right_link->right_link = newNode;
   cir->tail_node->right_link = newNode;
   cir->head_node->right_link->left_link = cir->tail_node->right_link;
   cir->tail_node->right_link->right_link = cir->head_node->right_link;
   cir->dataCnt++;
  }
 }
}
void Printf_right(nodeType* cir) { //[3]
 int index;
 double_circle* index_node = NULL;
 int position = 0;

 if (cir->head_node->right_link == NULL) {
  printf(" data empty !! \n");
  return;//END
 }
 else {// cir->head_node->right_link != NULL
  printf("Insert position >>>  ");
  scanf_s("%d", &position);
  index_node = cir->head_node->right_link;
  printf("@ ");
  for (index = 1; index <= position; index++) {
   printf("%d ", index_node->data);
   if (index_node == cir->tail_node->right_link) {
    printf("@");
   }
   index_node = index_node->right_link;
  }printf("\n");
 }
}
void RPrintf_left(nodeType* cir) { //[4]
 int index;
 double_circle* index_node = NULL;
 int position = 0;

 if (cir->tail_node->right_link == NULL) {
  printf(" data empty !! \n");
  return;//END
 }
 else {// cir->head_node->right_link != NULL
  printf("Insert position >>>  ");
  scanf_s("%d", &position);
  index_node = cir->tail_node->right_link;
  printf("@ ");
  for (index = 1; index <= position; index++) {
   printf("%d ", index_node->data);
   if (index_node == cir->head_node->right_link) {
    printf("@");
   }
   index_node = index_node->left_link;
  }printf("\n");
 }
}
void First_remove(nodeType* cir) { //[5]
 double_circle* remove_node = NULL;
 if (cir->head_node->right_link == NULL) {
  printf("data is empty!! \n");
  return;//END
 }
 else { //cir->head->right != NULL
  printf("first remove!!\n");
  if (cir->head_node->right_link == cir->tail_node->right_link) {
   remove_node = cir->head_node->right_link;
   cir->head_node->right_link = NULL;
   cir->tail_node->right_link = NULL;
   free(remove_node);
  }
  else {//cir->head->right != cir->tail->right
   remove_node = cir->head_node->right_link;
   cir->head_node->right_link = remove_node->right_link;
   cir->head_node->right_link->left_link = cir->tail_node->right_link;
   cir->tail_node->right_link->right_link = cir->head_node->right_link;
   free(remove_node);
  }
 }
}