연결리스트란? 각각의 노드 안에 다음 노드와의 연결을 위한 부분을 만들어놓는다. 그 연결 공간을 다음 노드와 연결시킴으로써 여러 노드가 서로 이어질 수 있게 해준다. 이를 위해 next 멤버 변수가 존재하고, 이 next를 가지고 다른 노드를 연결해주는 것이다.
우리는 이중에서도 클래스에서의 연결리스트를 주의깊게 보려한다.
아래 예제코드를 살펴보자
class StudentNode {
public:
//파놓은 공간을 연결시켜줄 생성자
StudentNode(const char*, int, StudentNode*);
//생성자
StudentNode(const char*, int);
// 미리 파놓은 부분을 연결시켜줄 멤버 함수
void setNext(StudentNode*);
// 연결한 객체를 불러올 get함수
StudentNode* getNext();
//멤버 변수 get함수
const char* getName();
const int getId();
private:
const char* name;
int id;
//생성자 연결할 부분을 미리 파놓는다.
StudentNode* next;
};
const int StudentNode::getId() {
return id;
}
//생성자 => 연결 X
StudentNode::StudentNode(const char* name, int id)
{
this->name = name;
this->id = id;
this->next = NULL;
}
// 생성자 => 연결 O
// 연결 받을 객체를 포인터로 받아와서 연결시켜준다.
StudentNode::StudentNode(const char*, int, StudentNode* next)
{
this->name = name;
this->id = id;
//본인의 next를 받아온 next에 연결
this->next = next;
}
//이는 위에 연결시켜주는 생성자와 비슷한데, 생성하는 역할은 하지 않는다
//이미 있던 객체를 연결시켜준다.
void StudentNode::setNext(StudentNode* next)
{
this->next = next;
}
// 본인 객체와 next로 연결되어있는 객체를 불러옴.
StudentNode* StudentNode::getNext() {
return next;
}
const char* StudentNode::getName() {
return name;
}
int main() {
//문자형 포인터 배열 생성
const char* name[3] = { "kim","lee","park" };
// studentA,B,C객체 생성
StudentNode studentA(name[0], 1111);
StudentNode studentB(name[1], 2222);
StudentNode studentC(name[2], 3333);
//포인터 연결(setNext함수 사용)
studentA.setNext(&studentB);
studentB.setNext(&studentC);
//첫 포인터를 A로 선택
StudentNode* temp = &studentA;
while (true) {
//포인터가 가리키는 객체의 Name과 ID 출력
cout << "Name: " << temp->getName() << " | ID: " << temp->getId()
<< endl;
if (temp->getNext() == NULL)break;
else {
//다음 연결 리스트로 이동
temp = temp->getNext();
}
}
return 0;
}
int main() {
const char* name[3] = { "kim","lee","park" };
StudentNode studentA(name[0], 1111);
//생성자에서 연결시킬 객체 선택
// B->A
StudentNode studentB(name[1], 2222, &studentA);
// C->B
StudentNode studentC(name[2], 3333, &studentB);
// C->B->A
StudentNode* temp = &studentC;
while (true) {
cout << "Name: " << temp->getName() << " | ID: " << temp->getId()
<< endl;
if (temp->getNext() == NULL)break;
else {
temp = temp->getNext();
}
}
return 0;
}
이처럼 연결을 해주는 방법은 대표적으로 두가지이다.
- set함수를 만들어서 기존에 있던 객체를 연결 시켜주는 방법
- 생성자를 통해 객체를 만들면서 연결 시켜주는 방법