컴퓨터과학/자료구조&알고리즘
[Data Structure] 연결 리스트 (Linked list)
0802ojw
2024. 1. 15. 19:20
[연결 리스트]
노드라는 구조체로 이루어진 선형자료구조이다.
노드마다 다음 노드의 주소를 가리키고 있는 포인터변수가 존재한다.
메모리 공간상에서 연속적으로 존재하지 않고, 논리적으로만 연속적으로 존재한다.
[배열과의 차이점]
배열(array)와 리스트의 차이점은 메모리 공간을 차지하는 형태이다.
배열은 메모리 공간을 연속적으로 차지 하지만,
연결리스트는 연속적인 메모리 공간을 차지 하지 않는다.
따라서 연결리스트는 순회하는 연산은 시간이 오래걸리지만, 삽입,삭제의 연산이 빠르다.
[c언어 포인터를 사용한 단일 연결리스트 구현]
메모리 동적할당은 ->https://0802ojw.tistory.com/22 참조
구조체는 아직 x ->
포인터 ->
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
// 노드를 구조체로 정의 한다
typedef struct node {
int data;
node* next; //node라는 구조체를 가리키는 포인터 변수 선언
} node;
// 맨앞에 노드 삽입하는 함수
node* insertFront(node* head, int value) {
node* p = (node*)malloc(sizeof(node)); // 메모리 동적할당
p->data = value;
p->next = head;
head = p;
return head;
}
// 맨앞의 노드 제거하는 함수
node* deleteFront(node* head) {
node* removed;
if (head == NULL)return NULL;
removed = head;
head = removed->next;
free(removed);
return head;
}
// 중간에 새로운 노드 삽입
node* Insert(node* head, node* pre, int value) {
node* p = (node*)malloc(sizeof(node));
p->data = value;
p->next = pre->next;
pre->next = p;
return(head);
}
// 중간에 있는 노드 삭제
node* Delete(node* head, node* pre) {
node* removed;
removed = pre->next;
pre->next = removed->next;
free(removed);
return head;
}
// 연결리스트 출력
void Display(node* head) {
for (node* p = head; p != NULL; p = p->next) {
printf("[%d|data:%d,next:%d] -->", p, p->data, p->next);
}
printf("NULL \n");
}
// 메인함수 (테스트)
int main(void)
{
node* head = NULL;
for (int i = 0; i < 5; i++) {
head = insertFront(head, i);
Display(head);
}
for (int i = 0; i < 5; i++) {
head = deleteFront(head);
Display(head);
}
return 0;
}
[출력 결과]
[노드의 삽입과 삭제 원리]
포인터라는 주소를 가리키는 화살표(변수)를
내가 원하는 곳을 가리키게 조작하고
필요하면 할당된 메모리를 삭제하는 과정이다.