공부

List, 연결List, 단순연결List

seoyepar 2022. 2. 13. 23:42

1. List

 🍀 순서를 가진 데이터의 집합을 가리키는 추상 자료형

    ✏️ 동일한 데이터를 가지고 있어도 상관 없음.

    ✏️ 구현 방법에 따라 크게 두 가지로 나뉨.

      ▪ 순차 List : 배열을 기반으로 구현된 List

      ▪ 연결 List : 메모리의 동적할당을 기반으로 구현된 List

    ✏️ 주요 함수

      ▪ addtoFirst()

      ▪ addtoLast()

      ▪ add()

      ▪ delete()

      ▪ get() : 특정 위치 원소를 return

 

 

2. 연결 List

 🍀 단순 배열을 이용한 순차 List의 단점을 보완한 자료구조

    ✏️ 개별적으로 위치하고있는 원소의 주소를 연결하여 하나의 전체적인 자료구조를 이룸

    ✏️ 순차 List에서 물리적인 순서를 맞추기 위한 작업이 필요하지 않음.

    ✏️ 자료구조의 크기를 동적으로 조정할 수 있어, 메모리의 효율적인 사용이 가능.

    ✏️ 단점 : 구현이 배열 List보다 복잡함.

      📌 노드 : 연결 List에서 하나의 우너소에 필요한 data를 갖고 있는 자료의 단위.

        ▪ 데이터 필드 : 원소의 값을 저장하는 자료구조. 저장할 원소의 종류나 크기에 따라 구조를 정의하여 사용

        ▪ 링크 필드 : 다음 노드의 주소를 저장하는 자료구조

      📌 헤드 : List의 처음 노드를 가리키는 자료구조

 

 

3. 단순 연결 List

 🍀 처음 위치에 node를 삽입하기

addtoFirst(L, i)
	new <- createNode();
	new.data = i;
	new.link = L;
  	L = new;
end addtoFirst()

 

 🍀 임의의 위치에 node를 삽입하기

add(L, pre, i)
	new <- createNode()
	new.data = i;
	if (L=NULL) then {
		L = new;
		new.link = NULL;
	}
	else {
		new.link = pre.link;
		pre.link = new;
	}
end add()

 

 🍀 마지막 위치에 node를 삽입하기

addtoLast(L, i)
	new <- createNode()
	new.data = i;
	new.link = NULL;
	if (L=NULL) then {
		L = new;
		return;
	}
	temp = L;
	while (temp.link != NULL) do
		temp = temp.link;
	temp.link = new;
end.addtoLast()

 

 🍀 노드 삭제 알고리즘

delete(L, pre)
	if (L==NULL) then error;
	else {
		target = pre.link;
		if (target == NULL) then return;
		pre.link = target.link;
	}
	freeNode(target)
end delete()

 

 ✔ c++ 코드 구현 ✔

#define MAX_NODE 10000

struct Node {
	int data;
	Node* next;
};

Node node[MAX_NODE];
int nodeCnt = 0;
Node* head;

Node* getNode(int data) {
	node[nodeCnt].data = data;
	node[nodeCnt].next = nullptr;
	return &node[nodeCnt++];
}

void init() // 초기화
{
	head = getNode(-1);
	//nodeCnt = 0;
}

void addNode2Head(int data) // 앞에 넣기
{
	Node *newone;

    newone = getNode(data);
	newone->next = head->next;
	head->next = newone;
}

void addNode2Tail(int data) // 마지막에 넣기
{
	Node* ptr = head;
	while (ptr->next)
	{
		ptr = ptr->next;
	}
	ptr->next = getNode(data);
}

void addNode2Num(int data, int num) // 원하는 위치에 넣기
{
	int n = 1;
	Node* ptr = head;
	Node* curr;
	while (n < num)
	{
		if ((ptr->next) == nullptr)
			ptr->next = getNode(0);
		ptr = ptr->next;
		n++;
	}
	curr = ptr->next;
	ptr->next = getNode(data);
	ptr = ptr->next;
	ptr->next = curr;
}

void removeNode(int data) // 삭제
{
	Node* ptr = head;
	Node* curr;
    
	while (ptr->next)
	{
        if (ptr->next->data == data)
        {
            curr = ptr->next;
        	ptr->next = curr->next;
            break;
        }
		ptr = ptr->next;
	}
}


int getList(int output[MAX_NODE]) // 원하는 Node찾기
{
	Node* ptr = head->next;
	int cnt = 0;
	while (ptr)
	{
		output[cnt] = ptr->data;
		cnt++;
		ptr = ptr->next;
	}
	return (cnt);
}