반응형
//**************************************************************
//  연결리스트 !! 
//**************************************************************
//  데이타를 갖는 노드를 포인터를 통해 연결하여 순차적인 선형 자료구조 !! 

// 배열 --> 연접리스트

// 물리적으로 떨어져있는 데이타들을 링크( 포인터)를 통해 연결하여 논리적인
// 선형 구조를 갖게한다 !! 
//                       1024             2048
//   [  10  ]         [  20  ]          [  30  ][  40  ]
//   [ 1024]  ----> [ 2048 ]   ----> [       ]  
       
//  연결리스트 --> 메모리가 절약 --> 필요할때마다 노드르 늘려 나간다 !! 
//             --> 크기를 모는 경우에 유용하다.  
//   동적배열 VS 연결리스트 !! 
// 동적배열은 크기가 늘어나거나 줄어들때 전체를 복사 할당 재할당 해제가 필요 !! 
// 연결리스트는 필요한 만큼만 사용한다 !! 
 
// 어디서든 !!  삽입 삭제 속도가 빠르게 동작한다 !! 



#include 
#include 
//*******************************************************************
// 단일 연결리스트 구현 
//*******************************************************************
// 노드 구조체 :  리스트내의 하나의 노드를 나타내기위한 구조체 !! 데이타와 링크 !! 
struct Node
{
	int Data; // 데이타 저장소 
	Node * next;  //  다음 노드를 가르킬 포인터 
};
//*******************************************************************
// 1) 더미노드를 활용하는 방법 !!  
//   head,tail더미 노드사이에 노드들을 추가하는 방법 !! 
// 2) head 노드만 갖고 구현하는 방법 !! 
// --> tail노드 대신에 next가 null인노드를 찾는 방법으로 리스트의 끝을 판별 !! 
// 3) head * 만 갖고 구현하는 방법 !! 
//*******************************************************************
// 더미 노드 선언 !! 
//*******************************************************************
Node * head = NULL; 
Node * tail = NULL; 
//*******************************************************************
// InitList :head, tail 노드생성 
//*******************************************************************
void InitList()
{
	//head생성 
	head = (Node*)malloc(sizeof(Node)); 
	// tail노드 생성 
	tail = (Node*)malloc(sizeof(Node)); 
	// 링크 연결 
	head->next =  tail; 
	tail->next  = NULL; 
}
//-----------------------------------------------------------------
// push_back :  리스트에 맨위에 노드를 삽입하는 함수 !! 
//-----------------------------------------------------------------
void push_back( int data) 
{
	// 1) 노드생성 
	Node * NewNode =  (Node*)malloc(sizeof(Node)); 
	NewNode->Data = data; 
	NewNode->next = NULL; 
	//2) 삽입 위치 찾기 !! 
	Node * p =  head; 
	while( p->next != tail)
	{
		p = p->next; 
	}
	// 3) 링크 연결 
	NewNode->next = p->next;
	p->next = NewNode;

}
//-----------------------------------------------------------------
//  2) 맨앞에 삽입하는 경우 
//-----------------------------------------------------------------
void push_front( int data)
{// 1) 할당 
	Node * NewNode = (Node*)malloc(sizeof(Node)); 
	NewNode->Data = data;
	NewNode->next = head->next;
	head->next =  NewNode;
}
//-----------------------------------------------------------------
// 3) 중간에 삽입  :  key값 뒤에 data삽입하자 !! 
//-----------------------------------------------------------------
void Insert( int key ,  int data)
{	
	// 1)노드 생성 !! 
	Node * NewNode = (Node*)malloc(sizeof(Node)); 
	NewNode->Data = data; 
	NewNode->next = NULL; 

	Node * p = head->next; 
	while( p != tail)
	{
		if( p->Data == key) 
		{
			NewNode->next = p->next; 
			p->next =  NewNode; 
			return;
		}
		else
		{
			p = p->next;
		}
	}
	free(NewNode);
	push_back(data);
	
}
//-----------------------------------------------------------------
// 맨뒤에서 삭제 
//-----------------------------------------------------------------
void pop_back() 
{
	Node * p, *s; 
	
	if( head->next == tail) 
	{
		puts("list Empty ~ !!"); return; 
	}
	else 
	{
		p = head->next;
		s = head; 
		while( p->next != tail)
		{
			s = p;
			p = p->next;
		}
		s->next = p->next; 
		free(p);
	}
}
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// 맨앞에서 삭제 
//-----------------------------------------------------------------
void pop_front()
{
	Node * p = head->next; 
	if(head->next == tail) 
	{	
		puts("list empty !! ");
	}
	else
	{
		head->next = p->next;
		free( p );
	}
}
//-----------------------------------------------------------------
//  중간에서 삭제 !! 
//-----------------------------------------------------------------
void erase( int key)
{	
	Node * p, *s; 
	if( head->next == tail) 
	{
		puts("list empty !!");
	}
	else
	{
		s = head;
		p = head->next;
		while( p != tail) 
		{
			if( p->Data == key) 
			{
				s->next = p->next;
				free(p); 
				return;
			}
			else
			{
				s = p;
				p = p->next;
			}
			
		}
	} 
}
//-----------------------------------------------------------------
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// Show() : 리스트 출력 !! 
//-----------------------------------------------------------------
void Show()
{
	Node * p = head->next; 
	while( p != tail) 
	{	
		printf("%d --> " ,  p->Data );
		p = p ->next;
	}
	puts(""); //개행
}
void main()
{
	InitList();		
	// 삽입 
	//-----------------------------------------------------------------
	//  1) 맨뒤에 삽입하는 경우 
	//-----------------------------------------------------------------
	push_back( 10 );  
	push_back( 20 );  
	push_back( 30 );  
	Show();
	//-----------------------------------------------------------------	
	//  2) 맨앞에 삽입하는 경우  
	//-----------------------------------------------------------------
/*	push_front(100);
	push_front(200);
	Show();
	//-----------------------------------------------------------------
	//  3) 중간에 삽입하는 함수 
	//-----------------------------------------------------------------
	Insert( 10, 999);
	Show();
	Insert( 30, 888);
	Show();
	Insert( 888, 1888);
	Show();*/
	// 삭제 연산 
	//-----------------------------------------------------------------
	// 1) 맨뒤에서 삭제 
	//-----------------------------------------------------------------
		erase(30);
		Show();
		erase(10);
		Show();
		erase(20);
		Show();

//-----------------------------------------------------------------
// 2) 맨앞에서 삭제 
//-----------------------------------------------------------------
	// 3) 중간에서 삭제  
	//-----------------------------------------------------------------
}

'자료구조' 카테고리의 다른 글

[자료구조] List class  (0) 2014.12.01
[자료구조] 이중 연결 리스트  (0) 2014.12.01
[자료구조] 단일 연결리스트  (0) 2014.12.01
[자료구조] vector  (0) 2014.12.01
[자료구조] stack  (0) 2014.12.01

+ Recent posts