double linked

언어/c언어2016. 2. 23. 17:16

#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