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

顺序表的基本操作分解

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

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. 总结

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

相关推荐
Tom@敲代码4 小时前
js学习笔记-01
javascript·笔记·学习
三十岁老牛再出发5 小时前
07.07.每日总结
c语言·windows·python
巴巴媛6665 小时前
STM32学习笔记【32.BKP + RTC】
笔记·stm32·学习
一个初入编程的小白5 小时前
数据结构:栈
数据结构
能摆一天是一天6 小时前
Spring ai vectorstore 使用本地模型导致只能匹配可行度为1.0的内容的解决方法笔记
java·笔记·spring
我命由我123456 小时前
方差(实例实操、与标准差的区别)
java·数据结构·算法·数据分析·java-ee·intellij-idea·idea
进阶的DW6 小时前
Wiki + Graph + RAG 知识库建设笔记2
笔记
AOwhisky6 小时前
Linux(CentOS)系统管理入门笔记(第四期)——文件系统(下篇):文件与目录操作实战——cpmvmkdirrmln
linux·运维·笔记·centos·云计算·文件系统
nianniannnn6 小时前
c++复习自存--标准模板库STL
开发语言·c++·windows