Showing posts with label data-structures. Show all posts
Showing posts with label data-structures. Show all posts

Monday, February 15, 2021

data structures index

Data Structures

Algorithms

  Search

    Linear Search (Not-Sort) Time complexity: O(n) ~ O(1)

    Binary search (Sort) Time complexity: O(log n)

      Interpolation Search (Improve Binary search) Time complexity: O(n) ~ O(1)

      Exponential Search (搜尋無限、無邊界的已排序序列。由於邊界未知長度就未知,無法以傳統二元搜尋來找中點。) Time complexity: O(n) ~ O(log  n)

  Ternary Search (Sort)

  Sort

    Stooge Sort (First 2/3 and tail 2/3)

    Insertion Sort Time complexity: O(n) ~ O(n^2)

   Selection sort

    Shellsort

  

Data Structures

  Singly Linked List

  Circular  Doubly Linked List


https://rust-algo.club/searching/interpolation_search/index.html

https://hackmd.io/@cccccs100203 需研究

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;	
}
=====================================================================

Tuesday, September 29, 2020

Singly Linked list

鏈結串列的抽象資料結構 (ADT)

Linked list (連結串列) 是一種常見的資料結構,其使用 node (節點)來記錄、表示、儲存資料(data),並利用每個 node 中的 pointer 指向下一個 node,藉此將多個 node 串連起來,形成 Linked list,並以 NULL 來代表 Linked list 的終點,見圖一(a)。


圖一(a)


圖一(b)

Node2 = Node1->Next 


刪除節點在 middle

刪除節點在 tail




範例

Reference:

https://alrightchiu.github.io/SecondRound/linked-list-introjian-jie.html

n8n index

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