노드는 자신과 연결된 노드의 정보를 가지고 있으므로 물리적 메모리 이동 없이 링크만 조작하여 리스트의 중간에 새로운 노드를 쉽게 삽입할 수 있다.
1, 2, 3 세 개의 노드가 있는 상태에서 노드 2 다음에 노드 4가 삽입되는 가장 일반적인 경우의 과정
① Node 구조체를 새로 할당하여 New 노드를 만들고 이 노드의 value에 4를 대입. 노드 4의 next는 현재 쓰레기값을 가지고 있는 상태.
② 새로 만든 노드 4의 링크에 노드 3의 번지를 대입 (New->next = Target->next).
노드 4가 노드 3 앞에 위치하도록 연결.
노드의 3의 번지는 바로 앞에 있는 노드 2의 링크에서 구할 수 있는데 노드 2의 값을 바꾸기 전에 먼저 읽어야 한다.
③ 노드 2 링크에 노드 4를 대입(Target->next=New). 노드 4가 노드 2 다음에 위치하도록 연결한다.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Node
{
int value;
Node* next;
};
Node* head;
Node* InsertNode(Node* Target, Node* aNode)
{
// Target은 현재 노드
// aNode는 추가할 노드
Node* New = (Node*)malloc(sizeof(Node));
*New = *aNode; // Temp의 정보가 복사가 됐다.
New->next = Target->next;
Target->next = New;
return New;
}
void main()
{
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
Node* Now;
Node Temp;
Now = head;
for (int i = 0; i < 6; i++)
{
Temp.value = i + 1;
Now = InsertNode(Now, &Temp);
}
for (Now = head->next; Now; Now = Now->next) // Now; : 주소값이 null이 아닐동안 실행. 마지막 주소값은 null이므로.
{
printf("%d\t", Now->value); // \t : 한 tab
}
}