목록2024/03 (32)
Minwoo Dev.
이전 코드를 바탕으로 노드를 삭제하는 함수를 작성하겠다. 고려해야 할 사항은 아래와 같다. 원래 노드가 빈 노드인 경우 삭제해야할 값이 첫번째 노드인 경우 삭제해야할 값이 중간에 있는 노드인 경우 삭제해야할 값이 마지막 노드인 경우 void deleteNode(Node **head, int data) { if (*head == NULL) // 원래 노드가 빈 노드인 경우(삭제할 값이 없음) { printf("빈 연결리스트입니다. \n"); return; } Node *cur = *head; if (cur->data == data) // 첫 노드가 삭제할 노드인 경우 { *head = cur->link; // head 노드를 한칸 옮김(노드 삭제) free(cur); // 할당 해제 return; } No..
단일 연결리스트를 사용하기 위해 우선 구조체를 정의해준다. typedef struct _node { int data; struct _node *link; } Node; 그리고 값을 입력하면 그 값을 연결리스트에 넣어주는 함수를 작성하겠다. 함수는 아래의 경우로 나눠질 것이다. 연결리스트에 아무 값도 들어있지 않은 상태(NULL 상태) 연결리스트에 값이 들어있는 상태 위 조건을 참고하여 AddNode함수를 작성해보겠다. void AddNode(Node **head, int val) // main에서 head를 가져오므로 더블포인터(**) 사용! { Node *newnode = (Node *)malloc(sizeof(Node)); // 새로운 노드 생성! newnode->data = val; // 값 넣기 ..
연결 리스트(Linked List) 연결 리스트는 data와 link로 이루어진 여러 개의 묶음이 이어져있는 형태이다. 연결리스트를 사용하기 위해, C언어 기준으로 우리는 구조체를 사용한다. typedef struct _node { int data; // 데이터를 저장하는 변수 struct _node *link; // 다음 노드를 가리킬 링크 } Node; 기본적으로 위의 형태와 같이 작성한다. data는 사용자의 필요에 따라 int형 값이 아닌 다른 변수형으로 선언해도 무방하다. 그리고 다음 노드와의 연결을 위한 link 가 필요한데, 이 link는 우리가 선언한 구조체를 그대로 자료형으로 사용하여 포인터 형식으로 선언한다. 말 그대로 다음 노드를 "가리키는" 것이 목적이기 때문에 포인터 변수로 선언한..
문제 더미 노드의 유무에 따른 코드의 변화를 직접 경험하는 것은 코드의 이해력을 높이는 데 도움이 된다. 그래서 LinkedRead.c에서 생성하는 연결 리스트에 더미 노드를 추가하고, 그에 따른 코드의 변화를 직접 확인하기로 하겠다. 이 예제는 리스트의 끝에다가 노드를 추가하는 방식이므로 head 와 tail 이 모두 필요하다. 조건에 맞게 코드를 수정하라. LinkedRead.c #include #include typedef struct _node { int data; struct _node *next; } Node; int main(void) { Node *head = NULL; Node *tail = NULL; Node *cur = NULL; Node *newNode = NULL; int read..
문제 예제 LinkedRead.c 에 익숙해지는 가장 빠르고도 흥미로운 길은 예제를 조금 수정해 보는 것이다. 따라서 예제를 조금 수정해 볼 기회를 제공하고자 한다. 예제 수정을 위한 주제는 다음과 같다. 새 노드를 연결 리스트의 꼬리가 아닌 머리에 추가한다. LinkedRead.c #include #include typedef struct _node { int data; struct _node *next; } Node; int main(void) { Node *head = NULL; Node *tail = NULL; Node *cur = NULL; Node *newNode = NULL; int readData; while (1) { printf("자연수 입력 : "); scanf("%d", &readD..
this C++에서 this는 해당 객체 자체를 참조하는 포인터이다. 객체 내에서 본인이 가지고 있는 멤버변수나 멤버 함수에 접근하기 위하여 this를 많이 사용한다. #include using namespace std; class Score { private: int schoolNum; int score; public: Score(int schoolNum, int score) { this->schoolNum = schoolNum; // this 사용!! this->score = score; // this 사용!! } void showInfo() { cout score = score; } void showInfo() { cout
객체 포인터 배열 클래스를 이용하여 객체를 생성할 때, 배열의 형태로도 생성할 수 있다. MyClass myclass[4]; // MyClass라는 클래스로 생성한 객체 배열 myclass 위처럼 MyClass 클래스를 이용하여 myclass라는 객체를 배열의 형태로 생성할 수 있다. 예제 코드를 보자. #include #include using namespace std; class MyFamily { private: char *name; int age; public: MyFamily(char *_name, int _age) // 생성자 { name = _name; age = _age; } MyFamily() // 생성자 { name = NULL; age = 0; } void ShowInfo() { cout
소멸자(Destructor) 생성자가 객체의 생성과 함께 호출되는 것이었다면 소멸자는 객체의 소멸과 함께 호출되는 함수이다. 생성자의 이름이 클래스의 이름과 같아야 했던 것과 똑같이, 소멸자의 이름도 클래스의 이름과 동일해야 한다. 다른 점이라면 앞에"~" 가 붙는다는 것이다. ~클래스이름(){ 객체가 소멸될 때 실행할 코드 } ~생성자 이름() 과 같은 형식으로 소멸자를 선언한다. #include using namespace std; class Myclass { private: char *name; int score = 0; public: Myclass(char *username, int _score) { int len = strlen(username) + 1; name = new char[len]; ..
this 객체지향 프로그래밍을 할 때, 클래스 내부의 메서드에서 내부변수에 접근할 때 사용한다. package test; public class classEx { int num; void addNum(int num) { num += num; } void showNum(){ System.out.println("num = "+num); } } 위와 같이 클래스 내부에 num이라는 내부변수가 존재하는데, addNum이라는 메서드에서 매개변수로 받아온 num을 내부변수의 num에 저장하고 싶다. 두 변수의 이름이 같다. 따라서 그냥 위처럼 작성하고 실행한다면 package test; public class classMain { public static void main(String[] args) { classE..
Java 는 기본적으로 객체지향 프로그래밍 언어이다. 객체지향 프로그래밍(OOP, Object-Oriented Programming) 클래스라는 묶음 안에 해당 프로그램의 속성(변수)와 기능(함수)를 넣어두고 사용하는 프로그래밍 방식이다. 강아지라는 동물에 대해서 특징을 생각해 보자. 속성, 즉 수치로 나타낼 수 있는 값은 키, 배고픈 정도, 이름 등등이 있을 것이고, 할 수 있는 행동(기능)은 짖기, 소개하기, 밥달라하기가 있을 것이다. 아래 코드를 보자, 우리가 기본적으로 사용하는 방식인 절차지향 프로그래밍이다. package test; public class DogWithoutOop { public static void main(String[] args) { int height = 50; Strin..