C++/공부 정리

연결리스트 삽입, 그래프(인접행렬과 인접리스트)

sondiaa 2021. 10. 25. 17:57

문자 입력받고 해당 문자 뒤에 삽입하기

#include <iostream>
using namespace std;
struct Node{
    char a;
    Node *next;
};
Node *head;

void init(char a)
{
    head = new Node({a, head});
}

void insert(char a)
{
    for(Node *q= head; q != NULL; q =  q->next)
    {
        if(q->a == a)
        {
            Node *temp = new Node({'Z', NULL});
            temp->next = q->next;
            q->next = temp;
        }
        if(q->next == NULL)
            break;
    }
}
void print()
{
    for(Node *p = head; p != NULL; p = p->next)
    {
      
        cout << p->a << ' ' ;
        if(p->next == NULL)
            break;
    }
}
int main()
{
    char fi;
    cin >> fi;

    init('F');
    init('E');
    init('D');
    init('C');
    init('B');
    init('A');
    insert(fi);
    print();
    return 0;
}

특정 노드 삭제하는 함수

void del(char a)
{
    
    if(head->a == a)
    {
        Node *temp = head->next;
        delete head;
        head = temp;
        return;
    }
    Node *p;
    for(p = head; p != NULL; p= p->next)
    {
        if(p->next == NULL) return;
        if(p->next->a == a)
            break;
    }
    p->next = p->next->next;
        
}

 

우선 delet의 경우 2가지로 나눠서 생각해야 한다.

head->a가 삭제할 노드라면 바로 삭제한다. 그러나 그 뒤의 노드라면 탐색을 진행해야 한다. 하지만 이전 노드를 통해 탐색해야 삭제를 진행할 수 있기에 if(p->next->a)를 사용하였다. 

 

삭제의 경우 메모리를 할당하지 않는 경우가 있는데 꼭 할당 해제 습관을 들이자

 

 

노드 위치 바꾸기

void switchs(char what, char where)
{
    for(Node *p = head; p != NULL; p = p->next)
    {
        
        
        if(p->a == where)
        {
            temp.next = p->next;
            p->next = &temp;
        }
        if(p->next == NULL) break;
    }
}


int find(char a)
{
    if(head->a == a)
    {
        temp.a = head->a;
        head = head->next;
    }
    Node *q;
    for(q = head; q != NULL; q= q->next)
    {
        if(q->next == NULL) return 0;
        if(q->next->a == a) break;
    }
    temp.a = q->next->a;
    q->next = q->next->next;
    return 1;
}

 

 

그래프는 인접리스트와 인접행렬로 나타낼 수 있다.

인접 리스트로 그래프 표현

#include <iostream>
using namespace std;
struct Node{
    int x;
    Node *next;
};
Node *head[4], *tail[4];

void addNode(int from, int a)
{
    if(head[from] == NULL)
    {
        tail[from] = head[from] = new Node({a, head[from]});
        return;
    }
    tail[from] = tail[from]->next = new Node({a, NULL});
    
}
int main()
{
    addNode(0, 1);
    addNode(0, 3);
    addNode(0, 2);
    addNode(1, 3);
    addNode(2, 3);
    
    int debug = 1;
    return 0;
}

인접행렬로 표현하기

#include <iostream>
using namespace std;
int map[4][4] = {
    0, 1, 1, 1,
    0, 0, 0, 1,
    0, 0, 0, 1,
    0, 0, 0, 0
};

int main()
{
    int max_cnt = -21e8,maxIndex = -1;
    for(int i=0; i<4; i++)
    {
        int cnt = 0;
        for(int j=0; j<4; j++)
        {
            if(map[i][j] == 1)
                cnt++;
        }
        if(max_cnt < cnt)
        {
            max_cnt = cnt;
            maxIndex = i;
        }
    }
    cout << maxIndex;
    return 0;
}