double linkedlist
#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__