자료구조의 한 종류입니다. (자료구조 : 데이터 관리하는 방법)
링크드리스트는 데이터 목록을 연결시켜서 접근할 수 있는 구조를 나타내고 있고 , 데이터를 저장하기위한 노드가 있으므로 다음 노드의 위치를 알 수 있습니다.
리스트는 선형구조로 되어있으며, 배열처럼 바로 접근되지는 않습니다.
그러므로 무조건 앞에서부터 차례대로 들어가야합니다.
그러나 처음과 끝만 연결해주면 되기때문에 갯수의 제한이 없어 자주 사용하게됩니다.
- Node: 숫자(데이터)를 담은 세트
- Head: 첫 Node
- Tail: 마지막 Node
struct node
{
int data;
node *next;
};
node라는 구조체를 만듭니다.
class list {
private:
node *head, *tail;
public:
list() {
head = NULL;
tail = NULL;
}
};
class에 대한 자세한 내용은 향후 클래스 파트에서 더 배울 수 있습니다.
이 곳에서는 list라는 클래스로 링크드리스트를 생성한다고 이해하면 됩니다.
배열과 달리 삽입할 위치의 앞, 뒤 노드(Node)의 화살표만 수정해주면 가볍게 삽입을 할 수 있습니다.
void create(int value) {
node *temp = new node;
temp->data = value;
temp->next = NULL;
if (head == NULL) {
head = temp;
tail = temp;
temp = NULL;
}
else {
tail->next = temp;
tail = temp;
}
cout << "creating " <<value<< endl;
}
링크드리스트에 차례대로 노드를 생성합니다.
void insert(int value) {
node *temp = new node;
temp->data = value;
temp->next = head;
head = temp;
cout << "inserting " << value << endl;
}
링크드리스트 앞에 값을 삽입합니다.
삭제의 경우 삽입의 정확한 반대를 해주면 됩니다.
void del_first() {
node *temp = new node;
temp = head;
head = head->next;
delete temp;
cout << "deleting first number" << endl;
}
void del_end() {
node *prev = new node;
node *curr = new node;
curr = head;
while (curr->next != NULL) {
prev = curr;
curr = curr->next;
}
tail = prev;
prev->next = NULL;
delete curr;
cout << "deleting end number" << endl;
}
특정한 노드를 방문하고 싶으면 처음부터 시작해서 화살표를 따라가며 방문해야 됩니다.
for (int i = 1; i < pos; i++) {
prev = curr;
curr = curr->next;
}
탐색은 특정 부분 삽입과 삭제에 다양하게 쓰이기 때문에 코드의 일부만 가져왔습니다.
탐색과 유사하게 머리부터 다음꺼로 넘어가면서 출력합니다.
void display() {
node *temp = new node;
temp = head;
while (temp!=NULL)
{
cout <<"|"<< temp->data << "|" ;
temp = temp->next;
}
cout << endl;
}
포인터는 초기화할때 null로 넣어 주어야합니다.
list()
{
head=NULL;
tail=NULL;
}
위 예시 코드에서 설명해보자면, 생성자로 머리와 꼬리를 초기화합니다.
각 노드가 자신의 앞과 뒤에 노드를 가리킵니다.
기존의 노드 구조체에 이전 노드도 같이 정의합니다.
struct node
{
int data;
node *next;
node *prev;
};
(더블 링크드리스트에 대한 자세한 실습은 추후 공지하겠습니다.)
-
과제-1(1) : 싱글 링크드리스트에 대한 구조를 그림판을 그리기
-
과제-1(2) : 더블 링크드리스트에 대한 구조를 그림판을 그리기
-
과제-2 : 한 링크드리스트의 모든 노드를 삭제하는 코드 작성하기
예제 코드:
#include<iostream>
using namespace std;
struct node
{
int data;
node *next;
};
class list {
private:
node *head, *tail;
public:
list() {
// 링크드리스트를 초기화하는 코드를 작성합니다.
}
void display() {
node *temp = new node;
temp = head;
while (temp!=NULL)
{
cout <<"|"<< temp->data << "|" ;
temp = temp->next;
}
cout << endl;
}
void create(int value) {
node *temp = new node;
temp->data = value;
temp->next = NULL;
if (head == NULL) {
head = temp;
tail = temp;
temp = NULL;
}
else {
tail->next = temp;
tail = temp;
}
}
void del_all() {
// 모든 노드를 지우는 코드를 작성합니다.
}
};
int main() {
list a;
a.create(5);
a.create(10);
a.create(15);
a.create(20);
a.display();
a.del_all(); //ASSIGNMENT "del_all()"
a.display();
return 0;
}
- 과제-2(1) : 싱글 링크드리스트로 삽입,삭제,탐색을 활용한 프로그램 만들기