June is Combung

노드 Full 본문

C/동적할당

노드 Full

june__Park 2021. 3. 29. 17:14
#include<stdio.h>

typedef struct node {
	int data;
	struct node* next; //next가 구조체를 받아야하므로. 특정 데이터 뿐만 아니라 다음 것의 주소도 받아야하므로.
}NODE;
void ex01(){
	NODE n1 = {10, NULL}, n2 = {20, NULL}, n3 = {30}, n4 = {40};

	n1.next = &n2;
	n2.next = &n3;
	n3.next = &n4;

	printf("n1의 주소 : %u,  n1.next : %u \n", &n1, n1.next);
	printf("n2의 주소 : %u,  n2.next : %u \n", &n2, n2.next);
	printf("n3의 주소 : %u,  n3.next : %u \n", &n3, n3.next);
	printf("n4의 주소 : %u,  n4.next : %u \n", &n4, n4.next);


	NODE* tmp = &n1;
	// tmp 를 사용하여 4개 노드의 모든 data를 printf() 
	while(tmp){
		printf("data : %d \n" , tmp->data);
		tmp = tmp->next;
	}
}

void main(){
	ex01();
}
#include <stdio.h>
#include <Windows.h>  // exit(), system() 

typedef struct Node {
	int data;
	struct Node* next;
} NODE; 

NODE* head = NULL;

void print_all(){
	NODE* tmp = head;
	while(tmp){
		printf("NODE: %d \n", tmp->data);
		tmp = tmp->next;
	}
}

/*
	init() : NODE를 생성하고, 초기화해준 다음, 그 주소를 return 
		인자값 : int data
		리턴값 : 새 노드의 주소
*/
NODE* init(int data){
	NODE* tmp = (NODE*)malloc(sizeof(NODE));
	tmp->data = data;
	tmp->next = NULL;
	return tmp;
}


/*
	int remove(int data) : 리스트의 data를 찾아, 해당 노드를 삭제 (단, 연결 유지!)
							삭제 성공 : return 1
							삭제 실패 : return 0   (<== 삭제할 원소가 리스트에 없을 때)
*/
int remove(NODE** node, int data){

	if(!*node){
		return 0;
	}

	if((*node)->data == data){
		*node = (*node)->next;

		return 1;
	}
	return remove(&(*node)->next,data);
}


void add(int data){
	NODE** tmp = &head;
	while(*tmp){
		tmp = &(*tmp)->next;
	}
	*tmp = (NODE*)malloc(sizeof(NODE));
	(*tmp)->data = data;
	(*tmp)->next = NULL;
}


void main(){
	int data;
	int select;

	while(1){
		printf("1. 노드 추가\n");
		printf("2. 노드 모두 보기 \n");
		printf("3. 노드 삭제 \n");
		printf("0. 종료하기 \n");
		printf("선택 : "); scanf_s("%d", &select);
		if(select == 1){
			printf("새 노드 : "); scanf_s("%d", &data);
			add(data);
		}
		else if(select == 2){
			printf("--- 노드 리스트 ---\n");
			print_all(); 
		}
		else if(select == 3){
			printf("삭제할 노드 : "); scanf_s("%d", &data);
			if(remove(&head,data)){
				printf("삭제 성공! \n");
			}
			else {
				printf("삭제 실패..\n");
			}
		}
		else if(select == 0){
			printf("프로그램 종료 \n");
			exit(0);   
		}
		else{
			printf("다시 입력하세요.\n");
		}
		system("pause"); 
		system("cls");
	} 
}

'C > 동적할당' 카테고리의 다른 글

학생  (0) 2021.03.29
동적할당과 정적할당  (0) 2021.03.29
노드  (0) 2021.03.29
Comments