언어/c언어

double linkedlist

파아랑새 2016. 5. 15. 11:18

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _True_ 1
#define _AND_ &&
#define _OR_ ||
#define element int

typedef struct DoubleLnk {
 element data_type_int;
 struct DoubleLnk* R_Lnk;
 struct DoubleLnk* L_Lnk;
 /*
  * |L_Lnk|data|R_Lnk|
  */
}DoubleLnk;

typedef struct nodeType {
 DoubleLnk* headNode;
 DoubleLnk* tailNode;
 int dataCnt;
}nodeType;

// function
void DEF__error__(char* errorMessage) { //---------------[1]
 fprintf(stderr, "%s", errorMessage);
 exit(0);
}
void DEF__init__(nodeType**);//--------------------------[2]
void DEF__insert__(nodeType**);//------------------------[3]
void DEF__printf__(nodeType**);//------------------------[4]
void DEF__REprintf__(nodeType**);//----------------------[5]
void DEF__First_insert__(nodeType**);//------------------[6]
void DEF__Middle_insert__(nodeType**);//-----------------[7]
void DEF__First_remove__(nodeType**);//------------------[8]
void DEF__Last_remove__(nodeType**);//-------------------[9]

int main(void) {
 nodeType* D_LL = NULL;
 DEF__init__(&D_LL);
 DEF__insert__(&D_LL);
 DEF__insert__(&D_LL);
 DEF__insert__(&D_LL);
 DEF__insert__(&D_LL);
 DEF__insert__(&D_LL);
 DEF__insert__(&D_LL);
 DEF__printf__(&D_LL);
 DEF__REprintf__(&D_LL);
 DEF__First_insert__(&D_LL);
 DEF__printf__(&D_LL);
 DEF__Middle_insert__(&D_LL);
 DEF__printf__(&D_LL);
 DEF__First_remove__(&D_LL);
 DEF__printf__(&D_LL);
 DEF__Last_remove__(&D_LL);
 DEF__printf__(&D_LL);
 return 0;
}

void DEF__init__(nodeType** DLL) {//---------------------------------[2]
 *DLL = (nodeType*)malloc(sizeof(nodeType));
 if ( *DLL == NULL ) {
  DEF__error__("malloc error");
 }
 else { // *DLL != NULL
  memset(*DLL, 0, sizeof(nodeType));  
  //HEAD
  ( *DLL )->headNode = (DoubleLnk*)malloc(sizeof(DoubleLnk));
  ( *DLL )->headNode->data_type_int = 0;
  ( *DLL )->headNode->R_Lnk = NULL;
  ( *DLL )->headNode->L_Lnk = NULL;
  printf("address(headNode) : %p\n", ( *DLL )->headNode);
  
  //TAIL
  ( *DLL )->tailNode = (DoubleLnk*)malloc(sizeof(DoubleLnk));
  ( *DLL )->tailNode->data_type_int = 0;
  ( *DLL )->tailNode->R_Lnk = NULL;
  ( *DLL )->tailNode->L_Lnk = NULL;
  printf("address(tailNode) : %p\n", ( *DLL )->tailNode);

  //DATA COUNT
  ( *DLL )->dataCnt = 0;
 }
}// end of DEF__init__

void DEF__insert__(nodeType** DLL) {//-------------------------------[3]
 DoubleLnk* newNode = NULL;
 //삽입할노드 동적할당
 newNode = (DoubleLnk*)malloc(sizeof(DoubleLnk));
 
 if ( newNode == NULL ) {
  DEF__error__("malloc error");
 }
 else { // newNode != NULL
  // 노드 초기화
  newNode->data_type_int = 0;
  newNode->R_Lnk = NULL;
  newNode->L_Lnk = NULL;
  printf("Please data input(Last position) : ");
  scanf("%d", &newNode->data_type_int);
  /*
   * | L_Lnk : NULL | data_type_int : 0 | R_Lnk : NULL |
   */
  if ( (**DLL).dataCnt == 0 ) {
   ( *DLL )->headNode->R_Lnk = newNode;
   ( *DLL )->tailNode->L_Lnk = newNode;
   ( *DLL )->dataCnt +=1;
  /*
   *       NULL [L]headNode[R] ---> newNode <--- [L]edoNliat[R] NULL
   */
  }
  else { // *DLL->dataCnt >= 1
  /*
   *   NULL [L]headNode[R] ---> newNode[R]<---->[L]newNode<--- [L]edoNliat[R] NULL 
  */
   ( *DLL )->tailNode->L_Lnk->R_Lnk = newNode;
   newNode->L_Lnk = ( *DLL )->tailNode->L_Lnk;
   ( *DLL )->tailNode->L_Lnk = newNode;
   ( *DLL )->dataCnt +=1;
  }
 }
}// end of DEF__insert__

void DEF__printf__(nodeType** DLL) {//-------------------------------[4]
 int index;
 DoubleLnk* indxNode = NULL;
 if( ( *DLL )->dataCnt == 0 ) { 
   DEF__error__("data is empty!!");
 }
 else { // *DLL->dataCnt >= 1
  indxNode = ( *DLL )->headNode->R_Lnk;
  for( index = 0 ; index < ( *DLL )->dataCnt ; index++) {
   printf("%d [%p] ", indxNode->data_type_int, indxNode);
   if ( index < ( *DLL )->dataCnt -1 ) printf("->");
   indxNode = indxNode->R_Lnk;
  }printf("\n");
 }
}// end of DEF__printf__

void DEF__REprintf__(nodeType** DLL) {//-----------------------------[5]
 int index;
 DoubleLnk* indxNode = NULL;
 if( ( *DLL )->dataCnt == 0 ) { 
   DEF__error__("data is empty!!");
 }
 else { // *DLL->dataCnt >= 1
  indxNode = ( *DLL )->tailNode->L_Lnk;
  for( index = 0 ; index < ( *DLL )->dataCnt ; index++) {
   printf("%d [%p] ", indxNode->data_type_int, indxNode);
   if ( index < ( *DLL )->dataCnt -1 ) printf("->");
   indxNode = indxNode->L_Lnk;
  }printf("\n");
 }
}// end of DEF__REprintf__

void DEF__First_insert__(nodeType** DLL) {//--------------------------[6]
 DoubleLnk* newNode = NULL;
 //삽입할노드 동적할당
 newNode = (DoubleLnk*)malloc(sizeof(DoubleLnk));
 
 if ( newNode == NULL ) {
  DEF__error__("malloc error");
 }
 else { // newNode != NULL
  // 노드 초기화
  newNode->data_type_int = 0;
  newNode->R_Lnk = NULL;
  newNode->L_Lnk = NULL;
  printf("Please data input(First position) : ");
  scanf("%d", &newNode->data_type_int);
  /*
   * | L_Lnk : NULL | data_type_int : 0 | R_Lnk : NULL |
   */
  if ( (**DLL).dataCnt == 0 ) {
   ( *DLL )->headNode->R_Lnk = newNode;
   ( *DLL )->tailNode->L_Lnk = newNode;
   ( *DLL )->dataCnt +=1;
  /*
   *       NULL [L]headNode[R] ---> newNode <--- [L]edoNliat[R] NULL
   */
  }
  else { // *DLL->dataCnt >= 1
  /*
   *   NULL [L]headNode[R] ---> newNode[R]<---->[L]newNode<--- [L]edoNliat[R] NULL 
  */   
   ( *DLL )->headNode->R_Lnk->L_Lnk = newNode;
   printf("test1 \n");
   newNode->R_Lnk = ( *DLL )->headNode->R_Lnk;
   ( *DLL )->headNode->R_Lnk = newNode;
   ( *DLL )->dataCnt +=1;
  }
 }
}// end of DEF__First_insert__

void DEF__Middle_insert__(nodeType** DLL) {//--------------------------[7]
 DoubleLnk* newNode = NULL;
 DoubleLnk* indxNode = NULL;
 int position = 0;
 int indx;
 printf( " 삽입 가능한 위치: [start: %d] ~ [end: %d] \n ",  1, ( *DLL )->dataCnt+1 ); 
 while(_True_) {
  printf("위치 입력 : ");
  scanf("%d", &position);
  if ( ( position <= 0 ) _OR_ ( position > (*DLL)->dataCnt+1 ) ) {
   printf("삽입할 수 없는 위치 입니다. 다시 입력하세요 \n");
  }
  else { // ( position >= 1 ) _AND_ ( position <= (*DLL)->dataCnt+1 )
   break;
  }
 }
 // newNode setting
 newNode = (DoubleLnk*)malloc(sizeof(DoubleLnk));
 if ( newNode == NULL ) {
  DEF__error__("malloc error");
 }
 else { // newNode != NULL
  //newNode data setting----------------------
  newNode->data_type_int = 0;
  newNode->R_Lnk = NULL;
  newNode->L_Lnk = NULL;
  // -----------------------------------------
  if( position == 1 ) {
   DEF__First_insert__(DLL);
  }
  else if ( position == ( *DLL )->dataCnt+1 ) {
   DEF__insert__(DLL);
  }
  else {
   printf("Please data input(Middle position) : ");
   scanf("%d", &newNode->data_type_int);
   indxNode = ( *DLL )->headNode;
   for ( indx = 1 ; indx < position ; indx++ ) {
    indxNode = indxNode->R_Lnk;
   }
   newNode->R_Lnk = indxNode->R_Lnk;
   indxNode->R_Lnk->L_Lnk = newNode;
   indxNode->R_Lnk = newNode;
   newNode->L_Lnk = indxNode;
   ( *DLL )->dataCnt +=1;
  }
  
 }
} // end of DEF__Middle_insert__

void DEF__First_remove__(nodeType** DLL) {//---------------------------[8]
 DoubleLnk* removeNode = NULL;

 if ( ( *DLL )->dataCnt == 0 ) DEF__error__("data is empty");
 else { // ( *DLL )->dataCnt != 0
  if( ( *DLL )->dataCnt == 1 ) {
   removeNode = ( *DLL )->headNode->R_Lnk;
   ( *DLL )->headNode->R_Lnk = NULL;
   ( *DLL )->tailNode->L_Lnk = NULL;
   free(removeNode);
   ( *DLL )->dataCnt -=1;
  }
  else {// ( *DLL )->dataCnt > 1
   removeNode = ( *DLL )->headNode->R_Lnk;
   ( *DLL )->headNode->R_Lnk = ( *DLL )->headNode->R_Lnk->R_Lnk;
          ( *DLL )->headNode->R_Lnk->L_Lnk = NULL;
   free(removeNode);
   ( *DLL )->dataCnt -=1;
  }
 }
} // end of DEF__First_remove__

void DEF__Last_remove__(nodeType** DLL) {//----------------------------[9]
 DoubleLnk* removeNode = NULL;

 if ( ( *DLL )->dataCnt == 0 ) DEF__error__("data is empty");
 else { // ( *DLL )->dataCnt != 0
  if( ( *DLL )->dataCnt == 1 ) {
   removeNode = ( *DLL )->headNode->R_Lnk;
   ( *DLL )->headNode->R_Lnk = NULL;
   ( *DLL )->tailNode->L_Lnk = NULL;
   free(removeNode);
   ( *DLL )->dataCnt -=1;
  }
  else {// ( *DLL )->dataCnt > 1
   removeNode = ( *DLL )->tailNode->L_Lnk;
   ( *DLL )->tailNode->L_Lnk = ( *DLL )->tailNode->L_Lnk->L_Lnk;
          ( *DLL )->tailNode->L_Lnk->R_Lnk = NULL;
   free(removeNode);
   ( *DLL )->dataCnt -=1;
  }
 }
} // end of DEF__LAST_remove__