언어

double_linked_list

파아랑새 2015. 9. 7. 22:16

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int element;//int -----> element
/////////////////////////////////////////////////
typedef struct Double_Linked_List
{
 struct Double_Linked_List* pRev;
 struct Double_Linked_List* pNext;
 element DATA;
}D_L_L;
/////////////////////////////////////////////////
typedef struct D_L_L_Type
{
 D_L_L* HEAD;
 D_L_L* TAIL;
}D_T;
int nNodCnt = 0;//데이터 갯수 counting
/////////////////////////////////////////////////
//함수 원형
//(1) DOUBLE_LINKED_LIST 초기화
void initiallize(D_T* D);
//
void free_input(D_T* D);
//(2) FIRST_INPUT
void first_input(D_T* D);
//(3) LAST_INPUT
void last_input(D_T* D);
//(4)
void printF(D_T* D);
//(5)
void R_printF(D_T* D);
//(6)처음   위치 데이터 삭제
void first_remove(D_T* D);
//(7)마지막 위치 데이터 삭제
void last_remove(D_T* D);
//(8)데이터 갯수 출력
void count_element();
//(9)원하는 위치 삭제
void free_remove_data(D_T* D);
/////////////////////////////////////////////////
int main(void)
{
 D_T double_linked_list;
 initiallize(&double_linked_list);
 int result;
 printf("-------------------------------------\n");
 printf("1. 첫번째 위치에 데이터 삽입->  1\n");
 printf("2. 마지막 위치에 데이터 삽입->  2\n");
 printf("3. 원하는 위치에 데이터 삽입->  3\n");
 printf("4. 첫번째 위치에 데이터 삭제->  4\n");
 printf("5. 마지막 위치에 데이터 삭제->  5\n");
 printf("6. 원하는 위치에 데이터 삭제->  6\n");
 printf("7. 정방향 데이터 출력          ->  7\n");
 printf("8. 역방향 데이터 출력          ->  8\n");
 printf("9. 종료                              -> 그외\n");
 printf("-------------------------------------\n");
 while (1==1)
 {
  printf("-------------------------------------\n");
  printf("선택--------->  ");
  scanf_s("%d", &result);
  if (result == 1)
  {
   printf("1. 첫번째 위치에 데이터 삽입\n");
   first_input(&double_linked_list);
  }
  else if(result == 2)
  {
   printf("2. 마지막 위치에 데이터 삽입\n");
   last_input(&double_linked_list);
  }
  else if (result == 3)
  {
   printf("3. 원하는 위치에 데이터 삽입\n");
   free_input(&double_linked_list);
  }
  else if (result == 4)
  {
   printf("4. 첫번째 위치에 데이터 삭제\n");
   first_remove(&double_linked_list);
  }
  else if (result == 5)
  {
   printf("5. 마지막 위치에 데이터 삭제\n");
   last_remove(&double_linked_list);
  }
  else if (result == 6)
  {
   printf("6. 원하는 위치에 데이터 삭제");
   free_remove_data(&double_linked_list);
  }
  else if (result == 7)
  {
   printf("7. 정방향 데이터 출력  \n");
   printF(&double_linked_list);
  }
  else if (result == 8)
  {
   printf("8. 역방향 데이터 출력  \n");
   R_printF(&double_linked_list);
  }
  else
  {
   printf("9. 종료\n");
   break;
  }
  printf("-------------------------------------\n");
 }
 
 return 0;
}
//(1) DOUBLE_LINKED_LIST 초기화
void initiallize(D_T* D)
{
 D->HEAD = NULL;
 D->TAIL   = NULL;
}
//(1) END-----------------------------

//(2) DOUBLE_LINKED_LIST 머리 부분에 데이터 삽입
void first_input(D_T* D)
{
 D_L_L* new_data = (D_L_L*)malloc(sizeof(D_L_L)); // 삽입할 새로운 데이터
 if (new_data == NULL)
 {
  printf(" 동적할당 실패!!\n ");
  return;//종료
 }
 else//new_data != NULL
 {
  memset(new_data, 0, sizeof(D_L_L));
  if (D->HEAD == NULL)//맨 처음 데이터를 삽입할때
  {
   nNodCnt++;//<------------데이터 갯수 +1
   D->HEAD = new_data;
   printf("데이터 삽입:     ");
   scanf_s("%d", &D->HEAD->DATA);
   D->TAIL = new_data;
   return;
  }
  else//(D->HEAD != NULL) 데이터가 하나 이상이 이미 존재할때
  {
   nNodCnt++;//<------------데이터 갯수 +1
   new_data->pNext = D->HEAD;
   D->HEAD->pRev = new_data;
   D->HEAD = new_data;
   printf("데이터 삽입:     ");
   scanf_s("%d", &D->HEAD->DATA);
   return;
  }
 }
}
//(2) END-----------------------------

//(3) DOUBLE_LINKED_LIST 꼬리 부분에 데이터 삽입
void last_input(D_T* D)
{
 D_L_L* NEW_LAST_DATA = (D_L_L*)malloc(sizeof(D_L_L));
 if (NEW_LAST_DATA == NULL)
 {
  printf("동적할당 실패!!\n");
  return;//종료
 }
 else//NEW_LAST_DATA != NULL, 동적할당 성공!!
 {
  memset(NEW_LAST_DATA, 0, sizeof(D_L_L));//<- INITIALLIZE
  if (D->HEAD == NULL)//맨 처음 데이터를 삽입할때
  {
   nNodCnt++;//<------------데이터 갯수 +1
   D->HEAD = NEW_LAST_DATA;
   printf("데이터 삽입:     ");
   scanf_s("%d", &D->HEAD->DATA);
   D->TAIL = NEW_LAST_DATA;
   return;
  }
  else
  {
   nNodCnt++;//<------------데이터 갯수 +1
   D->TAIL->pNext = NEW_LAST_DATA;
   NEW_LAST_DATA->pRev = D->TAIL;
   D->TAIL = NEW_LAST_DATA;
   printf("데이터 삽입:     ");
   scanf_s("%d", &D->TAIL->DATA);
   return;
  }
 }
}
//(3) END-----------------------------

void printF(D_T* D)
{
 D_L_L* INDEX = D->HEAD;
 if (D->HEAD == NULL)
 {
  printf("출력할 데이터가 없습니다.\n");
  return;//종료
 }
 else
 {
  while (INDEX != NULL)
  {
   printf("%d  ", INDEX->DATA);
   INDEX = INDEX->pNext;
  }
 }
 printf("\n");
}

void R_printF(D_T* D)
{
 D_L_L* INDEX = D->TAIL;
 if (D->TAIL == NULL)
 {
  printf("출력할 데이터가 없습니다.\n");
  return;//종료
 }
 else
 {
  while (INDEX != NULL)
  {
   printf("%d  ", INDEX->DATA);
   INDEX = INDEX->pRev;
  }
 }
 printf("\n");
}
void first_remove(D_T* D)
{
 if (D->HEAD == NULL)
 {
  printf("제거 할 데이터가 없습니다.\n");
  return;//종료
 }
 else//(D->HEAD != NULL)
 {
  D_L_L* REMOVE_DATA = NULL;
  if (D->HEAD == D->TAIL)
  {
   REMOVE_DATA = D->HEAD;
   D->HEAD = D->HEAD->pNext;
   D->TAIL = D->HEAD;
   nNodCnt--;//<------------데이터 갯수 -1
   free(REMOVE_DATA);//메모리해제
  }
  else//(D->HEAD != D->TAIL)
  {
   REMOVE_DATA = D->HEAD;
   D->HEAD = D->HEAD->pNext;
   nNodCnt--;//<------------데이터 갯수 -1
   free(REMOVE_DATA);//메모리해제
  }
 }
}
void last_remove(D_T* D)
{
 if (D->HEAD == NULL)
 {
  printf("삭제할 데이터가 없습니다.\n");
  return;//종료
 }
 else
 {
  D_L_L* REMOVE_LAST_DATA = NULL;
  if (D->HEAD == D->TAIL)//삭제할 데이터가 하나밖에 없는 경우
  {
   REMOVE_LAST_DATA = D->TAIL;
   D->TAIL = D->TAIL->pRev;
   D->HEAD = D->TAIL;
   nNodCnt--;//<------------데이터 갯수 -1
   free(REMOVE_LAST_DATA);//메모리해제
  }
  else
  {
   REMOVE_LAST_DATA = D->TAIL;
   D->TAIL = D->TAIL->pRev;
   D->TAIL->pNext = NULL;
   nNodCnt--;//<------------데이터 갯수 -1
   free(REMOVE_LAST_DATA);
  }
 }
}
//데이터의 갯수 출력
void count_element()
{
 printf("element count of double linked list  is :  %d [개]\n", nNodCnt);
}
void free_remove_data(D_T* D)
{
 int position = 0;
 int cnt_position = 1;
 if (D->HEAD == NULL)
 {
  printf("삭제할 데이터가 없습니다.\n");
  return;//종료
 }
 else//삭제할 데이터가 하나라도 있는 경우
 {
  D_L_L* temp_index = D->HEAD;
  D_L_L* REMOVE = NULL;
  printf("Remove -> Position is:  ");
  scanf_s("%d", &position);
  if ((position < 1) || (position >nNodCnt))
  {
   printf("삭제할 수 없는 위치 입니다.\n");
   return;//종료
  }
  else
  {
   while (cnt_position != position)
   {
    temp_index = temp_index->pNext;
    cnt_position++;
   }
   if (temp_index == D->HEAD)
   {
    if (D->HEAD == D->TAIL)
    {
     REMOVE = D->HEAD;
     D->HEAD = NULL;
     D->TAIL = NULL;
     nNodCnt--;//<------------데이터 갯수 -1
     free(REMOVE);
    }
    else//(D->HEAD != D->TAIL)
    {
     REMOVE = temp_index;
     temp_index = temp_index->pNext;
     D->HEAD = temp_index;
     D->HEAD->pRev = NULL;
     REMOVE->pNext = NULL;
     nNodCnt--;//<------------데이터 갯수 -1
     free(REMOVE);
    }
   }
   else//(temp_index != D->HEAD)
   {
    if (temp_index == D->TAIL)
    {
     REMOVE = D->TAIL;
     temp_index = temp_index->pRev;
     D->TAIL = temp_index;
     D->TAIL->pNext = NULL;
     nNodCnt--;//<------------데이터 갯수 -1
     free(REMOVE);
    }
    else//temp_index != D->TAIL
    {
     REMOVE = temp_index;
     temp_index = temp_index->pRev;
     temp_index->pNext = REMOVE->pNext;
     REMOVE->pNext->pRev = temp_index;
     nNodCnt--;//<------------데이터 갯수 -1
     free(REMOVE);
    }
   }
  }
 }
}
void free_input(D_T* D)
{
 if (D->HEAD == NULL)
 {
  printf("초기 데이터 삽입이기 때문에 사용자의 권한없이 처음위치에 데이터가 생성됩니다.\n ");
  first_input(D);
 }
 else
 {
  D_L_L* PLUS_NODE = (D_L_L*)malloc(sizeof(D_L_L));
  if (PLUS_NODE == NULL)
  {
   printf("동적할당에 실패했습니다.\n");
   return;//종료
  }
  else//동적할당 성공
  {
   memset(PLUS_NODE, 0, sizeof(D_L_L));
   printf("+ 시킬 데이터를 입력하세요:   ");
   scanf_s("%d", &PLUS_NODE->DATA);
   int position = 0;
   int cnt_position = 1;
   D_L_L* TEMP_INDEX = D->HEAD;
   printf("삽입하고자 하는 위치를입력하세요:   ");
   scanf_s("%d", &position);
   if ((position<1) || (position >nNodCnt))
   {
    printf("삽입할 수 없는 위치입니다.\n");
    return;//종료
   }
   else
   {
    nNodCnt++;//<-----------------데이터 +1
    while (position != cnt_position)
    {
     TEMP_INDEX = TEMP_INDEX->pNext;
     cnt_position++;
    }
    if (TEMP_INDEX == D->HEAD)
    {
     TEMP_INDEX->pRev = PLUS_NODE;
     PLUS_NODE->pNext = D->HEAD;
     D->HEAD = PLUS_NODE;
     nNodCnt++;
     return;
    }
    else//TEMP_INDEX != D->HEAD
    {
     if (TEMP_INDEX == D->TAIL)
     {
      PLUS_NODE->pRev = D->TAIL->pRev;
      D->TAIL->pRev->pNext = PLUS_NODE;
      D->TAIL->pRev = PLUS_NODE;
      PLUS_NODE->pNext = D->TAIL;
      nNodCnt++;
      return;
     }
     else
     {
      PLUS_NODE->pNext = TEMP_INDEX;
      PLUS_NODE->pRev = TEMP_INDEX->pRev;
      TEMP_INDEX->pRev->pNext = PLUS_NODE;
      TEMP_INDEX->pRev = PLUS_NODE;
      nNodCnt++;
      return;
     }
    }

   }
  }
 }
}