c언어 구현 linkedlist
언어/c언어2016. 6. 25. 19:19
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | #include <stdio.h> #include <string.h> #include <stdlib.h> #define _SIZE_ 50 #define _TRUE_ 1 typedef struct _linkedlist { char name [_SIZE_]; // 이름 int num; // 고유 넘버 int HP; // 체 struct _linkedlist *pnext; }linkedlist; typedef struct _node { linkedlist* HEAD; linkedlist* TAIL; int dataCnt; }node; // _____ [ Function prototype ] ____________________________________ void ERROR(char* errorMessage); //________________ [1]__ 에러 컨트롤 void IN(node** ppnode); // _______________________ [2]__ 초기화 void ADD(node** ppnode); // ______________________ [3]__ 추가 void PRT(node** ppnode); // ______________________ [4]__ 출력 void DEL(node** ppnode); // ______________________ [5]__ 삭제 //__________________________________________________________________ int main (void) { node* _start = NULL; IN(&_start); ADD(&_start); ADD(&_start); ADD(&_start); ADD(&_start); PRT(&_start); DEL(&_start); PRT(&_start); return 0; } void ERROR(char* errorMessage) {//_______________ [1]__ 에러 컨트 fprintf(stdout, "%s", errorMessage); exit(0); } // end of [ERROR] function void IN(node** ppnode) { //______________________ [2]__ 초기 (* ppnode) = (node*)malloc(sizeof(node)); if ( (* ppnode) == NULL ) { ERROR(" MALLO_FAIL !!"); } else { (* ppnode)->dataCnt = 0; (* ppnode)->HEAD = (linkedlist*)malloc(sizeof(linkedlist)); memset((* ppnode)->HEAD, 0, sizeof(linkedlist)); (* ppnode)->TAIL = (linkedlist*)malloc(sizeof(linkedlist)); memset((* ppnode)->TAIL, 0, sizeof(linkedlist)); } } // end of [IN] function void newNodeIn(linkedlist** ppnode) { strcpy( (**ppnode).name , " "); (**ppnode).num = 0; (**ppnode).HP = 0; (**ppnode).pnext = NULL; } // end of [newNodeIn] function void duplicate(node** ppnode, linkedlist** pp_new) { linkedlist* tempIndex = NULL; int i; // for_index int tmpCnt = 0; int result = 0; while( _TRUE_ ) { if ((** ppnode).dataCnt == 0 ) { fprintf(stdout, "%s\n", " 입력하신 번호와 중복되는 번호는 없습니다. "); break; } else { // (** ppnode).dataCnt != 0 tempIndex = (** ppnode).HEAD->pnext; if ( tmpCnt == 2 ) { fprintf(stdout, "%s ", " 리스트 [번호]현황입니다. "); for ( i = 0; i < (** ppnode).dataCnt; i++ ) { printf("%d ", tempIndex->num); tempIndex = tempIndex->pnext; } tmpCnt = 0; tempIndex = (** ppnode).HEAD->pnext; } else { // tmpCnt <2 for ( i = 0; i < (** ppnode).dataCnt; i++ ) { if ( tempIndex->num == (** pp_new).num) { fprintf(stdout, "%s\n", " 중복되는 번호가 있습니다. 다시 입력해주세요 "); tmpCnt ++; result = 1; break; } else { tempIndex = tempIndex->pnext; result = 0; } } } } if (result == 1) { fprintf(stdout, "%s ", " 번호 입력 : "); scanf("%d", &((*pp_new)->num)); fflush(stdin); } else { fprintf(stdout, "%s\n", " 입력하신 번호와 중복되는 번호는 없습니다. "); break; } system("cls"); } } // end of [duplicate] function void ADD(node** ppnode) { system("cls"); // 새로 추가할 노드 정보 linkedlist *p = (linkedlist*)malloc(sizeof(linkedlist)); // 새로 추가할 노드 newNodeIn(&p); fprintf(stdout, "%s", "번호 입력 : "); scanf("%d", &(p->num)); fflush(stdin); duplicate(ppnode, &p); fprintf(stdout, "%s", "이름 입력 : "); gets( p->name ); fflush(stdin); fprintf(stdout, "%s", "체력 입력 : "); scanf("%d", &(p->HP)); system("cls"); //데이터 삽입 if ( (**ppnode).dataCnt == 0 ) { (**ppnode).HEAD->pnext = p; (**ppnode).TAIL->pnext = p; (**ppnode).dataCnt ++ ; } else { (**ppnode).TAIL->pnext->pnext = p; (**ppnode).TAIL->pnext = p; (**ppnode).dataCnt ++ ; } } // end of [ADD] function void PRT(node** ppnode) { linkedlist* nodeIndex = NULL; int i; // index if ( (**ppnode).dataCnt == 0) { ERROR("출력할 데이터가 없습니다."); } else { // (**ppnode).dataCnt != 0 nodeIndex = (**ppnode).HEAD->pnext; for (i = 0; i< (**ppnode).dataCnt; i++) { printf("[%d] ====================== \n", i+1); printf("nodeIndex-> num : %d \n", nodeIndex->num); printf("nodeIndex-> name : %s \n", nodeIndex->name); printf("nodeIndex-> HP : %d \n", nodeIndex->HP); printf("=========================== \n"); nodeIndex = nodeIndex->pnext; } } } // end of [PRT] function void DEL(node** ppnode) { linkedlist* prev = NULL; linkedlist* next = NULL; linkedlist* removeNode = NULL; int remTarget = 0; // 삭제할 데이터의 타겟 int i; // index // 리스트에 데이터가 있는지 확인 if ( (** ppnode).dataCnt == 0 ) { ERROR("삭제할 데이터가 없습니다."); } else { // (** ppnode).dataCnt != 0 prev = (** ppnode).HEAD; next = (** ppnode).HEAD->pnext; fprintf(stdout, "%s ", "삭제할 데이터의 고유번호 입력 : "); scanf("%d", &remTarget); fflush(stdin); for (i = 0 ; i < (** ppnode).dataCnt ; i++) { if (next->num == remTarget) { if ( next == (** ppnode).HEAD->pnext ) { if ( next == (** ppnode).TAIL->pnext ) { fprintf(stdout, "%s\n", "삭제할 데이터를 찾았습니다."); removeNode = next; (** ppnode).HEAD->pnext = NULL; (** ppnode).TAIL->pnext = NULL; (** ppnode).dataCnt --; free(removeNode); break; } else { // next != (** ppnode).TAIL->pnext fprintf(stdout, "%s\n", "삭제할 데이터를 찾았습니다."); removeNode = next; (** ppnode).HEAD->pnext = removeNode->pnext; (** ppnode).dataCnt --; free(removeNode); break; } } else { // next != (** ppnode).HEAD->pnext if ( next == (** ppnode).TAIL->pnext ) { fprintf(stdout, "%s\n", "삭제할 데이터를 찾았습니다."); removeNode = next; (** ppnode).TAIL->pnext = prev; (** ppnode).dataCnt --; free(removeNode); break; } else { // next != (** ppnode).TAIL->pnext fprintf(stdout, "%s\n", "삭제할 데이터를 찾았습니다."); removeNode = next; prev->pnext = next->pnext; (** ppnode).dataCnt --; free(removeNode); break; } } } else { next = next->pnext; prev = prev->pnext; } } } } | cs |
'언어 > c언어' 카테고리의 다른 글
네이버 지식인 답변준것 c언어 구구단 (0) | 2016.07.01 |
---|---|
c언어) 양수, 음수, 0 카운팅 (2) | 2016.06.25 |
앞 문자열 대문자 로 ~~~ (0) | 2016.06.17 |
c언어 조건에 맞는 사람 찾기 (0) | 2016.06.12 |
버블정렬 (0) | 2016.06.12 |