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

顺序表的基本操作分解

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

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

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

相关推荐
2501_926978331 天前
AGI 的四种瓶颈:资源型还是发现型--以及DSH的位置
人工智能·经验分享·笔记·ai写作
liuqs3321 天前
nat123安卓和nat123全端口选型指南,映射工具怎么挑
网络·笔记
xian_wwq1 天前
【学习笔记】光伏“四可”装置纵密模块--配置方法和原理
笔记·学习
sudebao点com1 天前
一次“Google 能打开,FlexTV 打不开”的 DNS 故障排查:从 curl 超时到完整证据链
windows·macos·https·cdn·dns·nslookup·网络排错
Herbert_hwt1 天前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
日拱一卒的小田1 天前
ZYNQ学习笔记3-ZYNQ的IIC控制器1
笔记·单片机·学习
非凡ghost1 天前
分区助手:Windows 磁盘管理的“瑞士军刀“,分区调整不再怕丢数据
服务器·windows·电脑·软件需求
晚风醉蝶1 天前
1-6-插入排序-InsertionSort
java·数据结构·排序算法
Tyler_TXZ1 天前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
有点。1 天前
C++二叉树二(练习题)
数据结构·c++·算法·图论