공부,일/c언어
Linked List 구현
fromnothing1
2021. 6. 14. 23:42
Linked List 는 굉장히 유용한 자료 구조이다.
이를 c 언어로 구현한 예제 이다.
각 노드는 다음 노드의 주소를 가지고
자신의 값 (data) 를 가지고 있다 .
첫 노드는 무조건 0 을 data 로 갖는다.
malloc 함수와 free 함수를 써 볼 수 있는 유용한 예제이다.
#include<stdio.h>
#define TRUE 1
#define FALSE 0
typedef struct list_node
{
int data;
struct list_node* next;
}LINKED_LIST;
LINKED_LIST* init_list();// 연결 리스트 초기화
LINKED_LIST* make_node();// 빈 노드 생성
int insert_node(LINKED_LIST*, int, int); // 노드 삽입
int add_node(LINKED_LIST*, int); // 맨끝에 노드 추가
int delete_node(LINKED_LIST*, int); // 노드 1개 삭제
int delete_all(LINKED_LIST*);// 모든 리스트 삭제
void print_list(LINKED_LIST*); // 모든 리스트 출력
LINKED_LIST* init_list()
{
LINKED_LIST* head;
head = make_node();
head->data = 0;
head->next = NULL;
return head;
}
LINKED_LIST* make_node()
{
LINKED_LIST* temp;
temp = (LINKED_LIST*)malloc(sizeof(LINKED_LIST));// 동적 할당
if (!temp)
{
printf("unable to make new node");
return NULL;
}
return temp;
}
int insert_node(LINKED_LIST* list,int data, int key)
{
LINKED_LIST* temp, * p;
if (!list) // 리스트가 없는경우
{
printf("this list is not initialized");
exit(0);
}
p = list;
while (p)
{
if (p->data == key)
{
temp = make_node();
temp->data = data;
temp->next = p->next;
p->next = temp;
break;
}
p = p->next;
}
if (!p)
{
printf("Unable to find the key node by key : %d\n", key);
return FALSE;
}
return TRUE;
}
int add_node(LINKED_LIST* list, int data)
{
LINKED_LIST* p, * temp, * prev=0;
if (!list) // 리스트가 없는경우
{
printf("this list is not initialized");
exit(0);
}
p = list;
while (p)
{
prev = p;
p = p->next;
}
temp = make_node();
if (!temp)
{
printf("Unable to add a new node");
return FALSE;
}
temp->data = data;
temp->next = NULL;
prev->next = temp;
return TRUE;
}
int delete_node(LINKED_LIST* list, int key)
{
LINKED_LIST* p, * prev=0;
if (!list) // 리스트가 없는경우
{
printf("this list is not initialized");
exit(0);
}
p = list;
while (p)
{
if (p->data == key)
{
prev->next = p->next;
free(p);
break;
}
prev = p;
p = p->next;
}
if (!p)
{
printf("Unable to find key node %d", key);
return FALSE;
}
return TRUE;
}
int delete_all(LINKED_LIST* list)
{
LINKED_LIST* p, * prev;
if (!list) // 리스트가 없는경우
{
printf("this list is not initialized");
exit(0);
}
p = list;
while (p)
{
prev = p;
p = prev->next;
free(prev);
}
return TRUE;
}
void print_list(LINKED_LIST* list)
{
LINKED_LIST* p;
if (!list) // 리스트가 없는경우
{
printf("this list is not initialized");
exit(0);
}
p = list->next; //처음 노드는 값을 저장하는 용도가 아님
while (p)
{
if (p->next == NULL)
{
printf("%d \n", p->data);
}
else
{
printf("%d ->", p->data);
}
p = p->next;
}
}
int main()
{
LINKED_LIST* myLIst;
myLIst = init_list();
add_node(myLIst, 100);
print_list(myLIst);
add_node(myLIst, 200);
print_list(myLIst);
add_node(myLIst, 300);
print_list(myLIst);
add_node(myLIst, 400);
print_list(myLIst);
add_node(myLIst, 500);
print_list(myLIst);
insert_node(myLIst, 250, 200);
print_list(myLIst);
delete_node(myLIst, 300);
print_list(myLIst);
delete_all(myLIst);
print_list(myLIst);
return 0;
}