티스토리 뷰
반응형
1. CircularDoublyLinkedList.h (구조체,타입,함수 원형 선언)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | //서큘러 더블 링크드 리스트의 함수원형 선언// #ifndef CIRCULAR_DOUBLY_LINKEDLIST_H #define CIRCULAR_DOUBLY_LINKEDLIST_H #include <stdio.h> #include <stdlib.h> /*구조체 & 타입 선언*/ typedef int ElementType; typedef struct tagNode{ ElementType Data; struct tagNode* PrevNode; struct tagNode* NextNode; }Node; /*함수원형 선언*/ Node* CDLL_CreateNode(ElementType NewData); //노드 생성 void CDLL_DestroyNode(Node* Node); //노드 파괴 void CDLL_AppendNode(Node** Head,Node* NewNode); //노드 추가 void CDLL_InsertAfter(Node* Current, Node* NewNode); //노드 삽입 void CDLL_RemoveNode(Node** Head,Node* Remove); // 노드 삭제 Node* CDLL_GetNodeAt(Node* Head,int Location); // 노드 탐색 int CDLL_GetNodeCount(Node* Head); // 노드 카운팅 void PrintNode(Node* _Node);//노드 출력 #endif | cs |
2. CircularDoublyLinkedList.c (선언된 함수의 몸체 구현)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | //더블 링크드 리스트의 함수 구현 // #include "CircularDoublyLinkedList.h" /*노드 생성*/ Node* CDLL_CreateNode(ElementType NewData){ Node* NewNode=(Node*)malloc(sizeof(Node)); NewNode->Data=NewData; NewNode->PrevNode=NULL; NewNode->NextNode=NULL; return NewNode; } /*노드소멸*/ void CDLL_DestroyNode(Node* Node){ free(Node); } /*노드 추가(일부코드 추가 from DLL)*/ void CDLL_AppendNode(Node** Head,Node* NewNode){ if(*Head==NULL){ *Head=NewNode; (*Head)->PrevNode=*Head; (*Head)->NextNode=*Head; } else{ /*테일과 헤드 사이에 노드삽입 */ Node* Tail=(*Head)->PrevNode; Tail->NextNode->PrevNode=NewNode; Tail->NextNode=NewNode; NewNode->NextNode=*Head; NewNode->PrevNode=Tail; } } /*노드 삽입*/ void CDLL_InsertAfter(Node* Current,Node* NewNode){ NewNode->PrevNode=Current; NewNode->NextNode=Current->NextNode; if(Current->NextNode!=NULL){ Current->NextNode->PrevNode=NewNode; } Current->NextNode=NewNode; } /*노드 제거(일부코드 추가 from DLL)*/ void CDLL_RemoveNode(Node** Head,Node* Remove){ if(*Head==Remove){ (*Head)->PrevNode->NextNode=Remove->NextNode; (*Head)->NextNode->PrevNode=Remove->PrevNode; *Head=Remove->NextNode; Remove->NextNode=NULL; Remove->PrevNode=NULL; } else{ Node* Temp=Remove; Remove->PrevNode->NextNode=Temp->NextNode; Remove->NextNode->PrevNode=Temp->PrevNode; Remove->PrevNode=NULL; Remove->NextNode=NULL; } } /*노드 탐색*/ Node* CDLL_GetNodeAt(Node* Head,int Location){ Node* Current=Head; while(Current!=NULL && (--Location)>=0){ Current=Current->NextNode; } return Current; } /*노드 수 세기(일부코드 추가 From DLL*/ int CDLL_GetNodeCount(Node* Head){ int Count=0; Node* Current=Head; while(Current!=NULL){ Current=Current->NextNode; Count++; if(Current==Head){ break; } } return Count; } /*노드 출력*/ void PrintNode(Node* _Node){ if(_Node->PrevNode==NULL){ printf("Prev: NULL"); } else{ printf("Prev: %d",_Node->PrevNode->Data); } printf("Current: %d",_Node->Data); if(_Node->NextNode==NULL){ printf("Next: NULL\n"); } else{ printf("Next: %d\n",_Node->NextNode->Data); } } | cs |
3. Test_CircularDoublyLinkedList.c (테스트 코드)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | //테스트// #include "CircularDoublyLinkedList.h" int main(){ int i=0,Count=0; Node* List=NULL; Node* Current=NULL; Node* NewNode=NULL; /*노드 5개 추가*/ for(i=0;i<5;i++){ NewNode=CDLL_CreateNode(i); CDLL_AppendNode(&List,NewNode); } /*리스트 출력*/ Count=CDLL_GetNodeCount(List); for(i=0;i<Count;i++){ Current=CDLL_GetNodeAt(List,i); printf("List[%d] : %d\n",i,Current->Data); } /*리스트의 3번째칸 뒤에 노드 삽입*/ printf("\nInserting 3000 After [2]....\n\n"); Current=CDLL_GetNodeAt(List,2); NewNode=CDLL_CreateNode(3000); CDLL_InsertAfter(Current,NewNode); /*리스트 출력(일부 코드 추가 from DLL)*/ /*노드수의 2배만큼 루프를 돌며 환형임을 확인한다*/ Count=CDLL_GetNodeCount(List); for(i=0;i<Count*2;i++){ if(i==0){ Current=List; } else{ Current=Current->NextNode; } printf("List[%d] : %d\n",i,Current->Data); } //Current=CDLL_GetNodeAt(List,3); //PrintNode(Current); /*모든 노드를 메모리에서 제거*/ printf("\nDestroying List...\n"); Count=CDLL_GetNodeCount(List); for(i=0;i<Count;i++){ Current=CDLL_GetNodeAt(List,0); if(Current!=NULL){ CDLL_RemoveNode(&List,Current); CDLL_DestroyNode(Current); } } return 0; } | cs |
실행결과
반응형
'개인 서재..* > 알고리즘' 카테고리의 다른 글
[C언어] 링크드 큐 (0) | 2017.04.23 |
---|---|
[C언어] 스택(feat.링크드 리스트) (0) | 2017.04.20 |
[C언어] 스택(feat.배열) (0) | 2017.04.14 |
[C언어] Doubly Linked List (0) | 2017.04.14 |
[C언어] Singly Linked List (0) | 2017.04.14 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 겨드랑이 혹
- 급수에러
- 겨드랑이 멍울
- 아난티앳강남
- 피지낭종 후기
- 구글애드센스 광고차단
- 구글애드센스 혐오광고
- 물이 안나와요
- 스텐팬 세척
- 스텐팬 갈색
- 타르코프 스파 투어
- 제습기 내돈내산
- 사마귀광고 제거
- 피지낭종 수술후기
- 스파 파트 4
- 스텐팬 갈변
- 휘센 제습기
- 타르코프 스파 관광
- 겨드랑이 초음파
- 스파투어 파트4
- 스파관광 파트4
- 제습기 후기
- 겨드랑이 지방종
- 혐오광고 제거
- 친구들호캉스
- 싱크대 단수
- 건강검진 겨드랑이
- 피지낭종 제거수술
- 스텐팬 탄 자국
- 자취요리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함