파아랑새 2017. 1. 8. 15:38

# include<stdio.h>

# include<stdlib.h>


typedef struct DQNode {

int data;

struct DQNode *Rlink;

struct DQNode *Llink;

}DQNode;


// node ------------------

DQNode *front;

DQNode *rear;

// -----------------------


//++++++++++++++++++++++++++++++++++++++

DQNode *CreateNode(); // __________[1] +

void AddFront(int); // ____________[2] +

void AddRear(int); // _____________[3] +

int DeleteFront(); // _____________[4] +

int IsEmpty(); // _________________[5] +

int DeleteRear(); // ______________[6] +

int DQueueSize(); // ______________[7] +

//++++++++++++++++++++++++++++++++++++++


int main(void) {

int i; // index

int num = 0;

front = CreateNode();

rear = CreateNode();

for (i = 1; i <= 10; i++) {

AddRear(i);

}

for (i = 1; i <= 5; i++) {

printf("DeleteFront() => %d \n", DeleteFront());

}

return 0;

} // end of main function


DQNode *CreateNode() { // ___[1]

DQNode *L = NULL;

L = (DQNode *)malloc(sizeof(DQNode));

L->data = 0;

L->Rlink = NULL;

L->Llink = NULL;

return L;

} // end of CreateNode function


void AddFront(int num) { // _

DQNode *N = CreateNode(); // create node

// data setting

N->data = num;

if (front->Rlink == NULL) {

front->Rlink = N; // stepOne

N->Llink = front; // stepTwo

N->Rlink = rear; // stepThree

rear->Llink = N; // stepFore

// |Llink|front|Rlink|--|Llink|N|Rlink|--|Llink|rear|Rlink|

}

else { // front->Rlink != NULL

N->Rlink = front->Rlink;

front->Rlink->Llink = N;

N->Llink = front;

front->Rlink = N;

}

} // end of AddFront function


void AddRear(int num) {

DQNode *N = CreateNode();

N->data = num;


if (front->Rlink == NULL) {

free(N);

AddFront(num);

}

else { // front->Rlink != NULL

// |Llink|front|Rlink|--|Llink|N|Rlink|--|Llink|rear|Rlink|

rear->Llink->Rlink = N; // ->

N->Llink = rear->Llink; // <-

N->Rlink = rear; // ->

rear->Llink = N; // <-

}

} // end of AddRear function


int DeleteFront() {

int removeNumber = 0;

DQNode* removeNode = NULL;

if (IsEmpty() == 1) {

return 0; 

}

else { // IsEmpty() != 1

if (front->Rlink == rear->Llink) {

removeNumber = front->Rlink->data;

removeNode = front->Rlink;

front->Rlink = NULL;

rear->Llink = NULL;

free(removeNode);

return removeNumber;

}

else {

//front->Rlink != rear->Llink

// |Llink|front|Rlink|-|Llink|N|Rlink|-|Llink|N|Rlink|-|Llink|rear|Rlink|

removeNumber = front->Rlink->data;

removeNode = front->Rlink;

front->Rlink = front->Rlink->Rlink;

front->Rlink = front->Rlink->Rlink->Llink;

free(removeNode);

return removeNumber;

}

}

} // end of DeleteFront function


int IsEmpty() {

if (front->Rlink == NULL) {

return 1;

}

else {

// front->Rlink != NULL

return 0;

}

} // end of IsEmpty function


int DeleteRear() {

int removeNumber = 0;

DQNode* removeNode = NULL;

if (IsEmpty() == 1) {

return 0;

}

else { // IsEmpty() != 1

if (front->Rlink == rear->Llink) {

removeNumber = front->Rlink->data;

removeNode = front->Rlink;

front->Rlink = NULL;

rear->Llink = NULL;

free(removeNode);

return removeNumber;

}

else { 

//front->Rlink != rear->Llink

// |Llink|front|Rlink|-|Llink|N|Rlink|-|Llink|N|Rlink|-|Llink|rear|Rlink|

removeNumber = rear->Llink->data;

removeNode = rear->Llink;

rear->Llink = rear->Llink->Llink;

free(removeNode);

return removeNumber;

}

}

} // end of DeleteRear function


int DQueueSize() {

int count = 0;

DQNode* indexNode = NULL;

if (IsEmpty() == 1) return count;

else { // IsEmpty() != 1

indexNode = front;

while (indexNode != NULL) {

indexNode = indexNode->Rlink;

count++;

}

printf("count => [%d] \n", count);

}

} // end of DQueueSize function