C언어 알고리즘 정리 및 실무 프로젝트

C언어 연결리스트 구현(포인터에 대한 완벽 이해) 본문

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;		//	후행 노드가 다음에 삭제될 노드가 된다.
	}

}
반응형
Comments