티스토리 뷰
안녕하세요 ! 우디입니다.🚀
오늘은 단순 연결 리스트 (Singly Linked List)에 대해 알아봅시다 !
단순 연결 리스트 ( Singly Linked List )란 ?
하나의 방향으로만 연결된 리스트 이다 .
단순 연결 리스트 ( Singly Linked List ) 구조

하나의 노드는 데이터 필드 ( data field ) + 링크 필드 ( link field ) 로 구성되 있다.
헤드 포인터 ( head pointer )
첫번째 노드를 가르키는 포인터를 말한다.

연결리스트에 접근하기 위해 헤드 포인터 즉, 첫번째 노드를 가르키는 포인터 값만 알면 리스트 안의 모드 노드에 접근이 가능하다.
단순 연결 리스트 ( Singly Linked List ) 구현
구조체를 이용해 데이터 필드와 링크 필드를 만들어 준다.
여기서 주의해야 할 건 링크 필드는 다음 노드의 주소가 들어가기 때문에 구조체 포인터를 사용한다.
xxxxxxxxxxtypedef int element; // 나중에 형변환 할때 유용하다typedef struct ListNode{ element data; //데이터 필드 struct ListNode *link; //링크 필드}ListNode;
삽입
x
void insert_node(ListNode **phead, ListNode *p, ListNode *new_node);- phead : 헤드 포인터 (head) 에 대한 포인터 ( 여기에 head의 주소가 담긴다. )
- p : 삽입될 위치의 선행노드를 가르키는 포인터 ( p 노드 다음에 삽입된다 . )
- new_node : 새로운 노드를 가르키는 포인터
: head가 NULL 이라면 현재 삽입하려는 노드가 첫번째 노드가 된다. 따라서 head 값만 변경하면 된다.

: new_node 를 리스트의 맨 앞에 삽입한다.

- head 와 p 가 NULL 이 아닌 경우
: 가장 일반적인 경우이다.

< Total >
xxxxxxxxxxvoid insert_node(ListNode **phead, ListNode *p, ListNode *new_node){ if(*phead == NULL) { new_node->link = NULL; *phead = new_node; } else if(p == NULL) { new_node->link = *phead; *phead = new_node; } else { new_node->link = p->link; p->link = new_node; }}
삭제
x
void remove_node(ListNode **phead, ListNode *p, ListNode *removed);- phead : 헤드 포인터 (head) 에 대한 포인터 ( 여기에 head의 주소가 담긴다. )
- p : 삭제될 위치의 선행노드를 가르키는 포인터 ( p 노드 다음에 삭제된다 . )
- removed : 삭제될 노드를 가르키는 포인터 ( ❗❗ 노드를 동적할당 받았으면 반드시 삭제할 노드는 연결리스트 변경 후 메모리 해제시켜주기❗❗ )
: 연결리스트의 첫번째 노드를 삭제한다.

: 가장 일반적인 경우

< Total >
x
void remove_node(ListNode **phead, ListNode *p, ListNode *removed);{ if(p == NULL) *phead = *phead->link; else p->link = removed->link; free(removed);//노드 삭제할 때 노드를 동적할당으로 받았으면 반드시 메모리 해제 ! //메모리 해제를 안해주면 메모리 누수가 생김 !}
역순
xxxxxxxxxxListNode *reverse_node(ListNode *head){ ListNode *r,*q,*p;//r이 q를 q가 p를 따라감 p = head; q = NULL; while(p!=NULL) { r = q; q = p; p = p->link; q->link = r;//q의 link를 전의 r의 노드로 바꿔줌 (역순 생성) } return q;//p가 아닌 이유는 p가 while문 안에서 NULL로 되고 빠져나오기 때문에 //q를 return 해준다. ( 역순이니 q가 head가 되는 거다.)}
탐색
x
ListNode *search_node(ListNode *head , int x )//x는 찾고자 하는 데이터{ ListNode *p = head;//굳이 또 해주는 이유는 head를 이용하면 head값이 변경됨. while(p!=NULL) { if(p->data == x) return(p); p=p->link; } return (p);//NULL}
출력
x
void display_node(ListNode *head){ ListNode *p = head; while(p!=NULL) { printf("%d -> ",p->data); p=p->link; }}
노드 동적 생성 , 삽입, 삭제 , 초기화 , 역순 , 탐색 , 출력
// strcpy 컴파일 에러 방지typedef int element;typedef struct ListNode { element data; struct ListNode *link;}ListNode;ListNode *create_node(element data, ListNode *link){ ListNode *new_node; new_node = (ListNode *)malloc(sizeof(ListNode)); new_node->data = data; new_node->link = link; return new_node;}//노드 동적 생성void init_node(ListNode **phead){ *phead = NULL;}//초기화void insert_node(ListNode **phead, ListNode *p, ListNode *new_node){ if (*phead == NULL) { new_node->link = NULL; *phead = new_node; } else if (p == NULL) { new_node->link = *phead; *phead = new_node; } else { new_node->link = p->link; p->link = new_node; }}void remove_node(ListNode **phead, ListNode *p, ListNode *removed){ if (p== NULL) { *phead = (*phead)->link; } else { p->link = removed->link; } free(removed);}void display_node(ListNode *head){ ListNode *p; p = head; while (p != NULL) { printf("%d -> ", p->data); p = p->link; } printf("\n");}ListNode *search_node(ListNode *head, int x){ ListNode *p = head; while (p != NULL) { if (p->data == x) return p; p = p->link; } return p;}ListNode *reverse(ListNode *head){ ListNode *p, *q, *r; p = head; q = NULL; r = NULL; while (p != NULL) { r = q; q = p; p = p->link; q->link = r; } return q;}int main(){ ListNode *head = NULL; insert_node(&head, NULL, create_node(10, NULL)); insert_node(&head, NULL, create_node(20, NULL)); insert_node(&head, NULL, create_node(30, NULL)); display_node(head);//30->20->10 init_node(&head); display_node(head);//NULL insert_node(&head, NULL, create_node(10, NULL)); insert_node(&head, NULL, create_node(20, NULL)); insert_node(&head, NULL, create_node(30, NULL)); remove_node(&head, search_node(head, 30), search_node(head, 20)); display_node(head);//30->10 head=reverse(head); display_node(head);//10->30}
'Programming > 자료구조' 카테고리의 다른 글
| [c/c++] 스택 ( Stack ) (2) | 2020.11.23 |
|---|---|
| [c/c++] 이중 연결 리스트 ( Doubly Linked List ) (0) | 2020.11.05 |
| [c/c++] 원형 연결 리스트 ( Circular Linked List ) (0) | 2020.11.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- iT#it#백준#시험감독#코로나#이겨내요#대한민국#화이팅
- it#일상#코로나#그만#백준#알고리즘#안드로이드#개발자
- 백준#알고리즘#코로나#IT#구슬탈출2#13460#공부#개인공부#독학#노력
- IT#백준#연구소#DFS
- IT#it#삼성#백준#경사로#코로나#화이팅
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
글 보관함
