작업중 (double linked circle)
#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);
}
}
}