C언어 알고리즘
C언어 연결리스트 구현(포인터에 대한 완벽 이해)
C's everything!
2022. 4. 20. 21:30
반응형
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef int Data;
typedef struct node {
Data data;
struct node* link;
}node;
node *insert_node(node* head, node* pre, Data data); // 노드 삽입
node *delete_node(node* head, node* pre, node * del); // 노드 삭제
void view_all(node * list); // 모든 노드 출력
void delete_all(node *list); // 모든 노드 삭제
int main() {
Data data;
node *list = NULL;
while (1) {
printf("데이터 입력:(종료:-1)");
scanf("%d", &data);
if (data == -1) break;
list = insert_node(list,NULL,data); // 맨 처음에 새로운 노드가 추가되면 그 노드는 가리킬 값이 없으므로 NULL값이 할당되어야 한다.
}
view_all(list);
delete_all(list);
return 0;
}
node* insert_node(node* head, node* pre, Data data)
// 매개변수 1: 헤드 포인터, 매개변수 2: 삽입될 노드의 이전 위치에 있던 노드 포인터 , 매개변수 3: 새로운 노드에 추가될 데이터
{
node *p_new = (node*)malloc(sizeof(node)); // 삽입될 노드에 메모리 동적 할당
p_new->data = data; // node 포인터형 변수가 멤버를 참조하기 위해 -> 연산자를 써야 한다.
if (pre == NULL) // 이전 노드가 없는 경우 (p_new가 첫 노드인경우)
{
p_new->link = head; // 삽입된 노드가 첫 노드이므로, 뒤에 참조할 노드가 없기 때문에 link는 NULL을 가리킨다.
head = p_new; // 새로운 노드가 첫 노드가 되었기 때문에, head포인터는 첫 노드를 가리킨다.
}
else
{
p_new->link = pre->link; // 이전 노드 뒤에 새로운 노드가 삽입되므로, 새로운 노드의 링크에 이전 노드가 가리키던 포인터를 넣어준다.
pre->link = p_new; // 이전 노드 뒤에 새로운 노드가 삽입되므로, 이전 노드는 새로운 노드를 가리킨다.
}
return head; // 맨 앞에 새로운 노드가 삽입되면 그 값이 head 포인터이다.
}
node* delete_node(node* head, node* pre, node * del)
{ // 매개변수 1: 헤드 포인터, 매개변수 2: 삭제될 노드의 이전 위치에 있던 노드 포인터 , 매개변수 3: 삭제될 노드
if (pre == NULL) { // 이전 노드가 없는 경우, (삭제될 노드(del)가 첫 노드인 경우)
head = del->link; // 첫 노드가 삭제되므로, 첫 노드가 가리키던 NULL을 head에 할당한다.
}
else {
pre->link = del->link; // 노드가 삭제되므로, 그 노드가 가리키던 링크를 이전 노드가 물려받아야 한다.
}
free(del); // 해당 노드에 할당된 메모리를 비운다.
return head; // 맨 앞의 노드가 삭제된 후, NULL을 가리키는 head를 반환한다.
}
void view_all(node * list) // (모든 노드 출력)
{
node *view = list; // 첫 노드를 view에 할당
while (view != NULL) { // 처음부터 NULL이거나 마지막 노드를 만날 때까지 반복 출력
printf("%d ", view->data); // view가 가리키는 데이터 필드 출력
view = view->link; // view에 view가 가리키는 다음 노드의 링크를 대입
}
printf("\n");
}
void delete_all(node *list) // (모든 노드 삭제)
{
node *p = list; // 첫 노드를 p에 대입
node *next; // 다음 노드를 저장할 변수
while (p != NULL) { // 처음부터 NULL이거나 마지막 노드를 만날 때까지 계속 삭제
next = p->link; // next에 선행 노드의 링크(후행노드)를 대입한다.
free(p); // 선행 노드의 메모리를 비움.
p = next; // 후행 노드가 다음에 삭제될 노드가 된다.
}
}
반응형