728x90
함수에서 공통적으로 포인터를 활용해 Linked list의 모든 정보를 넘겨주는 것을 방지하였다.
pHead는 항상 첫 노드를 가리키고 있으며, 한 노드는 자신의 뒤에 뒤따르는 노드를 포인터로 가리키고 있다.
이런 방식으로 입력되는 데이터를 계속 공간을 확장하여 저장하는 방식이다.
// 20201014_Linked_List.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include <stdio.h>
#include<stdlib.h>
//일반적으로 연결리스트를 접근하려면 반드시 첫 노드를 통해야 한다.
typedef struct node {
int data; //저장하는 겂
struct node* pNext; //다음 노드를 가리킨다.
} Node;
//Function:printLL()
//input: Linked List (헤드포인터)
//output: None
void printLL(Node* pHead) {
Node* ptr = pHead;
int i = 0;
while (ptr != NULL) {
printf("[%d] value : %d\n", i++,ptr->data);
ptr = ptr->pNext;
}
}
//Function:createNode() 힙영역에서 노드 공간을 할당받아 입력받은 값으로 data설정, pNext는 NULL로 설정
//input: value
//output: pointer to the created node
Node* createNode(int val) {
Node* ptr;
ptr = (Node*)malloc(sizeof(Node));
ptr->data = val;
ptr->pNext = NULL;
return ptr;
}
//Function:addHead() 힙영역에서 노드 공간을 할당받아 입력받은 값으로 data설정, pNext는 NULL로 설정
//input: Linked List, Node
//output: None
//side effect: input node is added to the head of the linked list
//함수에서는 포인터를 복사에서 함수 내부에서 활용하는 것이지만 우리는 이런 동작을 원하는 것이 아니다.
//따라서 (포인터)를 포인터로 지명해서 실제 공간에 데이터를 변화시킨다.
void addHead(Node** ppHead, Node* pNewNode) {
//pHead 포인터가 가리키는 값에 pNewNode->Next를 담아준다.
pNewNode->pNext = *ppHead; //#1
//이후 pHead를 pNewNode로 변경해준다.
*ppHead = pNewNode;
}
//이건 내가 만들어본 함수
//굳이 이중 포인터 대신에
//바로 pHead의 주소값을 인자로 받아와
//pNewNode->pNext를 연결해서
//pHead에 다시 담아준다.
//1. (pNewNode) -> (phead)를 만들어준다.
//2. pHead를 1로 치환
//3. 끝!
void addHead_my_way(Node* & pHead, Node* pNewNode) {
//pHead 포인터가 가리키는 값에 pNewNode->Next를 담아준다.
pNewNode->pNext = pHead; //#1
//이후 pHead를 pNewNode로 변경해준다.
pHead = pNewNode;
}
//Function: countLL()
//input: Linked List pointer
//output: the number of nodes in the linked list
int countLL(Node* pHead) {
int i = 1;
Node* ptr = pHead;
while (ptr != NULL) {
i++;
printf("value = %d\n", ptr->data);
ptr = ptr->pNext;
}
return i;
}
int main()
{
Node n1, n2;
//약속, 빈 연결리스트는 헤드포인터 값을 NULL로 한다.
Node* pHead=NULL; //linked list의 첫 노드 (Head)를 가리키기 위한 포인터 변수
//node를 동적으로 할당하는 동작 구현
//이때 할당되는 공간은 heap영역이다.
//heap은 동적 할당에 활용된다.
//pHead = createNode(23);
//pHead->pNext = createNode(23);
for (int i = 0; i < 1000; i++) {
//실제 포인터의 주소값을 전달한다.
addHead(&pHead, createNode(rand()));
}
//addHead_my_way(pHead, createNode(17));
///////////////////
//1교시 내용
/*n1.data = 17;
n1.pNext = &n2;
n2.data = 23;
n2.pNext = NULL;
pHead = &n1;*/
//포인터를 static으로 생성하는 예제를 진행하였다.
/////////////////////////
printLL(pHead);
printf("the number of nodes = %d\n", countLL(pHead));
return 0;
}
'---------개인공부-------- > |시스템 프로그래밍(C++, WIN Api)|' 카테고리의 다른 글
[시스템프로그래밍] thread 이해(sleep, WaitForSingleObject, WaitForMultipleObjects) (0) | 2020.12.09 |
---|---|
[시스템프로그래밍] C Review(구조체, 포인터) (0) | 2020.12.09 |
[시스템프로그래밍] WaitForSingleObject (0) | 2020.12.09 |
[시스템프로그래밍] Kernel Object, Object Handle, States of kernel object (0) | 2020.12.09 |
[시스템프로그래밍] Primary thread, worker thread (0) | 2020.12.09 |