일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Windows API
- 커서
- 버블
- crud
- 셀
- 테트리스
- 구조체
- 알고리즘
- 선택
- C
- 정렬
- 공백
- 구현
- scanf
- 문자열
- 연결리스트
- string
- 3차원 배열
- 난수
- 배열
- 포인터
- C언어
- Time
- 함수
- 이진탐색#binary_search
- 콘솔
- 오목#함수#gotoxy#금수#알고리즘#2차원#배열#실무#프로젝트
- 삽입
- 파일입출력
Archives
- Today
- Total
C언어 알고리즘 정리 및 실무 프로젝트
C언어 연결리스트 구현(포인터에 대한 완벽 이해) 본문
반응형
#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; // 후행 노드가 다음에 삭제될 노드가 된다.
}
}
반응형
'C언어 알고리즘' 카테고리의 다른 글
C언어의 병합정렬 (merge_sort) 알고리즘 (0) | 2022.06.25 |
---|---|
C언어 포인터를 활용한 문자열 관련 함수(strcpy, strcat, strcmp, strncmp, strlen) 직접 구현하기 (4) | 2022.05.20 |
C언어 이중 for문과 배열을 이용한 달팽이 배열 알고리즘 (0) | 2022.05.20 |
rand()를 이용한 로또 추출 알고리즘과 정렬 (0) | 2022.04.20 |
C언어의 선택정렬, 버블정렬, 삽입정렬, 셸 정렬 알고리즘 (Call by Reference 포인터 기능) (2) | 2022.04.20 |
Comments