double_linked_list
#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;
}
}
}
}
}
}