공부도 할겸 C언어로 연결리스트 구현.... 그냥 입력은 맨 처음에 넣는 방법으로 했고... 간단하게 구현해서 코드 읽기도 어렵지 않고, 어떻게 생각하면 부족한 부분이 많은 코드...

연결 리스트 : 일정한 순설르 가지는 데이터 항목들을 표현한느 방법중 하나. 배열과 같은 순차적 표현방법과 달리 데이터 항목의 논리적인 순서만 유지되고 기억장소 내에서는 각 항목들의 임의의 위치를 가지도록 하는 자료구조.


#include <stdio.h>
#include <stdlib.h>
 
 
struct  Node {
    int data;
    Node* next;
};
 
void isnert_node(Node* node, int input_data)    {
 
    Node* newNode = (Node *)malloc(sizeof(Node));
    newNode-&gt;data = input_data;
   
    if(node-&gt;next == NULL)  newNode-&gt;next = NULL;
    else                    newNode-&gt;next = node-&gt;next;
 
    node-&gt;next = newNode;
}
   
 
void delete_node(Node* node, int delete_data)   {
    Node* tmp = (Node* )malloc(sizeof(Node));
    Node* tmp_prev = (Node*) malloc(sizeof(Node));
   
    tmp = node;
    tmp_prev = node;
   
    if(tmp-&gt;next == NULL)   {
        printf("no value ");
        return ;
    }
   
    while(1)    {
        if(tmp-&gt;next == NULL)   {
            printf("no search ");
            return;
        }
        tmp_prev = tmp;
        tmp = tmp-&gt;next;
       
        if(tmp-&gt;data == delete_data)    {
            tmp_prev-&gt;next = tmp-&gt;next;
            free(tmp);
            return ;
        }
    }
   
}
 
void display_node(Node* node)   {
    Node *tmp = node;
   
    printf("[start]");
   
    while(tmp != NULL)  {
        printf(" -&gt; [%d]", tmp-&gt;data);
       
        tmp = tmp-&gt;next;
    }
   
}
 
 
int main()
{
 
    Node* head = (Node* ) malloc(sizeof(Node));
   
    head-&gt;data = 0;
    head-&gt;next = NULL;
   
    int in;
    char _input;
   
    while(1)    {
        printf("[(i)nsert, (d)elete, (p)rint, (q)uit] : ");
        scanf("%c", &amp;_input);
        getchar(); // 엔터 입력
 
        if(_input == 'i')      {
            printf("input number : ");
            scanf("%d", &amp;in);
 
            getchar();
            isnert_node(head, in);
        }
        else if(_input == 'd')      {
            printf("delete number : ");
            scanf("%d", &amp;in);
            getchar();
 
            delete_node(head, in);
        }
        else if(_input == 'p')    display_node(head-&gt;next);
        else if(_input == 'q')    break;
        else                        printf("Invalid input.. ");
        printf(" ");
    }
   
    fflush(stdin);
    free(head);
 
    return 0;   
}


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Comment

#include <iostream>

class A {
public:
    A() {    std::cout << "a create" << std::endl; }
    ~A()    {   std::cout << "a delete" << std::endl; }
};
class B  {
public: 
    B() {    std::cout << "b create" << std::endl; }
    ~B()    {   std::cout << "b delete" << std::endl; }
};
class C : public B {
public: 
    C() {    std::cout << "c create" << std::endl; }
    ~C()    {   std::cout << "c delete" << std::endl; }
};


int main()
{
    
    B* a;
    a = new C();
    
    delete a;
    
    return 0;
    
}
실행 결과
a create
b create
c create
b delete
a delete

기록용...


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Comment

const_cast

const로 선언된 상수를 일반변수로 변환하는데 사용된다. volatile를 변환시키는데도 쓰인다

 

-static_cast

c캐스팅과 비슷한 기본적인 캐스팅 연산자로 실수형, 정수형, 열거형등 기본적인 형변환을 할때 사용된다

const_cast와 달리 일반변수를 상수로 바꿀수있지만 상수를 일반변수로 바꾸진못한다

c캐스팅과의 차이점은 타입체크를 run-time으로 하지않고 compile-time에 정적으로 수행한다

 

-reinterpret_cast

어떠한 정수와 포인터 타입간에도 변환이 가능한 강력한 형변환이다

하지만 기본적인 캐스팅개념에서 벗어나 강제로 바꿔 매우 불안정하기 때문에 쓰려면 위험을 감수해야한다

 

-dynamic_cast

상속관계에있는 클래스간의 형변환을 할때 사용한다

형변환에 문제가없는지 안전검사도하는데 문제가 있을시에는 NULL값을 리턴하거나 예외를 띄운다

가상함수가 없는 클래스는 사용할 수 없다




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Comment



티스토리 툴바