data = GetData(&list, 0); // 1
int GetData(LinkedList* _List, int _Idx); // 2
int GetData(LinkedList* _List, int _Idx) // 3
{
Node* pNode = _List->pHeadNode; // 4
for (int i = 0; i < _Idx; ++i) // 5
{
pNode = pNode->pNext; // 6
}
return pNode->Data; // 7
}
struct Node
{
int Data;
Node* pNext;
Node* pPrevious; // 1
}
struct LinkedList
{
Node* pHeadNode;
Node* pTailNode // 2
int CurCount;
}
LinkedList mylist2 = {}; // 1
PushFront(&mylist2, 10); // 2
PushFront(&mylist2, 20);
PushFront(&mylist2, 30);
PushFront(&mylist2, 40);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
data = GetData(&mylist2, 4); // 9
void PushFront(LinkedList* _List, int _Data) // 3
int GetData(LinkedList* _List, int _Idx)
{
assert(!(_List->CurCount <= _Idx)); // 10
Node* pNode = _List->pHeadNode;
for (int i = 0; i < _Idx; ++i)
{
pNode = pNode->pNext;
}
return pNode->Data;
}
void PushFront(LinkedList* _List, int _Data) // 3
{
Node* pNewNode = (Node*)malloc(sizeof(Node)); // 4
pNewNode->Data = _Data; // 5
pNewNode->pNext = _List->pHeadNode; // 6
_List->pHeadNode = pNewNode; // 7
_List->CurCount++; // 8
}
LinkedList mylist2 = {};
PushBack(&mylist2, 10);
PushBack(&mylist2, 20);
PushBack(&mylist2, 30);
PushBack(&mylist2, 40);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
//data = GetData(&mylist2, 4);
Reverse(&mylist2);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
// PushBack과 GetData는 이미 선언되있다고 가정
void Reverse(LinkedList* _List);
// PushBack과 GetData는 이미 구현부분 생략.
void Reverse_Re(Node* _Node, LinkedList* _List)
{
if (nullptr != _Node->pNext) // 2
{
bool bHead = false;
if (_Node == _List->pHeadNode)
{
bHead = true;
}
Reverse_Re(_Node->pNext, _List); // 2
_Node->pNext->pNext = _Node; // 4
if (bHead) // 5
{
_Node->pNext = nullptr; // 5
}
}
else
{
_List->pHeadNode = _Node; // 3
}
}
void Reverse(LinkedList* _List)
{
Reverse_Re(_List->pHeadNode, _List); // 1
}
LinkedList mylist = {};
PushBack(&mylist, 10);
PushBack(&mylist, 20);
PushBack(&mylist, 30);
data = GetData(&mylist, 0);
data = GetData(&mylist, 1);
data = GetData(&mylist, 2);
// 메모리 해제.
Release(&mylist);
LinkedList mylist2 = {};
PushBack(&mylist2, 10);
PushBack(&mylist2, 20);
PushBack(&mylist2, 30);
PushBack(&mylist2, 40);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
Reverse(&mylist2);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
// 메모리 해제
Release(&mylist2);
void Release(LinkedList* _List);
void Release(LinkedList* _List)
{
Node* pNode = _List->pHeadNode; // 1
while(pNode) // 2
{
Node* pTemp = pNode->pNext; // 3
free(pNdoe); // 4
pNode->pTemp; // 5
}
}
void InsertionSort(int* _Arr, int _Count)
{
for (int j = 1; j < _Count; ++j)
{
int Temp = _Arr[j];
for (int i = j - 1; 0 <= i; --i)
{
if (Temp < _Arr[i])
{
_Arr[i + 1] = _Arr[i];
// 끝자리 위치를 가면 넣어버리깅.
if (i == 0)
{
_Arr[i] = Temp;
}
}
else
{
_Arr[i + 1] = Temp;
break;
}
}
}
}
void InsertionSort(int* _Arr, int _Count)
{
for (int j = 1; j < _Count; ++j)
{
int Temp = _Arr[j]; // 1
int i = j - 1;
for (; 0 <= i; --i) // 2
{
if (Temp < _Arr[i])
{
_Arr[i + 1] = _Arr[i];
}
else
{
break;
}
}
_Arr[i + 1] = Temp;
}
}
#include <iostream>
#include <vector>
#include <list>
#include <map>
using namespace std;
#include "DArr.h"
#include "LinkedList.h"
void InsertionSort(int* _Arr, int _Count)
{
for (int j = 1; j < _Count; ++j)
{
int Temp = _Arr[j];
int i = j - 1;
for (; 0 <= i; --i)
{
if (Temp < _Arr[i])
{
_Arr[i + 1] = _Arr[i];
}
else
{
break;
}
}
_Arr[i + 1] = Temp;
}
}
int main()
{
int iArr[100] = {};
DArr arr1 = {};
DArr arr2 = {};
DArr arr3 = {};
DArr arr4 = {};
InitDArr(&arr1);
PushData(&arr1, 10);
PushData(&arr1, 20);
PushData(&arr1, 30);
PushData(&arr1, 40);
PushData(&arr1, 50);
int data = 0;
for (int i = 0; i < arr1.CurCount; ++i)
{
data = GetData(&arr1, i);
}
// data = GetData(&arr1, 5);
free(arr1.pData);
// 연결형 리스트
LinkedList mylist = {};
PushBack(&mylist, 10);
PushBack(&mylist, 20);
PushBack(&mylist, 30);
data = GetData(&mylist, 0);
data = GetData(&mylist, 1);
data = GetData(&mylist, 2);
Release(&mylist);
LinkedList mylist2 = {};
PushBack(&mylist2, 10);
PushBack(&mylist2, 20);
PushBack(&mylist2, 30);
PushBack(&mylist2, 40);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
//data = GetData(&mylist2, 4);
Reverse(&mylist2);
data = GetData(&mylist2, 0);
data = GetData(&mylist2, 1);
data = GetData(&mylist2, 2);
data = GetData(&mylist2, 3);
Release(&mylist2);
// 삽입 정렬
int Arr[4] = { 16, 4, 22, 7 };
InsertionSort(Arr, 4);
return 0;
}
#pragma once
// 연결형 리스트
struct Node
{
int Data;
Node* pNext;
};
struct LinkedList
{
Node* pHeadNode;
int CurCount;
};
void PushBack(LinkedList* _List, int _Data);
int GetData(LinkedList* _List, int _Idx);
void Reverse(LinkedList* _List);
void PushFront(LinkedList* _List, int _Data);
void Release(LinkedList* _List);
#include "LinkedList.h"
#include <iostream>
#include <assert.h>
void PushBack(LinkedList* _List, int _Data)
{
// 입력된 데이터를 저장할 새로운 노드를 할당받고, 입력된 데이터를 노드안에 복사한다.
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->Data = _Data;
pNewNode->pNext = nullptr;
// 만약 리스트에 입력되는 데이터가 처음이라면
if (nullptr == _List->pHeadNode)
{
_List->pHeadNode = pNewNode;
}
// 리스트에 입력된 데이터가 1개 이상이라면
else
{
// 1. 리스트가 보유한 노드 중, 가장 마지막 노드를 찾는다.
Node* pNode = _List->pHeadNode;
/*while (true)
{
pNode = pNode->pNext;
if (nullptr == pNode->pNext)
break;
}*/
while (pNode->pNext) { pNode = pNode->pNext; }
// 2 . 찾은 노드의 pNext 를 현재 생성된 노드를 가리킨다(연결)
pNode->pNext = pNewNode;
}
// 데이터 카운트를 1 증가시킨다.
_List->CurCount++;
}
int GetData(LinkedList* _List, int _Idx)
{
// 리스트에 입력된 데이터 개수 이상의 인덱스를 지정한 경우
assert(!(_List->CurCount <= _Idx));
Node* pNode = _List->pHeadNode;
for (int i = 0; i < _Idx; ++i)
{
pNode = pNode->pNext;
}
return pNode->Data;
}
void PushFront(LinkedList* _List, int _Data)
{
// 1. 입력된 데이터를 저장할 노드 1개 만큼의 메모리를 동적할당 한다.
// 입력된 데이터를 해당 노드안에 복사한다.
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->Data = _Data;
// 2. 새로 생성된 노드가 가정 처음이 되어야 하니까, 리스트가 헤드포인터로 해당 노드를 가리킨다.
pNewNode->pNext = _List->pHeadNode;
_List->pHeadNode = pNewNode;
// 3. 데이터 카운트 증가
_List->CurCount++;
}
void Release(LinkedList* _List)
{
Node* pNode = _List->pHeadNode;
while (pNode)
{
Node* pTemp = pNode->pNext;
free(pNode);
pNode = pTemp;
}
}
// 재귀 함수
void Reverse_Re(Node* _Node, LinkedList* _List)
{
if (nullptr != _Node->pNext)
{
bool bHead = false;
if (_Node == _List->pHeadNode)
bHead = true;
Reverse_Re(_Node->pNext, _List);
_Node->pNext->pNext = _Node;
if (bHead)
_Node->pNext = nullptr;
}
else
{
// _Node 가 가리키고 있는 노드가 현재 가장 마지막 노드이다.
_List->pHeadNode = _Node;
}
}
void Reverse(LinkedList* _List)
{
Reverse_Re(_List->pHeadNode, _List);
//Node* pNode = _List->pHeadNode;
//while (pNode->pNext)
//{
// pNode = pNode->pNext;
//}
//pNode->pNext = nullptr;
}
1차 23.12.20
2차 23.12.21
3차 23.12.22
4차 23.12.25
5차 23.12.26
6차 24.01.02