07장 덱(Deque) – 연결리스트(LinkedList)를 이용한
- 연결리스트(LinkedList)를 이용한 덱(Deque) 구현 #1 :S007_Deque.c
1234567891011121314#include <stdio.h>#include <stdlib.h>typedef struct _node{int data;struct _node * next;struct _node * prev;} Node;Node *head = NULL;Node *tail = NULL;void main(int argc, char* argv[]){} - 연결리스트(LinkedList)를 이용한 덱(Deque) 구현 #2
12345678910111213void Free(){Node *cur;while(head != NULL){cur = head;head = head->next;free(cur);}}void main(int argc, char* argv[]){Free();} - 연결리스트(LinkedList)를 이용한 덱(Deque) 구현 #3
123456789101112131415161718192021222324252627282930313233void AddFirst(int data){Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = head;newNode->prev = NULL;if(head == NULL){ //비어있다면tail = newNode;}else{head->prev = newNode;}head = newNode;}void AddLast(int data){Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;newNode->prev = tail;if(head == NULL){ //비어있다면head = newNode;}else{tail->next = newNode;}tail = newNode;}void main(int argc, char* argv[]){AddFirst(1);AddLast(3);Free();} - 연결리스트(LinkedList)를 이용한 덱(Deque) 구현 #4
12345678910111213141516void printDeque(){Node *cur = head;while(cur != NULL){printf("%d ", cur->data);cur = cur->next;}printf("\n\n");}void main(int argc, char* argv[]){AddFirst(1); printDeque();AddFirst(3); printDeque();AddLast(5); printDeque();AddLast(7); printDeque();Free();} - 연결리스트(LinkedList)를 이용한 덱(Deque) 구현 #5
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354int RemoveFirst(){int data = -1;if(head == NULL){printf("Empty\n");}else{Node *cur = head;data = cur->data;head = cur->next;free(cur);}if(head == NULL){tail = NULL;}else{head->prev = NULL;}return data;}int RemoveLast(){int data = -1;if(head == NULL){printf("Empty\n");}else{Node *cur = tail;data = cur->data;tail = cur->prev;free(cur);}if(tail == NULL){head = NULL;}else{tail->next = NULL;}return data;}void main(int argc, char* argv[]){AddFirst(1); printDeque();AddFirst(3); printDeque();AddLast(5); printDeque();AddLast(7); printDeque();AddFirst(9); printDeque();AddLast(11); printDeque();printf("POP_First : %d\n", RemoveFirst()); printDeque();printf("POP_Last : %d\n", RemoveLast()); printDeque();Free();} - 연결리스트(LinkedList)를 이용한 덱(Deque) #6
12345678910111213141516171819202122232425262728293031int peekFirst(){if(head == NULL){printf("Empty\n");return -1;}else{return head->data;}}int peekLast(){if(head == NULL){printf("Empty\n");return -1;}else{return tail->data;}}void main(int argc, char* argv[]){AddFirst(1); printDeque();AddFirst(3); printDeque();AddLast(5); printDeque();AddLast(7); printDeque();AddFirst(9); printDeque();AddLast(11); printDeque();printf("PEEK_First : %d\n", peekFirst()); printDeque();printf("POP_First : %d\n", RemoveFirst()); printDeque();printf("POP_Last : %d\n", RemoveLast()); printDeque();}
- 연결리스트(LinkedList)를 이용한 덱(Deque) 완성 버전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161#include <stdio.h>#include <stdlib.h>typedef struct _node{int data;struct _node * next;struct _node * prev;} Node;Node *head = NULL;Node *tail = NULL;////// Deque의 기본함수 Add/Push/EnQueu(), Remove/Pop/Dequeue(), Peek()void AddFirst(int data){Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = head;newNode->prev = NULL;if(head == NULL){ //비어있다면tail = newNode;}else{head->prev = newNode;}head = newNode;}void AddLast(int data){Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;newNode->prev = tail;if(head == NULL){ //비어있다면head = newNode;}else{tail->next = newNode;}tail = newNode;}int RemoveFirst(){int data = -1;if(head == NULL){printf("Empty\n");}else{Node *cur = head;data = cur->data;head = cur->next;free(cur);}if(head == NULL){tail = NULL;}else{head->prev = NULL;}return data;}int RemoveLast(){int data = -1;if(head == NULL){printf("Empty\n");}else{Node *cur = tail;data = cur->data;tail = cur->prev;free(cur);}if(tail == NULL){head = NULL;}else{tail->next = NULL;}return data;}int peekFirst(){if(head == NULL){printf("Empty\n");return -1;}else{return head->data;}}int peekLast(){if(head == NULL){printf("Empty\n");return -1;}else{return tail->data;}}////////// stack 추가 함수void initDeque(){head = NULL;tail = NULL;}int isEmpty(){if(head == NULL){return 1; //true}else{return 0; //false}}int isFull(){} //존재할 필요가 없음void printDeque(){Node *cur = head;while(cur != NULL){printf("%d ", cur->data);cur = cur->next;}printf("\n\n");}void Free(){Node *cur;while(head != NULL){cur = head;head = head->next;free(cur);}}///////// 메인 함수void main(){AddFirst(1); printDeque();AddFirst(3); printDeque();AddLast(5); printDeque();AddLast(7); printDeque();AddFirst(9); printDeque();AddLast(11); printDeque();printf("PEEK_First : %d\n", peekFirst()); printDeque();printf("POP_First : %d\n", RemoveFirst()); printDeque();printf("POP_Last : %d\n", RemoveLast()); printDeque();AddFirst(13); printDeque();AddLast(15); printDeque();printf("POP_First : %d\n", RemoveFirst()); printDeque();printf("PEEK_Last : %d\n", peekLast()); printDeque();printf("POP_First : %d\n", RemoveFirst()); printDeque();printf("POP_Last : %d\n", RemoveLast()); printDeque();printf("POP_Last : %d\n", RemoveLast()); printDeque();Free();}