04:00:00
SILK-097 - ```### 5. 链表**用处**: 线性存储结构,适合频繁插入/删除操作。### 5.1 链表**用处**: 线性存储结构,适合频繁插入/删除操作。### 5.1.1 单链表**用处**: 线性存储结构,适合频繁插入/删除操作。```@step 1. 定义节点struct Node { int data; Node* next;}@step 2. 创建节点Node* final = new Node;final->data = 1;final->next = NULL;@step 3. 连接节点Node* head = new Node;head->data = 0;head->next = final;@step 4. 访问节点cout << head->next->data;```### 5.1.2 双链表**用处**: 线性存储结构,适合频繁插入/删除操作。```@step 1. 定义节点struct Node { int data; Node* next; Node* prev;}@step 1. 创建节点Node* final = new Node;final->data = 1;final->next = NULL;final->prev = NULL;@step 2. 创建中间节点Node* head = new Node;head->data = 0;head->next = final;head->prev = NULL;@step 3. 创建中间节点Node* middle = new Node;middle->data = 0.5;middle->next = final;middle->prev = head;@step 4. 访问节点cout << head->next->data;```### 5.1.3 循环链表**用处**: 线性存储, constant access/insertion, O(1) head/end access.```@step 1. 创建单向循环链表Node* final = new Node;final->data = 1;final->next = final;@step 2. 创建中间节点Node* middle = new Node;middle->data = 0.5;middle->next = final;@step 3. 创建headNode head = new Node;head->data = 0;head->next = middle;@step 4. 访问节点cout << head->next->data;```### 5.1.4 双向循环链表**用处**: 线性存储, constant access/insertion, O(1) head/end access.```@step 1. 创建basic单向循环链表Node* final = new Node;final->data = 1;final->next = final;final->prev = final;@step 2. 创建中间节点Node* middle = new Node;middle->data = 0.5;middle->next = final;middle->prev = final;@step 3. 创建headNode head = new Node;head->data = 0;head->next = middle;head->prev = final;@step 4. 访问节点cout << head->next->data;```### 5.1.5 栈**用处**: LIFO原则,实现递归操作,例如回溯/DFS/分治/分治。```@step 1. 创建栈stack<int> st;@step 2. 入栈st.push(1);st.push(2);@step 3. 出栈cout << st.top();st.pop();@step 4. 访问节点cout << st.top();```### 5.1.6 队列**用处**: FIFO原则,实现BFS操作。```@step 1. 创建队列queue<int> q;@step 2. 入队q.push(1);q.push(2);@step 3. 出队cout << q.front();q.pop();@step 4. 访问节点cout << q.front();```### 5.1.7 优先级队列**用处**: 线性存储,最适合基于优先级的调度。```@step 1. 创建队列priority_queue<int> pq;@step 2. 入队pq.push(1);pq.push(2);@step 3. 出队cout << pq.top();pq.pop();@step 4. 访问节点cout << pq.top();```### 5.1.8 堆**用处**: 基于优先级,擅长O(1) top/find-min.x O(complex) insert/remove.```@step 1. 创建堆vector<int> v = {1,2,3};make_heap(v.begin(), v.end());w @ step 2. 入队v.push_back(4);push_heap(v.begin(), v.end());@step 3. 出队cout << v[1];pop_heap(v.begin(), v.end());v.pop_back();@step 4. 访问节点cout << v[1];```### 5.2.1 跳表**用处**: 用于在线游戏中跳过链表元素。```@step 1. 创建堆vector<int> v = {1,2,3};make_heap(v.begin(), v.end());w @ step 2. 入队v.push_back(4);push_heap(v.begin(), v.end());@step 3. 出队cout << v[1];pop_heap(v.begin(), v.end());v.pop_back();@step 4. 访问节点cout << v[1];```### 5.2.2 树**用处**: 具备某个共同特性子树,最适合实现文件目录和数据库表/列。```@step 1. 创建树class Node { int data; Node* left; Node* right;}@step 2. 创建根节点Node* head = new Node;head->data = 0;head->left = NULL;head->right = NULL;@step 3. 创建节点Node* left = new Node;left->data = 3;left->left = NULL;left->right = NULL;@step 4. 创建节点Node* right = new Node;right->data = 5;right->left = NULL;right->right = NULL;@step 5. 连接节点head->left = left;head->right = hright;@step 6. 访问节点cout << head->left->data;```### 5.2.3 二叉树**用处**: 线性存储,在储存/display文件具有平衡的特性。```@step 1. 创建树class Node { int data; Node* left; Node* right;}@step 2. 创建根节点Node* head = new Node;head->data = 0;head->left = NULL;head->right = NULL;@step 3. 创建节点Node* left = new Node;left->data = 3;left->left = NULL;left->right = NULL;@step 4. 创建节点Node* right = new Node;right->data = 5;right->left = NULL;right->right = NULL;@step 5. 连接节点head->left = left;head->right = hright;@step 6. 访问节点cout << head->left->data;```### 5.2.4 平衡二叉树**用处**: 线性存储,在储存/display文件具有平衡的特性。```@step 1. 创建树class Node { int data; Node* left; Node* right;}@step 2. 创建根节点Node* head = new Node;head->data = 0;head->left = NULL;head->right = NULL;@step 3. 创建节点Node* left = new Node;left->data = 3;left->left = NULL;left->right = NULL;@step 4. 创建节点Node* right = new Node;right->data = 5;right->leftya!
2019年9月25日