본문 바로가기

Algorithm and Data Structure

C언어 이중연결리스트(Doubly linked list) 구현

#include <stdio.h>
#include <stdlib.h>



typedef struct Node {
	int val;
	struct Node *prev;
	struct Node *next;
}Node;


typedef struct LinkedList {
	Node *head;
	Node *tail;
	int size;
}LinkedList;


LinkedList* list;

Node* make_node(int val) {
	Node* node = (Node*)malloc(sizeof(Node));
	node->val = val;
	node->prev = node->next = NULL;
	return node;
}

void initList() {
	list->head = make_node(0x7fffffff);
	list->tail = make_node(0x7fffffff);
	list->head->prev = list->head->next = list->tail;
	list->tail->prev = list->tail->next = list->head;
	list->size = 0;
}

void push_back(int val) {
	Node* new_node = make_node(val);
	Node* last_node = list->tail->prev;
	last_node->next = new_node;
	new_node->prev = last_node;
	new_node->next = list->tail;
	list->tail->prev = new_node;
	++list->size;
}

int back() {
	if (list->size == 0) {
		printf("empty list\n");
		return -1;
	}
	return list->tail->prev->val;
}

void pop_back() {
	if (list->size == 0) {
		printf("empty list\n");
		return;
	}
	Node* pop_node = list->tail->prev;
	pop_node->prev->next = list->tail;
	list->tail->prev = pop_node->prev;
	free(pop_node);
	--list->size;
}


void push_front(int val) {
	Node* new_node = make_node(val);
	Node* first_node = list->head->next;
	list->head->next = new_node;
	new_node->prev = list->head;
	new_node->next = first_node;
	first_node->prev = new_node;
	++list->size;
}

int front() {
	if (list->size == 0) {
		printf("empty list\n");
		return -1;
	}
	return list->head->next->val;
}

void pop_front() {
	if (list->size == 0) {
		printf("empty list\n");
		return;
	}
	Node* pop_node = list->head->next;
	list->head->next = pop_node->next;
	pop_node->next->prev = list->head;

	free(pop_node);
	--list->size;
}

int size() {
	return list->size;
}

void print() {
	if (list->size == 0) {
		printf("empty list\n");
		return;
	}	
	Node* curr = list->head->next;
	while(curr != list->tail){
		printf("%d ", curr->val);
		curr = curr->next;
	}
	printf("\n");
}

void delete_memory() {
	Node* curr = list->head;
	Node* next;
	while(curr != list->tail) {
		next = curr->next;
		free(curr);
		curr = next;
	}
	free(curr);
	free(list);
}


int main(int argc, char** argv) {
	list = (LinkedList*)malloc(sizeof(LinkedList));

	initList();
	push_back(1);
	push_back(2);
	push_back(3);
	push_back(4);
	pop_back();
	push_back(5);

	push_front(1);
	push_front(2);
	push_front(3);
	push_front(4);
	pop_front();
	push_front(5);
	
	print();


	delete_memory();

	return 0;
}

'Algorithm and Data Structure' 카테고리의 다른 글

C언어 이중연결리스트로 큐(Queue) 구현  (0) 2023.12.18
C언어 연결리스트로 스택(Stack) 구현  (0) 2023.12.18
Radix Sort  (0) 2023.12.17
Counting Sort  (0) 2023.12.17
Heap Sort  (0) 2023.12.17