본문 바로가기

학부_대학원/자료구조

연결 자료구조[단순 연결 리스트]

SMALL

등장 배경?

순차 자료구조의 문제점의 해결

1. 삽입, 삭제 연산시 순서에 맞는 물리 주소를 유지하기 위한 이동에 대한 OverHead가 발생

2. 배열을 이용한 구현시, 메모리 사용의 비효율 --> 사용하지 않는 공간도 순서를 위해서 할당 시켜야함.

--> 이러한 문제점을 해결하기 위해서 연결 자료구조가 등장


연결 자료구조

자료의 논리적인 순서와 물리적인 순서가 일치하지 않는 자료구조

각 원소에 저장되어 있는 다음 원소의 주소에 의해 순서가 연결되는 방식

--> 물리적이 주소를 맞추기 위한 OverHead가 발생하지 않음.

여러 개의 작은 공간을 연결하여 하나의 전체 자료구조 표현

--> 종합하면 필요 하지 않은 것은 할당하지 않아도 되고, 꼭 연속적일 필요도 없고

     조각 조각난 메모리로도 자료구조를 표현 할 수있다.

연결 리스트

리스트를 연결 자료구조로 표현하는 구조


--> 자료구조 공부는 이론을 기반으로 코딩하는게 가장 효율적이고 잼있는것 같다.


단순 열결 리스트[Singly Linked List]

노드가 하나의 링크 필드에 의해서 다음 노드와 연결되는 구조를 가진 연결 리스트


마지막 노드에 추가

노드 수정

마지막 노드 삭제

중간 노드 추가

중간 노드 삭제

--> 약간의 오류가 있을수도... 

삭제, 추가 할 때 tmp_Node의 순서가 중요하다?!

정도 느꼈음.

###############################################################################

#include "stdio.h"

#include "stdlib.h"

#include "string.h"



//구조체

typedef struct Node{

	char data[4];

	struct  Node* link; 

	//Node의 주소를 저장 할 변수

};



Node* Init_Node();

void Modify_Node(Node* node, char* Find_Data, char* Data);

void Insert_Node(Node* node,char* Data);

void Delete_Node(Node* node);

void Middle_Insert_Node(Node* node, char* Find_Data, char* Data);

void Middle_Delete_Node(Node* node, char* Find_Data);

void Print(Node* node);

void Delete_Last_Node(Node* node);

int main()

{

	Node* Start = Init_Node();

	strcpy_s(Start->data, "월");

	Insert_Node(Start, "화");

	Insert_Node(Start, "수");

	Insert_Node(Start, "목");

	Middle_Delete_Node(Start, "화");

	Print(Start);

	printf("\n\n");

	Modify_Node(Start, "수", "금");

	Print(Start);

	printf("\n\n");

	Insert_Node(Start, "화");

	Middle_Insert_Node(Start, "화", "하");

	

	Print(Start);

	



	printf("\n\n");

	Delete_Last_Node(Start);

	Delete_Last_Node(Start);

	Delete_Last_Node(Start);

	Print(Start);

	system("pause");

}



Node* Init_Node()

{

	Node* Init = (Node*)malloc(sizeof(Node));

	memset(Init, 0x00, sizeof(Node));

	Init->link = NULL;

	return Init;

}





void Insert_Node(Node* node, char* Data)

{

	Node* new_Node = (Node*)malloc(sizeof(Node));

	

	while (node->link != NULL)

	//마지막 노드를 만날때 까지 반복

	{

		node = node->link;

	}



	node->link = new_Node;

	strcpy_s(new_Node->data, Data);

	new_Node->link = NULL;

}



void Middle_Insert_Node(Node* node, char* Find_Data, char* Data)

{

	Node* new_Node = (Node*)malloc(sizeof(Node));

	Node* tmp_Node = NULL;

	while (node->link != NULL )

	{

		if (strcmp(node->data, Find_Data) == 0)

		{

			new_Node->link = node->link;

			tmp_Node->link = new_Node;

			break;

			

		}

		node = node->link;

		tmp_Node = node;

	}

	strcpy_s(new_Node->data, Data);

}

void Print(Node* node)

{

	while (node->link != NULL)

	{

		printf("%s\n", node->data);

		node = node->link;

	}



	printf("%s\n", node->data);



}





void Modify_Node(Node* node, char* Find_Data, char* Data)

{

	while (strcmp(node ->data,Find_Data) !=0)

	{

		node = node->link;

	}

	strcpy_s(node->data, Data);

}



void Middle_Delete_Node(Node* node, char* Find_Data)

{

	

	Node* tmp_Node = NULL;

	while (node->link != NULL)

	{

		if (strcmp(node->data, Find_Data) == 0)

		{

			tmp_Node->link = node->link;

			break;



		}

		tmp_Node = node;

		node = node->link;

		

	}

}

void Delete_Last_Node(Node* node)

{

	Node* tmp_Node = NULL;

	while (node->link != NULL)

	{

		tmp_Node = node;

		node = node->link;



	}

	tmp_Node->link = NULL;



}


LIST

'학부_대학원 > 자료구조' 카테고리의 다른 글

연결리스트 - Graph  (0) 2016.10.19
자료구조 - 원형 연결 리스트  (0) 2016.08.01
다익스트라 알고리즘[Dijkstra Algorithm]  (0) 2016.07.28
Tree [트리]  (0) 2016.07.28
선형 리스트[Linear List]  (0) 2016.07.28