Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Data Structure. Linked List

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
errorsplitsearchRemove_node2Remove_nodedisplayCreate_nodeAdd_node
main()
int main(){
ListNode *list = NULL;
//element추가
fo...
main()main()main()main()main()main()main()main()
add_node
(ListNode **list, ListNode *pos, ListNode *new_node)
// element ...
errorsplitsearchRemove_node2Remove_nodedisplaymain() add_node
create_node
(element data)
// node 메모리 할당
ListNode* create_n...
Publicité
Publicité
Prochain SlideShare
연결리스트 박진호
연결리스트 박진호
Chargement dans…3
×

Consultez-les par la suite

1 sur 13 Publicité

Plus De Contenu Connexe

Les utilisateurs ont également aimé (20)

Plus récents (20)

Publicité

Data Structure. Linked List

  1. 1. errorsplitsearchRemove_node2Remove_nodedisplayCreate_nodeAdd_node main() int main(){ ListNode *list = NULL; //element추가 for(int i=0 ;i<15; i++){//적당한 개수 15개로 Node삽입 add_node(&list, NULL, create_node(i)); } //element출력 printf("----- add결과 -----n"); display(list); //element삭제 removed_node(&list, NULL, list); removed_node(&list, NULL, list); printf("----- remove결과 -----n"); display(list); //ListNode쪼개기 ListNode *odd_list = NULL; ListNode *even_list = NULL; split(&list, &odd_list, &even_list); //list내 Node들을 odd_list와 even_list로 조건에 맞게 복사하여 저장 printf("----- split결과 -----n"); printf("odd_list : n");display(odd_list); printf("even_list : n");display(even_list); printf("원래 list : n");display(list); //element검색 int key; printf("nlist내 삭제할 data를 입력하세요 >>"); scanf("%d", &key); ListNode *x = search(list, key);//removed_node2로 삭제할 Node 주소 //element삭제2 removed_node2(&list, x); printf("----- remove2결과 -----n"); display(list); }
  2. 2. main()main()main()main()main()main()main()main() add_node (ListNode **list, ListNode *pos, ListNode *new_node) // element 추가 void add_node(ListNode **list, ListNode *pos, ListNode *new_node){ if(*list == NULL){//공백List *list = new_node; } //선행노드NULL인 첫번째node로 삽입 else if(pos == NULL){ new_node->link = *list; *list = new_node; } else{//해당 list의 특정 주소를 선행노드로 알고 입력할 경우 //1. after_node를 new_node가 가리킴 new_node->link = pos->link; //2. before_node가 new_node를 가리킴 pos->link = new_node; } } HeadPointer new_node new_node->link = pos->link;pos->link = new_node; before_node after_node HeadPointer after_node new_node new_node->link = *list; *list = new_node; HeadPointer new_node *list = new_node;
  3. 3. errorsplitsearchRemove_node2Remove_nodedisplaymain() add_node create_node (element data) // node 메모리 할당 ListNode* create_node(element data){ ListNode *p = (ListNode *)malloc(sizeof(ListNode)); if(p == NULL)error("메모리 할당 에러"); p->data = data; p->link = NULL; return p; } CompileTime Binding MainMemory 8Byte *P new_node
  4. 4. errorsplitsearchRemove_node2Remove_nodemain() add_nodecreate_node display (ListNode *list) // element 출력 void display(ListNode *list){ while(list != NULL){ printf("%d", list->data); list = list->link; if(list != NULL)printf("->"); } printf("nListNode를 모두 출력하였습니다.n"); } HeadPointer printf("%d", list->data); printf("->"); list = list->link; list = list->link; list = list->link; printf("nListNode를 모두 출력하였습니다.n"); printf("%d", list->data); printf("->"); printf("%d", list->data); printf("->"); printf("%d", list->data);
  5. 5. main()main()main()main()main()main()main()main() remove_node (ListNode **phead, ListNode *pos, ListNode *removed_node) void removed_node(ListNode **phead, ListNode *pos, ListNode *removed_node){ ListNode *p = *phead; if(p == NULL) printf("List에 Node가 없습니다.n"); // 첫번째 Node를 삭제 else if(pos == NULL) *phead = p->link; // 지정한 before_node주소 pos 다음에 위치한 Node를 삭제 else pos->link = removed_node->link; printf("%d삭제n", removed_node->data); free(removed_node); } HeadPointer after_node removed_node *phead = p->link; printf("%d삭제n", removed_node->data); free(removed_node); HeadPointer before_node after_node removed_node pos pos->link = removed_node->link; printf("%d삭제n", removed_node->data); free(removed_node);
  6. 6. main()main()main()main()main()main()main()main() remove_node2 (ListNode **phead, ListNode *removed_node) void removed_node2(ListNode **phead, ListNode *x){ // 삭제할 Node 주소가 NULL인 경우 (List내 없는 경우) if(x == NULL)printf("List에 Node가 존재하지 않습니다.n"); // 마지막 Node라서 after_node가 없는 경우 x바로 삭제 else if(x->link == NULL){ ListNode *p = *phead; printf("%d의 다음 node가 없습니다. %d를 바로 삭제하겠습니다.n", x->data, x->data); while(p->link->link != NULL) p = p->link; p->link = NULL; free(x); // 마지막 Node인 x 삭제 } else{ ListNode *removed_node = x->link;//x다음인 y를 삭제 printf("%d가 들어있던 node를 %d의 node로 복사하고 삭제 n", removed_node->data, x->data); x->data = x->link->data;//데이터 복사 x->link = x->link->link; free(removed_node); } } HeadPointer ListNode *p = *phead; while(p->link->link != NULL) p = p->link; p->link = NULL; free(x); // 마지막 Node인 x 삭제 removed_node removed_node x before_node x->data = x->link->data;//데이터 복사 x->link = x->link->link; ListNode *removed_node = x->link; free(removed_node);
  7. 7. errorsplitmain()add_nodecreate_nodedisplayremove_noderemove_node2 search (ListNode *list, element key) ListNode* search(ListNode *list, element key){ ListNode *p = list; ListNode *found = NULL;//검색된 Node를 저장 while(p != NULL){ if(p->data == key){ printf("%d를 찾았습니다. 해당 데이터는 메모리 내 %x주소에 존재합니다.n", p->data, p); found = p; //포인터변수 x에 대입하기 위해 주소값 리턴 return found; } else p = p->link; } return found;//NULL을 리턴 } found HeadPointer p = p->link; p = p->link; p = p->link; found = p; element key = data;
  8. 8. main()main()main()main()main()main()main()main() split (ListNode **list, ListNode **odd_list, ListNode **even_list) void split(ListNode** phead, ListNode** phead1, ListNode** phead2) { //phead1 -> 짝수번째 노드들을 모음. //phead2 -> 홀수번째 노드들을 모음. int count = 0; ListNode* tmp = *phead; while (tmp != NULL) { ++count; if (count % 2 == 0) //짝수 add_node(phead1, NULL, create_node(tmp->data)); else //홀수 add_node(phead2, NULL, create_node(tmp->data)); tmp = tmp->link; } } 짝수 HeadPointer new_node add_node(phead1, NULL, create_node(tmp->data)); 홀수 HeadPointer new_node add_node(phead2, NULL, create_node(tmp->data)); count = 1; count = 2; count = 3; count = 8; count = 9; count = 4; count = 7; count = 6; count = 5; tmp = tmp->link; tmp = tmp->link; tmp = tmp->link; tmp = tmp->link; tmp = tmp->link;tmp = tmp->link; tmp = tmp->link; tmp = tmp->link;
  9. 9. main()add_nodecreate_nodedisplayremove_noderemove_node2search split error (char *message) // 메모리 할당 오류 메시지 //#include<stdlib.h> void error(char* message){ fprintf(stderr, "%sn", message); exit(1); }

×