Single Linked List 시작 부분에 데이터 입력하기 (InsertAtHead)

Jaden·2023년 5월 1일
0

시작 부분에 데이터 입력하기

  • 3개의 버전을 나누어 생각한다.
  1. head를 전역변수로 선언하기
  2. head를 main내에 선언하기
  3. head가 main내부에 선언하고 삽입 함수에서 return없이 작성하기

ver1. head를 전역변수로 선언

#include <stdio.h>
#include <stdlib.h>

struct Node_{ 
	int data;
    struct Node_* ptr;
}

typedef struct Node_ Node; //struct Node_를 Node라고 쓰겠다.

Node* head; //전역변수 선언

int main(){
	head = NULL; 
    scanf("%d", &x); //x 입력받기
    insert(x); 
}	

Insert 함수는 다음과 같다.

void Insert(int x){
	Node* tmp = (Node*)malloc(sizeof(Node));
    tmp -> data = x; 
    tmp -> ptr = head;
    head = tmp;
}

main을 따라가며, insert함수를 확인해본다.
먼저 main을 보자.

//main
	head = NULL; 
	//x로 5를 입력한다고 가정
    insert(5); 

head에 null을 할당하며 아래와 같은 모습이 된다.



이제 Insert함수를 자세히 살펴보자.

void insert(int x){
	Node* tmp = (Node*)malloc(sizeof(Node));
    tmp -> data = x;
    tmp -> ptr = head;
    head = tmp;
}

새로운 메모리(200번지)를 할당받고 tmp가 그를 가리킨다.
tmp가 가리키는 200번지의 data에 x를 할당, ptr에 head를 할당하며 tmp가 head를 가리킨다. (즉, head가 가리키는 null을 가리키게 됨)


head에 tmp를 할당하며, head가 200번지를 가리킨다.


함수를 빠져나가고 stack의 tmp가 날라가며 이와 같은 형태가 된다.



insert를 여러번 더 해보자.

insert(x) 3회 호출해본다.
x의 입력 순서는 다음과 같다. [1, 2, 3]

int main(){
	head = NULL; 
    int x, i;
    for(i = 0; i< 3; i++){ //3회 insert
    	scanf("%d", &x); 
	    insert(x);
   	}
}
void insert(int x){
	Node* tmp = (Node*)malloc(sizeof(Node));
    tmp -> data = x; 
    tmp -> ptr = head;
    head = tmp;
}
  • i == 0


  • i == 1

  • i == 2

ver 1 최종

  • 1, 2, 3의 순서로 데이터를 입력함
  • 입력된 데이터는 linked list의 시작 부분에 들어감
  • 따라서 head -> 3 -> 2-> 1 -> null의 순서로 이루어짐

ver2. head를 main 내에 선언하기

  • insert함수의 파라미터에 head를 넘겨줘야 한다.
  • head에 insert함수의 return값을 할당해줘야 한다.
#include <stdio.h>
#include <stdlib.h>

struct Node_{ 
	int data;
	struct Node_* ptr;
}

typedef struct Node_ Node; //struct Node_를 Node라고 쓰겠다.

int main(){
	Node* head = NULL; //main에 선언
	head = Insert(head, 2);
	head = Insert(head, 4);
	head = Insert(head, 6);
}	

Insert함수는 다음과 같다.

Node* Insert(Node* head, int x){
	Node* tmp = (Node*)malloc(sizeof(Node));
	tmp -> data = x;
	tmp -> ptr = NULL;
	if(head != NULL){
		tmp -> ptr = head;
	}
	head = tmp;
	
	return head;
}

ver3. head는 main에서 선언하고 Insert함수에서 return제거하기

#include <stdio.h>
#include <stdlib.h>

struct Node{ 
	int data;
    struct Node_* ptr;
}

typedef struct Node_ Node; 

int main(){
	Node* head = NULL; 
	Insert(&head, 2);
	Insert(&head, 4);
	Insert(&head, 6);
}	

Insert함수는 다음과 같다.

Node* Insert(Node** phead, int x){
	Node* tmp = (Node*)malloc(sizeof(Node));
	tmp -> data = x;
	tmp -> ptr = NULL;
	if((*phead) !== NULL){
		tmp -> ptr = *phead;
		*phead = tmp;
	}
	head = tmp;
}

0개의 댓글