Develop

이중 연결 리스트(Double Linked List)

Y.J Kim 2014. 2. 8. 02:56

이중 연결 리스트로 구성함으로써, 순방향뿐만 아니라 역방향으로도 검색이 가능함.


[insert_front 과정]

0123456


[delete_front 과정]

0123


typedef struct _Node Node;
struct _Node {
	Node* prev;
	int data;
	Node* next;
};

void init(Node ** Head) {
	*Head = (Node *)malloc(sizeof(Node));
	(*Head)->next = *Head;
	(*Head)->prev = *Head;
}

void insert_front(Node* front, Node* data) {
	data->next = front->next;
	data->prev = front;
	front->next = data;
	data->next->prev = data;
}

Node* delete_front(Node* front) {
	Node* node = front->next;
	front->next = node->next;
	node->next->prev = front;
	return node;
}

Node* alloc_list(Node * anl) {
	if(anl->next == anl) {
		return (Node*)malloc(sizeof(Node));
	}

	else {
		return delete_front(anl);
	}
}

void free_list(Node *anl, Node *temp) {
	insert_front(anl, temp);
}

void print_list(Node* Head) {
	Node * node = Head->next;

	printf("[Sequence]\n", node->data);

	while(node->next != Head) {
		printf("%d -> ", node->data);
		node = node->next;
	}

	printf("%d -> Head\n", node->data);
	printf("[Reverse]\n", node->data);

	while(node != Head) {
		printf("%d -> ", node->data);
		node = node->prev;
	}

	printf("Head\n");
}

int main() {
	Node* Head;
	Node* Anl;
	int i;

	init(&Head);
	init(&Anl);

	for(i = 0; i<10; i++)
	{
		Node* node = alloc_list(Anl);
		node->data = i;

		insert_front(Head, node);
		print_list(Head);
	}

	for(i = 0; i<9; i++)
	{
		Node* node = delete_front(Head);
		free_list(Anl, node);
		print_list(Head);
	}
}


[결과]