C++ 시작한지 24일 째인 초짜입니다..
링크드 리스트 코드 처음부터 이해가 잘 안가는데
한 줄 한 줄 설명 해주는
이해하기 쉬운 책이나 강의 있나요..
이해 안 되는 부분 : 처음부터 개념 이해 X
List* CreateList() < -- List 뒤에 *를 왜 쓰는지..?
Node* head = new Node; <-- 왜 포인터를 쓰는지?
#include "list.h"
#include "students.h"
// 새로운 링크드 리스트를 만든다.
// 반환값 : 새로운 링크드 리스트의 포인터
List* CreateList()
{
// 헤드 노드를 만들고 초기화한다.
Node* head = new Node;
head->prev = head;
head->next = head;
head->data = 0;
// List 구조체를 만들고 초기화한다.
List* list = new List;
list->head = head;
// List 구조체를 반환한다.
return list;
}
// 리스트를 제거한다.
// 리스트의 모든 노드와 데이터도 제거한다.
// list : 리스트
// deleteData : true면 노드의 데이터도 제거한다.
void RemoveList(List* list, bool deleteData)
{
// head 노드부터 마지막 노드까지 제거한다.
Node* current = list->head;
do
{
// 현재 노드를 지울 것이므로
// 다음 노드를 구해둔다.
Node* next = current->next;
// 현재 노드와 노드의 데이터를 제거한다.
if (deleteData)
delete (Student*)current->data;
delete current;
// 현재 노드를 갱신한다.
current = next;
}
while( current != list->head);
// while() 문에 도달한 상태에서
// list->head가 가리키는 곳의 메모리는
// 해제된 상태이지만, list->head처럼
// 그곳의 주소값만 사용하는 것은 상관없다.
// 리스트를 제거한다.
delete list;
}
// 마지막 노드를 구한다.
// list : 리스트
// 반환값 : 리스트의 마지막 노드
Node* GetTail(List* list)
{
// 헤드 노드의 이전 노드를 반환한다.
// (헤드 노드 자기 자신일 수도 있다.)
return list->head->prev;
}
// 새로운 노드를 추가한다.
// node : 이 노드 뒤에 새 노드가 추가된다.
// data : 새 노드의 데이타
void InsertNodeAfter(Node* node, void* data)
{
// 삽입되려는 곳의 앞, 뒤 노드를 구해놓으면
// 읽기 쉬운 소스 코드를 만들 수 있다.
Node* before = node;
Node* after = node->next;
// 새 노드를 만들고 초기화한다.
Node* newNode = new Node;
newNode->data = data;
newNode->next = after;
newNode->prev = before;
// node의 뒤에 있던 노드가 새 노드를 가리키도록 만든다.
after->prev = newNode;
// 매개변수 node가 새 노드를 가리키도록 만든다.
before->next = newNode;
}
// 노드를 제거한다.
// node : 제거할 노드
// deleteData : true면 노드가 가리키는 데이타도 제거한다.
void RemoveNode(Node* node, bool deleteData)
{
// node의 앞, 뒤 노드를 구해놓으면
// 읽기 쉬운 소스 코드를 만들 수 있다.
Node* before = node->prev;
Node* after = node->next;
// node의 이전 노드와 다음 노드를 연결해준다.
before->next = after;
after->prev = before;
// node의 데이타와 node 자신을 제거한다.
if (deleteData)
delete (Student*)node->data;
delete node;
}
// 노드의 다음 노드를 반환한다.
// node : 이 노드의 다음 노드가 반환된다.
// 반환값 : node의 다음 노드
Node* GetNext(Node* node)
{
return node->next;
}
// 노드의 이전 노드를 반환한다.
// node : 이 노드의 이전 노드가 반환된다.
// 반환값 : node의 이전 노드
Node* GetPrev(Node* node)
{
return node->prev;
}
// 노드에 보관된 데이터를 반환한다.
// node : 이 노드의 데이터를 반환한다.
// 반환값 : node에 보관된 데이타
void* GetData(Node* node)
{
return node->data;
}
포인터를 모르면 C부터 허셈
계절학기인건가 조교 없음? GPT한테 물어봐 그정돈 잘 알려줄거임