笔记:数据结构(顺序表)

顺序表的基本操作分解

顺序表是一种线性表的存储结构,它使用一组地址连续的存储单元依次存储线性表的元素。以下是顺序表的基本操作分解,包括初始化、插入、删除、查找、修改和遍历。

1. 顺序表的定义

复制代码
C
#define MAX_SIZE 100  // 定义顺序表的最大容量

typedef struct {
    int data[MAX_SIZE];  // 存储元素的数组
    int length;         // 当前顺序表的长度
} SeqList;

2. 顺序表的初始化

初始化顺序表,将长度置为 0,表示顺序表为空。

复制代码
C
void InitList(SeqList *L) {
    L->length = 0;  // 顺序表初始长度为0
}

3. 顺序表的插入操作

在顺序表的第 i 个位置插入元素 e。插入时需要将第 i 个位置及其后的元素向后移动。

复制代码
C
bool ListInsert(SeqList *L, int pos, int e) {
    if (pos < 1 || pos > L->length + 1) {  // 检查插入位置是否合法
        printf("Insert position is invalid.\n");
        return false;
    }
    if (L->length >= MAX_SIZE) {  // 检查顺序表是否已满
        printf("List is full.\n");
        return false;
    }
    for (int i = L->length; i >= pos; i--) {  // 将第pos个位置及其后的元素向后移动
        L->data[i] = L->data[i - 1];
    }
    L->data[pos - 1] = e;  // 在第pos个位置插入元素
    L->length++;         // 顺序表长度加1
    return true;
}

4. 顺序表的删除操作

删除顺序表的第 i 个位置的元素。删除时需要将第 i 个位置之后的元素向前移动。

复制代码
C
bool ListDelete(SeqList *L, int pos, int *e) {
    if (pos < 1 || pos > L->length) {  // 检查删除位置是否合法
        printf("Delete position is invalid.\n");
        return false;
    }
    *e = L->data[pos - 1];  // 取出被删除的元素
    for (int i = pos; i < L->length; i++) {  // 将第pos个位置之后的元素向前移动
        L->data[i - 1] = L->data[i];
    }
    L->length--;  // 顺序表长度减1
    return true;
}

5. 顺序表的查找操作

查找顺序表中第一个值为 e 的元素,并返回其位置。

复制代码
C
int LocateElem(SeqList *L, int e) {
    for (int i = 0; i < L->length; i++) {  // 遍历顺序表
        if (L->data[i] == e) {  // 找到值为e的元素
            return i + 1;  // 返回元素的位置(从1开始)
        }
    }
    return 0;  // 未找到返回0
}

6. 顺序表的修改操作

修改顺序表的第 i 个位置的元素为 e。

复制代码
C
bool ListUpdate(SeqList *L, int i, int e) {
    if (i < 1 || i > L->length) {  // 检查修改位置是否合法
        printf("Update position is invalid.\n");
        return false;
    }
    L->data[i - 1] = e;  // 修改第i个位置的元素
    return true;
}

7. 顺序表的遍历操作

遍历顺序表并打印所有元素。

复制代码
C
void PrintList(SeqList *L) {
    if (L->length == 0) {  // 检查顺序表是否为空
        printf("List is empty.\n");
        return;
    }
    printf("List: ");
    for (int i = 0; i < L->length; i++) {  // 遍历顺序表
        printf("%d ", L->data[i]);  // 打印元素
    }
    printf("\n");
}

8. 顺序表的销毁操作

释放顺序表的存储空间(如果需要动态分配内存)。

复制代码
C
void DestroyList(SeqList *L) {
    L->length = 0;  // 将顺序表长度置为0
    printf("List destroyed.\n");
}

9. 示例代码

复制代码
C
int main() {
    SeqList L;
    InitList(&L);  // 初始化顺序表

    ListInsert(&L, 1, 10);  // 在第1个位置插入10
    ListInsert(&L, 2, 20);  // 在第2个位置插入20
    ListInsert(&L, 3, 30);  // 在第3个位置插入30

    PrintList(&L);  // 输出: List: 10 20 30

    int e;
    ListDelete(&L, 2, &e);  // 删除第2个位置的元素
    printf("Deleted element: %d\n", e);  // 输出: Deleted element: 20

    PrintList(&L);  // 输出: List: 10 30

    ListUpdate(&L, 1, 100);  // 修改第1个位置的元素为100
    PrintList(&L);  // 输出: List: 100 30

    int pos = LocateElem(&L, 30);  // 查找元素30的位置
    printf("Element 30 is at position: %d\n", pos);  // 输出: Element 30 is at position: 2

    DestroyList(&L);  // 销毁顺序表

    return 0;
}

10. 总结

顺序表的基本操作包括初始化、插入、删除、查找、修改和遍历。顺序表的优点是随机访问速度快,缺点是插入和删除操作需要移动大量元素,效率较低。在实际应用中,顺序表适合元素数量固定且访问频繁的场景。

相关推荐
ss2732 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql
云水初33 分钟前
【项目篇】基于LanGraph的自动处理客服邮件的 Agent汇总
开发语言·笔记·python·学习·fastapi·langgraph
凉茶钱41 分钟前
list:哨兵节点,const_iterator 和 const iterator的区别与迭代器失效
数据结构·c++·list
Nontee1 小时前
Quartz 新手入门:定时任务的两个承诺
开发语言·windows·python
weixin_437961921 小时前
Docker安装(windows)
windows·docker·容器
kyle~1 小时前
Windows 多 AP 同名 Wi-Fi 网络异常问题复盘
网络·windows
持敬chijing2 小时前
白盒测试与代码审计-Claude Code Windows环境搭建
windows·安全·网络安全·网络攻击模型
敲代码的苦132 小时前
头歌数据结构-排序的实现及其应用
数据结构
新手小新2 小时前
通信工程师学习笔记5-通信系统
笔记·学习
鸽芷咕2 小时前
把 SQL 编辑器用顺:KSQL Developer 从补全到事务的实战笔记
笔记·sql·编辑器