Skip to content

Commit

Permalink
docs: 更新线性表的操作伪代码
Browse files Browse the repository at this point in the history
  • Loading branch information
fcbyk committed May 3, 2024
1 parent 1fb07e7 commit 7b90146
Show file tree
Hide file tree
Showing 4 changed files with 224 additions and 50 deletions.
2 changes: 1 addition & 1 deletion docs/.vitepress/themeConfig/nav.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const nav: DefaultTheme.NavItem[] = [
items: [
{
text: "数据结构与算法",
link: "/408/algorithm/"
link: "/408/Linearlist/algorithm"
},
// {
// text:"操作系统",
Expand Down
214 changes: 214 additions & 0 deletions docs/408/Linearlist/algorithm.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
---
layout: doc
outline: [2,3]
---
# 线性表的操作

## 插入

插入操作是指向线性表中添加新元素的操作,可以在表的任意位置进行插入。插入操作的关键在于确定要插入的位置,以及将新元素正确地插入到指定位置之后,可能需要调整表中其他元素的位置。

::: code-group

```text[顺序表]
插入(元素, 位置):
如果 位置 < 0 或 位置 > 表的长度 + 1:
返回 "无效位置"
如果 表已满:
返回 "表已满,无法插入"
如果 位置 == 0: // 插入到表头
将所有元素右移一位
表[位置] = 元素
否则 如果 位置 == 表的长度: // 插入到表尾
表[位置] = 元素
否则: // 插入到中间某个位置
将所有位置大于插入位置的元素右移一位
表[位置] = 元素
表长度增加1
```

```text[链表]
链表插入(元素, 位置):
如果 位置 < 0 或 位置 > 链表长度:
返回 "无效位置"
创建一个新节点,并将新元素存储在节点中
如果 位置 == 0: // 插入到链表头部
将新节点的下一个节点指向链表的头节点
将链表的头节点指向新节点
否则:
获取链表中第 (位置 - 1) 个节点
将新节点的下一个节点指向第 (位置 - 1) 个节点的下一个节点
将第 (位置 - 1) 个节点的下一个节点指向新节点
链表长度增加1
```

:::

## 删除

删除操作的实现涉及将被删除元素从表中移除,并可能需要调整其他元素的位置以保持表的结构正确性。

::: code-group

```text[顺序表]
删除(位置):
如果 位置 < 0 或 位置 >= 表的长度:
返回 "无效位置"
被删除元素 = 表[位置]
如果 位置 == 0: // 删除表头元素
将所有元素左移一位
否则 如果 位置 == 表的长度 - 1: // 删除表尾元素
将表的长度减1
否则: // 删除中间某个位置的元素
将位置后面的所有元素左移一位
返回被删除元素
```

```text[链表]
链表删除(位置):
如果 位置 < 0 或 位置 >= 链表长度:
返回 "无效位置"
如果 位置 == 0: // 删除表头元素
被删除节点 = 链表头节点
链表头节点 = 链表头节点的下一个节点
否则:
获取链表中第 (位置 - 1) 个节点
被删除节点 = 第 (位置 - 1) 个节点的下一个节点
将第 (位置 - 1) 个节点的下一个节点指向被删除节点的下一个节点
链表长度减少1
返回被删除节点的值
```

:::

## 查找

### 折半查找

也称为二分查找,通常用于在有序数组或列表中查找特定元素的位置。
时间复杂度为O(log n),其中n是元素数量

::: code-group

```text[伪代码]
函数 binary_search(数组 arr, 目标值 target) -> 整数
左边界 left 设为 0
右边界 right 设为 数组长度 - 1
当 左边界 <= 右边界 时执行:
中间位置 mid 设为 (左边界 + 右边界) / 2
如果 数组[mid] == target,则返回 mid
否则如果 数组[mid] < target,则 左边界 设为 mid + 1
否则 右边界 设为 mid - 1
返回 -1 // 没有找到目标值
```

```c++[C++]
int binary_search(vector<int>& arr, int target) {
int left = 0;
int right = arr.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid; // 找到目标值,返回索引
else if (arr[mid] < target) left = mid + 1; // 目标值在右半部分,更新左边界
else right = mid - 1; // 目标值在左半部分,更新右边界
}
return -1; // 没有找到目标值
}
```

:::


## 修改

线性表的修改操作通常指的是更新或替换表中某个位置的元素。这可以包括更新元素的值或者完全替换掉原来的元素。

::: code-group

```text[顺序表]
修改(位置, 新元素):
如果 位置 < 0 或 位置 >= 表的长度:
返回 "无效位置"
表[位置] = 新元素
```

```text[链表]
链表修改(位置, 新元素):
如果 位置 < 0 或 位置 >= 链表长度:
返回 "无效位置"
找到链表中第 (位置) 个节点
将该节点的值更新为 新元素
```

:::

## 遍历

链表的遍历操作是指依次访问链表中的每个节点,并对每个节点执行某种操作或者获取节点的值。遍历操作可以用来查找特定值、打印链表的所有元素、计算链表的长度等

::: code-group

```text[顺序表]
顺序表遍历(顺序表):
对于 每个元素 在 顺序表 中:
执行某种操作(如打印元素的值)
```

```text[链表]
链表遍历(链表头):
当前节点 = 链表头
当 当前节点 不为空时:
对当前节点执行某种操作(如打印节点的值)
当前节点 = 当前节点的下一个节点
```

:::

## 获取长度

线性表一般包含表示长度的属性(如 length),可以直接读取该属性来获取链表的长度,而不需要额外编写方法来获取长度

::: code-group

```text[顺序表]
获取长度(顺序表):
返回 顺序表中元素的个数
```

```text[链表]
获取链表长度(链表头):
计数 = 0
当前节点 = 链表头
当 当前节点 不为空时:
计数增加1
当前节点 = 当前节点的下一个节点
返回 计数
```

## 清空

## 判空

## 反转

## 排序
46 changes: 0 additions & 46 deletions docs/408/algorithm/index.md

This file was deleted.

12 changes: 9 additions & 3 deletions docs/408/sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@ import { DefaultTheme } from "vitepress"

const sidebar:DefaultTheme.SidebarItem[] = [
{
text: "基础算法",
link: "/408/algorithm/",
},
text:"线性表",
collapsed:true,
items:[
{
text:"线性表的操作",
link:"/408/Linearlist/algorithm"
}
]
}
]

export default sidebar

0 comments on commit 7b90146

Please sign in to comment.