double linked
#include <stdio.h>
#include <stdlib.h>
#define OR ||
typedef int element;
typedef struct doubleLinked {
element data;
struct doubleLinked* left;
struct doubleLinked* right;
}doubleLinked;
/*
| left | data | right |
*/
typedef struct node {
doubleLinked* head;
doubleLinked* tail;
int dataCnt;
}node;
/*
| head | tail |
*/
// --<< Function >>--
void setting_DoubleLinked_function(node* pointer); //[1]
void dataInsert_DoubleLinked_function(node* pointer); //[2]
void Printf_DoubleLinked_function(node* pointer);//[3]
void ReversePrintf_DoubleLinked_function(node* pointer);//[4]
void FirstData_Remove(node* pointer);//[5]
void LastData_Remove(node* pointer);//[6]
void FirstData_Plus(node* pointer);//[7]
int main(void) {
node start;
setting_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
dataInsert_DoubleLinked_function(&start);
Printf_DoubleLinked_function(&start);
FirstData_Remove(&start);//[5]
ReversePrintf_DoubleLinked_function(&start);
LastData_Remove(&start);//[6]
Printf_DoubleLinked_function(&start);
FirstData_Plus(&start);//[7]
Printf_DoubleLinked_function(&start);
return 0;
}
void setting_DoubleLinked_function(node* pointer) {//[1]
pointer->head = (doubleLinked*)malloc(sizeof(double));
pointer->tail = (doubleLinked*)malloc(sizeof(double));
if(pointer->head == NULL OR pointer->tail == NULL) {
printf("fail!!! \n");
return;//END
}else{//pointer->head !=NULL AND pointer->tail != NULL
pointer->head->data = 0;
pointer->head->left = NULL;
pointer->head->right = NULL;
pointer->tail->data = 0;
pointer->tail->left = NULL;
pointer->tail->right = NULL;
pointer->dataCnt = 0;
}
}
//double ------> | left | data | right |
void dataInsert_DoubleLinked_function(node* pointer) {//[2]
doubleLinked* newNode = NULL;
newNode = (doubleLinked*)malloc(sizeof(doubleLinked));
if(newNode == NULL){
printf("fail \n");
return;//END
}else{//newNode != NULL
newNode->left = NULL;
newNode->right = NULL;
newNode->data = 0;
printf("new data input >>> ");
scanf("%d", &newNode->data);
//|left|data|[right<---------> left]|data|[right<---------->left]|data|right|
if(pointer->dataCnt == 0) {
pointer->head->right = newNode;
newNode->left = pointer->head;
newNode->right = pointer->tail;
pointer->tail->left = newNode;
pointer->dataCnt ++;
}else{
//|left|data|[right<---------> left]|data|[right<---------->left]|data|right<------------->left]|data|[right]
pointer->tail->left->right = newNode;
newNode->left = pointer->tail->left;
newNode->right = pointer->tail;
pointer->tail->left = newNode;
pointer->dataCnt ++;
}
}
}
void Printf_DoubleLinked_function(node* pointer) {//[3]
doubleLinked* index_Node = NULL;
int i;
if(pointer->dataCnt == 0){
printf("data empty!! \n");
return;//END
}else{
index_Node = pointer->head->right;
for(i= 1 ; i<= pointer->dataCnt ; i++) {
printf("%d ", index_Node->data);
index_Node = index_Node->right;
}printf("\n");
}
}
void ReversePrintf_DoubleLinked_function(node* pointer) {//[4]
doubleLinked* index_Node = NULL;
int i;
if(pointer->dataCnt == 0){
printf("data empty!! \n");
return;//END
}else{
index_Node = pointer->tail->left;
for(i= 1 ; i<= pointer->dataCnt ; i++) {
printf("%d ", index_Node->data);
index_Node = index_Node->left;
}printf("\n");
}
}
//|left|data|[right<---------> left]|data|[right<---------->left]|data|right<------------->left]|data|[right]
void FirstData_Remove(node* pointer) {//[5]
doubleLinked* remove_node = NULL;
if(pointer->dataCnt == 0) {
printf("data is empty!! \n");
return;//END
}else{//pointer->dataCnt >=1
if(pointer->dataCnt == 1) {
remove_node = pointer->head->right;
pointer->head->right = NULL;
pointer->tail->left = NULL;
pointer->dataCnt --;
free(remove_node);
return;//END
}else{//pointer->dataCnt>1
remove_node = pointer->head->right;
pointer->head->right->right->left = pointer->head;
pointer->head->right = pointer->head->right->right;
pointer->dataCnt --;
free(remove_node);
return;//END
}
}
}
void LastData_Remove(node* pointer) {//[6]
doubleLinked* remove_node = NULL;
if(pointer->dataCnt == 0) {
printf("data is empty!! \n");
return;//END
}else{//pointer->dataCnt>=1
if(pointer->dataCnt == 1) {
remove_node = pointer->head->right;
pointer->head->right = NULL;
pointer->tail->left = NULL;
pointer->dataCnt --;
free(remove_node);
return;
}else{ // pointer->dataCnt >1
remove_node = pointer->tail->left;
pointer->tail->left->left->right = pointer->tail;
pointer->tail->left = pointer->tail->left->left;
pointer->dataCnt --;
free(remove_node);
return;//END
}
}
}
//|left|data|[right<---------> left]|data|[right<---------->left]|data|right|
void FirstData_Plus(node* pointer) {//[7]
doubleLinked* newNode = NULL;
newNode = (doubleLinked*)malloc(sizeof(doubleLinked));
if(newNode == NULL) {
printf("malloc fail !!! \n");
return;
} else {//newNode != NULL
newNode->left = NULL;
newNode->right = NULL;
newNode->data = 0 ;
printf("new data input >>> ");
scanf("%d", &newNode->data);
if(pointer->dataCnt == 0) {
pointer->head->right = newNode;
newNode->left = pointer->head;
newNode->right = pointer->tail;
pointer->tail->left = newNode;
pointer->dataCnt++;
}else{//pointer->dataCnt>=1
pointer->head->right->left = newNode;
newNode->right = pointer->head->right;
pointer->head->right = newNode;
newNode->left = pointer->head;
pointer->dataCnt++;
}
}
}
'언어 > c언어' 카테고리의 다른 글
queue 다른버전 (0) | 2016.03.05 |
---|---|
c언어 행렬 구현 (0) | 2016.02.25 |
QUEUE (0) | 2016.02.22 |
STACK (0) | 2016.02.21 |
queue (수정할것 아직 완성되지 않음) (0) | 2016.02.17 |