본문 바로가기

Programming

연결리스트

● 연결리스트

구조체의 멤버 안에 자기자신과 같은 노드를  가리키는 주소를 가지고 있어야 한다.   -> 자기 참조 구조체
헤드노드라고 부르는 첫 번째 노드의 포인터가 중요하다.

typedef struct list_node *list_pointer;
struct list_node {
    char data[5];
    list_pointer link;
};
list_pointer ptr = NULL;


① 노드 삽입
void append(simple_pointer ptr, simple_pointer inode)
{   
    simple_pointer before;

    while ( ptr != NULL ) {
        before = ptr;
        ptr = ptr -> next;
    }
    before -> next = inode;
    inode -> next = NULL;
}
 
② 리스트 출력
void print_list(simple_pointer ptr)
{
    printf("The single linked list contains : \n");
    while ( ptr != NULL ) {   
        printf("%s : %d\n", ptr->state, ptr->count);
        ptr = ptr -> next;
    }
}

● 원형 연결 리스트

단순 연결 리스트의 마지막 노드의 포인터는 NULL이었다. 이 링크를 사용하기 위하여 마지막 노드의 포인터를 NULL이 아닌 첫 번째 노드(head node)의 주소를 가리키도록 할 때, 이 리스트를 원형 연결 리스트라고 한다.

-어느 하나의 노드로부터 다른 모든 노드로 접근이 가능하다.
-리스트의 하나의 노드를 찾을 때, 무한 루프에 빠질 염려가 있다.
-마지막 노드를 가리킴으로써 리스트의 앞이나 뒤에 노드를 삽입할 수 있다.

① 길이 계산
int length(list_pointer ptr)
{
    list_pointer temp;
    int count = 0;
    if (ptr) {
        temp = ptr;
        do {
            count++;
            temp = temp -> link;                    <--> print 소스로 변경하면 출력
        } while(temp != ptr);
    }
    return count;
}
 

② 노드 삽입 ( front )
void insert_front(npointer node)
{
    if (!ptr) {
        ptr = node;
        node -> link = node;
    } else {
        node -> link = ptr -> link;                            
        ptr -> link = node;                         <--->  ptr = node 를 추가하면 후방삽입 개념
    }
}

● 이중 연결 리스트

단순 연결 리스트는 단지 링크의 방향으로만 쉽게 이동할 수 있다는 제한점이 있다.
따라서, 삭제와 같은 연산과 같은 포인터를 양방향으로 이동해야 할 필요가 있는 문제에 대해서는,
이중 연결 리스트를 사용하는 것이 편리하다.

typedef struct node *node_pointer;
struct node {
    node_pointer llink;
    element item;
    node_pointer rlink;
};
아래 공식이 성립
ptr  =  ptr -> llink -> rlink  =  ptr -> rlink -> llink    



① 노드 삽입
void dinsert(node_pointer node, node_pointer newnode)
{
    newnode -> llink = node;
    newnode -> rlink = node -> rlink;
    node -> rlink -> llink = newnode;
    node -> rlink = newnode;
}

② 노드 삭제
void ddelete(node_pointer node, node_pointer deleted)
{
    if (node == deleted)
        printf("Deletion of head node not permitted. \n");
    else {
        deleted -> llink -> rlink = deleted -> rlink;
        deleted -> rlink -> llink = deleted -> llink;
        free(deleted);
    }
}

'Programming' 카테고리의 다른 글

재귀함수 관련 알고리즘  (0) 2015.01.15
그래프  (0) 2015.01.11
트리(tree)  (0) 2015.01.10
순차리스트  (0) 2015.01.10
자료구조/알고리즘 개념정리  (0) 2015.01.09