언어/c언어

자료구조 덱

파아랑새 2017. 4. 2. 20:23

/*

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;

}