티스토리 뷰
반응형
1. DoublyLinkedList.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 DOUBLY_LINKEDLIST_H #define 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* DLL_CreateNode(ElementType NewData); //노드 생성 void DLL_DestroyNode(Node* Node); //노드 파괴 void DLL_AppendNode(Node** Head,Node* NewNode); //노드 추가 void DLL_InsertAfter(Node* Current, Node* NewNode); //노드 삽입 void DLL_RemoveNode(Node** Head,Node* Remove); // 노드 삭제 Node* DLL_GetNodeAt(Node* Head,int Location); // 노드 탐색 int DLL_GetNodeCount(Node* Head); // 노드 카운팅 void PrintNode(Node* _Node);//노드 출력 void PrintReverse(Node* Head);//비타민퀴즈,역순으로 출력 #endif | cs |
2. DoubleLinkedList.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 122 123 124 125 126 127 128 | //더블 링크드 리스트의 함수 구현 // #include "DoublyLinkedList.h" /*노드 생성*/ Node* DLL_CreateNode(ElementType NewData){ Node* NewNode=(Node*)malloc(sizeof(Node)); NewNode->Data=NewData; NewNode->PrevNode=NULL; NewNode->NextNode=NULL; return NewNode; } /*노드소멸*/ void DLL_DestroyNode(Node* Node){ free(Node); } /*노드 추가*/ void DLL_AppendNode(Node** Head,Node* NewNode){ if(*Head==NULL){ *Head=NewNode; } else{ Node* Tail=*Head; while(Tail->NextNode!=NULL){ Tail=Tail->NextNode; } Tail->NextNode=NewNode; NewNode->PrevNode=Tail; } } /*노드 삽입*/ void DLL_InsertAfter(Node* Current,Node* NewNode){ NewNode->PrevNode=Current; NewNode->NextNode=Current->NextNode; if(Current->NextNode!=NULL){ Current->NextNode->PrevNode=NewNode; } Current->NextNode=NewNode; } /*노드 제거*/ void DLL_RemoveNode(Node** Head,Node* Remove){ if(*Head==Remove){ *Head=Remove->NextNode; if(*Head!=NULL){ (*Head)->PrevNode=NULL; } Remove->PrevNode=NULL; Remove->NextNode=NULL; } else{ Node* Temp=Remove; if(Remove->PrevNode!=NULL){ Remove->PrevNode->NextNode=Temp->NextNode; } if(Remove->NextNode!=NULL){ Remove->NextNode->PrevNode=Temp->PrevNode; } Remove->PrevNode=NULL; Remove->NextNode=NULL; } } /*노드 탐색*/ Node* DLL_GetNodeAt(Node* Head,int Location){ Node* Current=Head; while(Current!=NULL && (--Location)>=0){ Current=Current->NextNode; } return Current; } /*노드 수 세기*/ int DLL_GetNodeCount(Node* Head){ int Count=0; Node* Current=Head; while(Current!=NULL){ Current=Current->NextNode; Count++; } 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); } } void PrintReverse(Node* Head){ // 비타민 퀴즈, 더블 링크드 리스트르 역순으로 출력하는 함수 작성 int cnt=0; Node* Tail=Head; printf("\nPrinting Reverse\n"); while(Tail->NextNode!=NULL){ Tail=Tail->NextNode; cnt++; } while(cnt>=0){ printf("List[%d] : %d\n",cnt,Tail->Data); Tail=Tail->PrevNode; cnt--; } } | cs |
3. Test_DoublyLinkedList.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 | //테스트// #include "DoublyLinkedList.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=DLL_CreateNode(i); DLL_AppendNode(&List,NewNode); } /*리스트 출력*/ Count=DLL_GetNodeCount(List); for(i=0;i<Count;i++){ Current=DLL_GetNodeAt(List,i); printf("List[%d] : %d\n",i,Current->Data); } /*리스트의 3번째칸 뒤에 노드 삽입*/ printf("\nInserting 3000 After [2]....\n\n"); Current=DLL_GetNodeAt(List,2); NewNode=DLL_CreateNode(3000); DLL_InsertAfter(Current,NewNode); /*리스트 출력*/ Count=DLL_GetNodeCount(List); for(i=0;i<Count;i++){ Current=DLL_GetNodeAt(List,i); printf("List[%d] : %d\n",i,Current->Data); } Current=DLL_GetNodeAt(List,3); PrintNode(Current); PrintReverse(List); /*모든 노드를 메모리에서 제거*/ printf("\nDestroying List...\n"); Count=DLL_GetNodeCount(List); for(i=0;i<Count;i++){ Current=DLL_GetNodeAt(List,0); if(Current!=NULL){ DLL_RemoveNode(&List,Current); DLL_DestroyNode(Current); } } return 0; } | cs |
실행 결과
반응형
'개인 서재..* > 알고리즘' 카테고리의 다른 글
[C언어] 링크드 큐 (0) | 2017.04.23 |
---|---|
[C언어] 스택(feat.링크드 리스트) (0) | 2017.04.20 |
[C언어] 스택(feat.배열) (0) | 2017.04.14 |
[C언어] Circular 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 |
글 보관함