본문 바로가기

카테고리 없음

2020-12-20 06시 개발자 글 모음 | "열혈 자료구조 - 5-2. 양방향 연" 외 4개 이야기

열혈 자료구조 - 5-1. 원형 연결 리스트(1) by 박세용

  • - 단순 연결 리스트의 마지막 노드는 NULL을 가르키지만 원형 연결 리스트는 마지막 노드가 첫 번째 노드(HEAD)를 가르킴
  • - HEAD와 TAIL의 포인터 변수를 각각 두지 않고 하나의 포인터 변수만 가지고 머리 또는 꼬리에 노드를 추가할 수 있음
  • -> TAIL을 사용하는 원형 연결 리스트를 변형된 원형 연결 리스트라 함


열혈 자료구조 - 5-1. 원형 연결 리스트(2) by 박세용

  • Data data) { Node * newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; if(plist->tail == NULL) { plist->tail = newNode; newNode->next = newNode; } else { newNode->next = plist->tail->next; // 새 노드의 next가 현재 tail의 next를 가르킴 plist->tail->next = newNode; // tail의 next가 새 노드가 됨 // tail은 그대로 } (plist->numOfData)++; }
  • Data data) { Node * newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; if(plist->tail == NULL) { plist->tail = newNode; newNode->next = newNode; } else { newNode->next = plist->tail->next; // 새 노드의 next를 현재 tail의 넥스트를 받음 plist->tail->next = newNode; // 현재 tail의 next를 새 노드를 가르킴 plist->tail = newNode; // 새 노드가 tail이 됨 } (plist->numOfData)++; }
  • Data LRemove(List * plist) { Node * rpos = plist->cur; Data rdata = rpos->data; if(rpos == plist->tail) // 삭제 대상을 tail이 가리킨다면 { if(plist->tail == plist->tail->next) // 그리고 마지막 남은 노드라면 plist->tail = NULL; else plist->tail = plist->before; } plist->before->next = plist->cur->next; plist->cur = plist->before; free(rpos); (plist->numOfData)--; return rdata; }


2021 대학생 노트북 추천 Top7, 가성비 위주로 비교! by 왕형준

  • in Eudaimonia and Co


열혈 자료구조 - 5-2. 양방향 연결 리스트(1) by 박세용

  • // 단순 연결 int LNext(List * plist
  • Data * pdata) { if(plist->tail == NULL) return FALSE; plist->before = plist->cur; // 삭제를 위해 이전 노드의 주소가 필요 plist->cur = plist->cur->next; *pdata = plist->cur->data; return TRUE; } // 양방향 연결 int LNext(List * plist
  • Data * pdata) { if(plist->tail == NULL) // 저장된 노드가 없다면 return FALSE; // plist->before = plist->cur; 필요가 없어짐 plist->cur = plist->cur->next; *pdata = plist->cur->data; return TRUE; }


열혈 자료구조 - 5-2. 양방향 연결 리스트(2) by 박세용

  • Data data) { Node * newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = plist->head; // 첫번째 노드는 next가 NULL이 되어야 하고 그 이후는 next가 HEAD가 되어야 함 // 처음에 head는 NULL이기 때문에 이렇게 코드를 넣으면 두 경우 모두를 만족시킬 수 있음 if(plist->head != NULL) plist->head->prev = newNode; // 새 노드와 head를 연결 newNode->prev = NULL; plist->head = newNode; (plist->numOfData)++; }
  • Data * pdata) { if(plist->cur->prev == NULL) return FALSE; plist->cur = plist->cur->prev; *pdata = plist->cur->data; return TRUE; }
  • Data LRemove(List * plist) { Node * rpos = plist->cur; Data remv = rpos->data; if ( plist->cur != plist->head ) { plist->cur->prev->next = plist->cur->next; if ( plist->cur->next != NULL) // cur에 다음 노드가 있는 경우 plist->cur->next->prev = plist->cur->prev; plist->cur = plist->cur->prev; // cur의 위치를 재조정 } // cur이 head가 아닌 경우 free(rpos); (plist->numOfData)--; return remv; }