자료구조 덱
/*
deck
front, rear : insert, remove
*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define _NOD_ 1
# define _DEC_ 0
typedef struct DECK
{
signed int element;
struct DECK* link;
}DECK, *PTR_DECK;
typedef struct NODE
{
PTR_DECK front;
PTR_DECK rear;
unsigned int nData;
}NODE, *PTR_NODE;
void* CreateNode(int result)
// 1 => return : PTR_NODE // return : PTR_DECK
{
if (result == _NOD_)
{
PTR_NODE nod = (PTR_NODE)malloc(sizeof(NODE));
memset(nod, 0, sizeof(NODE));
return nod;
}
else
{
PTR_DECK newNod = (PTR_DECK)malloc(sizeof(DECK));
memset(newNod, 0, sizeof(DECK));
return newNod;
}
} // end of CreateNode function
void Initillize(NODE** n_)
{
(*n_) = CreateNode(_NOD_);
(*n_)->front = CreateNode(_DEC_);
(*n_)->rear = CreateNode(_DEC_);
} // end of Initillize function
void First_Insert(NODE** n_)
{
PTR_DECK InsertNode = NULL;
InsertNode = CreateNode(_DEC_);
printf("First Insert data: ");
scanf("%d", &InsertNode->element);
//-----------------------------------------
if ((** n_).nData == 0)
{
(** n_).front->link = InsertNode;
(** n_).rear->link = InsertNode;
++(** n_).nData;
return; // END_
}
else
{
InsertNode->link = (** n_).front->link;
(** n_).front->link = InsertNode;
++(** n_).nData;
return; // END_
}
} // end of First_Insert function
void Last_Insert(NODE** n_)
{
PTR_DECK InsertNode = NULL;
InsertNode = CreateNode(_DEC_);
printf("Last Insert data: ");
scanf("%d", &InsertNode->element);
//-----------------------------------------
if ((** n_).nData == 0)
{
First_Insert(n_);
}
else
{
(** n_).rear->link->link = InsertNode;
(** n_).rear->link = InsertNode;
++(** n_).nData;
return; // END_
}
} // end of Last_Insert function
int First_Remove(NODE** n_)
{
PTR_DECK RemovNode = NULL;
//-----------------------------------------
if ((** n_).nData == 0)
{
printf("data is empty ... !!! \n");
return; // END_
}
else
{
if ((** n_).nData == 1)
{
RemovNode = (** n_).front->link;
(** n_).front->link = NULL;
(** n_).rear->link = NULL;
free(RemovNode);
--(** n_).nData;
return; // END_
}
else // (** n_).nData > 1
{
RemovNode = (** n_).front->link;
(** n_).front->link = (** n_).front->link->link;
free(RemovNode);
--(** n_).nData;
return; // END_
}
}
} // end of First_Remove function
int Last_Remove(NODE** n_)
{
PTR_DECK RemovNode = NULL;
//-----------------------------------------
if ((** n_).nData == 0)
{
printf("data is empty ... !!! \n");
return; // END_
}
else
{
if ((** n_).nData == 1)
{
First_Remove(n_);
}
else // (** n_).nData > 1
{
PTR_DECK index = (** n_).front;
int i; // index
for (i = 0; i < (** n_).nData - 1; i++)
{
index = index->link;
}
RemovNode = index->link;
(** n_).rear->link = index;
free(RemovNode);
--(** n_).nData;
}
}
} // end of Last_Remove function
void Printf_Data(NODE** n_)
{
if ((** n_).nData == 0)
{
printf("data is empty ... !!! \n");
return; // END_
}
else
{
PTR_DECK Index = NULL;
int i; // index
Index = (** n_).front->link;
for (i = 0; i < (** n_).nData; i++)
{
printf("%d ", Index->element);
Index = Index->link;
}
if (Index == NULL)
{
printf("__ok\n");
}
}
} // end of Printf_Data function
int main(void)
{
PTR_NODE dec_node = NULL;
Initillize(&dec_node);
First_Insert(&dec_node);
First_Insert(&dec_node);
First_Insert(&dec_node);
Last_Insert(&dec_node);
Last_Insert(&dec_node);
Last_Insert(&dec_node);
Printf_Data(&dec_node);
First_Remove(&dec_node);
Printf_Data(&dec_node);
Last_Remove(&dec_node);
Printf_Data(&dec_node);
return 0;
}