deck
# 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