Friday, December 4, 2020

Circular Linked List

 






insert_node

=====================================================================

void insert_node(Node **start, int insert_after_value, int value)
{
	Node *current = *start; 
	
	do {
		if(insert_after_value == current->data) {
			Node *new_node = (Node*)malloc(sizeof(Node));	
			new_node->data = value;
			new_node->next = NULL;
			if(current->next == *start) {
				current->next = new_node;
				new_node->next = *start;
				break;
			}
			else {
				new_node->next = current->next;
				current->next = new_node;
				break;
			}
		}
		current = current->next;
	}while(current != *start);
}
=====================================================================
add_node
=====================================================================
void add_node(Node **start, int value)
{
	Node *new_node = (Node*)malloc(sizeof(Node));
	new_node->data = value;
	new_node->next = NULL;
	
	if(*start == NULL) {
		*start = new_node;
		(*start)->next = *start;
		return;
	}
	else {
		Node *current;	
		current = *start;
		while(current->next != *start) {
			current = current->next;
		}
		current->next = new_node;
		new_node->next = *start;
		return;
	}
}
=====================================================================
delete node
=====================================================================
void delete_node(Node **start, int value)
{
	Node *current = *start;
	Node *temp;

	if(value == current->data) {
		*start = current->next;
		(*start)->prev = NULL;
		free(current);
		return;
	}
	
	while(current != NULL) {
		if(current->next->data == value) {
			temp = current->next;
			current->next = current->next->next;	
			if(current->next != NULL)
				current->next->prev = current;
			free(temp);
			return;
		}
		current = current->next;
	}
}
=====================================================================
print
=====================================================================
void print_list(Node *node)
{
	Node *first_node = node;
	printf("%d ", node->data);
	node = node->next; 
	
	while(node != NULL) {
		if(node == first_node) break;
		printf("%d ", node->data); 
		node = node->next;
	}
	printf("%d\n", node->data);
}

=====================================================================
free
=====================================================================
void free_list(Node *node)
{
	int total_node = 1;
	Node *first = node;
	node = node->next;
	while(node != first) {
		node = node->next;
		total_node++;
	}

	Node *current = first;
	Node *temp;
	int i;
	for(i = 0; i < total_node; i++) {
		temp = current;
		current = current->next;
		free(temp);
	}
}
=====================================================================
inverse_print_list
=====================================================================
void inverse_print_list(Node *node)
{
	printf("Inverse List:\n");
	while(node != NULL) {
		printf("%d ", node->data); 
		node = node->prev;
	}
	printf("\n");
}
=====================================================================
main
=====================================================================
#include <stdio.h>
#include <stdlib.h>

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

void add_node(Node **start, int value);
void print_list(Node *node);
void insert_node(Node **start, int insert_after_value, int value);
void delete_node(Node **start, int value);
void inverse_print_list(Node *node);
void free_list(Node *node);

int main(int argc, char* argv[])
{
	// create first node "head"
	Node *head = NULL;
	add_node(&head, 5);
	add_node(&head, 128);
	add_node(&head, 41);

	// insert non-exist node, linked list would not have changed
	insert_node(&head, 77, 92);
	// insert after node of data 128
	insert_node(&head, 128, 84); 
	// insert after the last node
	insert_node(&head, 41, 97);

	// delete the first node
	delete_node(&head, 5);
	// delete the node of data 41
	delete_node(&head, 41);
	// delete the last node
	delete_node(&head, 97);

	print_list(head);
	
	Node *last = head;
	while(last->next != NULL) {
		last = last->next;
	}
	inverse_print_list(last);
	
	free_list(head);

	return 0;	
}
=====================================================================

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能