언어/기타
2006.03.24 06:00

자료구조 (3) - 링크리스트

조회 수 465 추천 수 2 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
[ 특징 ]
NODE와 LINK로 구분된다.
NODE : 실제의 정보를 가지고 있는 하나의 단위
LINK : 가까운 노드에 대한 위치( 주소 )를 저장하고 있다.
링크리스트는 동적인 자료구조이며, 배열은 정적인 자료구조이다.
장점 : 메모리 공간을 가변적으로 잡아 메모리 효율이 높다. 삽입과 삭제가 용이하다.
단점 : 구현이 어렵다.

[ 형태 ]



[ 메모리 할당 ]
함수 : #include
기능 : size바이트만큼 메모리를 할당하는 기능.
리턴값 : 메모리 블록을 지시하는 포인터를 리턴한다.
할당한 메모리 공간이 없으면 NULL을 리턴한다.
- 사용예
char *name;
name = ( char * )malloc( sizeof ( char ) * 10 );

char형의 크기의 열배만큼을 캐스트연산자를 이용해서 네임에 할당합니다.

[ 노드 구조체 만들기 ]
typedef struct _node {
int data;
struct _node *next
}node;

data가 노드값이며, next는 링크입니다.
 
[ 예제소스 ]
#include
#include
#include
typedef struct _node {
int data;
struct _node *next;
}NODE;
NODE *head, *tail, *pre_node;
void init()
{
head = (NODE *)malloc( sizeof(NODE) );
tail = (NODE *)malloc( sizeof(NODE) );
head->next = tail;
tail->next = tail;
}

초기화를 시킵니다. head와 tail을 만들고 head와 tail의 링크를 tail로 하는거죠. 위의 그림에서 화살표.

void insert( int data )
{
NODE *insert_node = (NODE *)malloc( sizeof(NODE) ); 삽입할 노드를 만듭니다.
NODE *current_node = head;
//tail 바로 앞까지 올수 있도록 한다.
while( current_node->next != tail )
{
current_node = current_node->next;
}

current_node->next = insert_node;
insert_node->next = tail;
insert_node->data = data;
}

삽입은 tail 바로 앞에서 이루어집니다. 그래서 tail을 찾는 것이 필요한거죠. current_node는 포인터구조체이기에 head부터 주소를 받아서 tail까지 while문을 통해 찾아나갑니다. 그리고 current_node의 next가 tail이면 삽입이 이루어질 장소이겠죠. 장소를 찾았으니 tail 바로 앞의 노드가 새로 만든 노드를 next로 삼고, 새로 만든 노드의 next를 tail로 하는거죠. 그림으로 보시면 이와 같습니다.


NODE *find( int index )
{
int count = 0;
NODE *find_node;
pre_node = head;
find_node = pre_node->next;
while( (count != index ) && ( find_node != tail ) )
{
pre_node = pre_node->next;
find_node = pre_node->next;
count++;
}
if( ( find_node == tail ) || ( index != count ) )
find_node = NULL;
return find_node;
}

삭제를 원하는 노드를 위해 그 노드를 찾는 함수입니다. 이를 위해 각 노드는 인덱스번호를 가지게 되는데 이를 이용해 검색을 하죠. 미리 pre_node를 만들어놓고( 선언부에서 ) head부터 카운트를 세면서 카운트가 인덱스와 맞으면 그 노드가 찾으려던 노드가 되는 것입니다. 그리고 결국 카운트를 세도 인덱스를 찾지 못하거나 tail까지 find_node가 가버리면 검색이 안된것이라서 NULL값을 반환합니다.


void print()
{
NODE *print_node;
int count = 0;
print_node = head->next;

while( print_node != tail )
{
printf("%d : %d n", count, print_node->data );
print_node = print_node->next;
count++;
}
}

있는거 다 뱉어내는거죠 ㅡ_ㅡ;

void all_delete()
{
NODE *delete_node;
NODE *temp;

delete_node = head->next;
while( delete_node != tail )
{
temp = delete_node; 
delete_node = delete_node->next;
free( temp ); free함수는 메모리를 해제하는 것입니다.
}
free(head);
free(tail);
}

head 다음부터 tail 앞까지 while문을 돌아 모두 해제하고 마지막에 head와 tail도 해제합니다.

void _delete( int index )
{
NODE *delete_node;
delete_node = find( index );
if( delete_node == NULL )
printf("삭제할 노드가 없습니다n");
else
{
pre_node->next = delete_node->next;
free( delete_node );
printf("%d 노드를 삭제 하였습니다n", index);
}
}
원하는 노드를 삭제합니다.  delete_node에 find함수의 리턴값을 받아서 찾게되죠. 그 후에는 NULL값이 아니라면 free함수를 이용해 해제시키면 됩니다. 그리고 삭제되는 노드의 이전 노드를 삭제되는 노드의 이후 노드에 연결시켜줍니다. fine함수에서 pre_node는 이미 삭제되는 노드의 이전 노드로 설정되어 있죠. 그림으로 보시면 이러합니다.


void main()
{
NODE *temp; 
init();
insert(1);
insert(2);
insert(3);
insert(4);
insert(5);

temp = find(4);
if( temp == NULL )
printf("오버 프로로우n");
else
printf("찾은것 %dn", temp->data );
print();
_delete( 3 );
_delete(1);
_delete(7);
print();
insert(10);
print();
all_delete();
getch();
}

메인함수인데, 여러가지를 실행합니다. 1, 2, 3, 4, 5를 삽입하였고, 인덱스4번을 찾습니다.
인덱스는 0부터 시작하므로 5번째인 5를 찾겠죠. 그리고 3, 1을 삭제하고 7은 없어서 find함수에서 반환값이 NULL이겠죠. 그래서 삭제할 노드가 없다고 나오겠고, 10을 삽입하고 프린트합니다. 실제로 실행해보시면 결과가 이렇게 나올 것입니다. 그리고 all_delete를 이용해 모든 메모리를 해제하고 실행을 종료합니다.

아, 그리고 자료구조는 데이터를 처리하는 방식입니다 ㅡ_ㅡ;

[예제프로그램]    다른 이름으로 저장하세요.




공간이 이글루보다 약간 작아서 그림이 찌그러졌는데 눌러서보세요. 죄송합니다.
?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
844 언어/기타 잠입 게임 아이디어 아르킨 2007.01.07 1302
843 언어/기타 작은 팁하나..전투애니메이션의 픽쳐화! file 윈드 2007.01.31 1572
842 RPG Maker 자질구레팁1] 0.75배속/1.5배속/3배속으로 이벤트를 움직이게 해보자. 파파 곤잘레스 2006.04.18 479
841 언어/기타 자작광석4개 A.M.S 2010.02.07 725
840 언어/기타 자작 시스템 [z]버튼 누르고 상자밀고 끌기 시스템... - 3- file 플레니아 2006.04.25 383
839 언어/기타 자유 게시판에서 한바탕 난리를 보신 분들도 있을 겁니다. file 아란 2006.08.13 911
838 언어/기타 자연스러운 커다란 맵에 스크린샷 나른한지지 2006.01.12 535
837 언어/기타 자바스크립트와 관련해서 참고할 만한 사이트들 3 MARCO 2015.10.04 701
836 언어/기타 자바 기초 로직 ˙ dnajs 2006.09.16 1290
» 언어/기타 자료구조 (3) - 링크리스트 성령의분노 2006.03.24 465
834 언어/기타 자료구조 (2) - Queue[민프레스 강의정리] 성령의분노 2005.12.31 392
833 언어/기타 자료구조 (1) - Stack [민프레스 강의정리] 성령의분노 2005.12.30 549
832 언어/기타 자동 길찾기 기능을 만들어보자 1 file Black-☆ 2010.08.19 3489
831 RPG Maker 자가진화하는 CPU 플레이어 file 니체 2006.05.14 400
830 언어/기타 임시변수 없이 스왑(swap)하기~ 케이코냥이 2006.08.28 1140
829 언어/기타 일정한 장비착용시 HP나 MP가 회복되게 해보자! 어둠의그림자 2005.09.23 624
828 언어/기타 일단 예제를 만들어보십쇼5칸이내로 가면 죽는 시스템 のㅏ②뜨 2005.08.11 350
827 언어/기타 일, 시간, 분, 초 시스템 . 스포아 2006.06.28 868
826 언어/기타 인터넷으로 케메하기 안티테제 2005.06.19 1113
825 언어/기타 인터넷으로 케릭터제작하기[2번에있는거펌] 사토루 2005.08.13 1539
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)