1.概念:
顺序表是一种线性表的存储结构,它使用一段连续的存储空间来存储数据元素。顺序表的特点是:
-
逻辑上相邻的元素在物理存储上也相邻。
-
支持随机访问,可以通过下标直接访问元素。
-
插入和删除操作可能需要移动大量元素,时间复杂度较高。
2.基本操作:
顺序表的基本操作包括:
-
初始化:创建一个空的顺序表。
-
插入:在指定位置插入一个元素。
-
删除:删除指定位置的元素。
-
查找:根据值或下标查找元素。
-
修改:修改指定位置的元素。
-
遍历:访问顺序表中的所有元素。
-
销毁:释放顺序表占用的内存。
3.代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 定义顺序表的最大容量typedef struct {int data[MAX_SIZE]; // 用数组存储数据int length; // 当前顺序表的长度
} SeqList;// 初始化顺序表
void InitList(SeqList* L) {L->length = 0; // 初始长度为 0
}// 插入元素
int InsertList(SeqList* L, int pos, int value) {if (pos < 1 || pos > L->length + 1) {printf("插入位置不合法\n");return 0; // 插入失败}if (L->length >= MAX_SIZE) {printf("顺序表已满,无法插入\n");return 0; // 插入失败}// 将插入位置后的元素向后移动for (int i = L->length; i >= pos; i--) {L->data[i] = L->data[i - 1];}L->data[pos - 1] = value; // 插入新元素L->length++; // 长度加 1return 1; // 插入成功
}// 删除元素
int DeleteList(SeqList* L, int pos) {if (pos < 1 || pos > L->length) {printf("删除位置不合法\n");return 0; // 删除失败}// 将删除位置后的元素向前移动for (int i = pos; i < L->length; i++) {L->data[i - 1] = L->data[i];}L->length--; // 长度减 1return 1; // 删除成功
}// 查找元素(按值查找)
int FindList(SeqList* L, int value) {for (int i = 0; i < L->length; i++) {if (L->data[i] == value) {return i + 1; // 返回元素位置(从 1 开始)}}return -1; // 未找到
}// 修改元素
int ModifyList(SeqList* L, int pos, int value) {if (pos < 1 || pos > L->length) {printf("修改位置不合法\n");return 0; // 修改失败}L->data[pos - 1] = value; // 修改元素return 1; // 修改成功
}// 遍历顺序表
void PrintList(SeqList* L) {printf("顺序表内容:");for (int i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}int main() {SeqList L;InitList(&L); // 初始化顺序表// 插入元素InsertList(&L, 1, 10);InsertList(&L, 2, 20);InsertList(&L, 3, 30);PrintList(&L); // 输出:10 20 30// 删除元素DeleteList(&L, 2);PrintList(&L); // 输出:10 30// 查找元素int pos = FindList(&L, 30);if (pos != -1) {printf("元素 30 的位置:%d\n", pos); // 输出:元素 30 的位置:2}// 修改元素ModifyList(&L, 1, 100);PrintList(&L); // 输出:100 30return 0;
}
运行结果
顺序表内容:10 20 30
顺序表内容:10 30
元素 30 的位置:2
顺序表内容:100 30
4.优缺点:
优点:
-
随机访问:可以通过下标直接访问元素,时间复杂度为 O(1)O(1)。
-
存储效率高:数据存储在一段连续的内存中,不需要额外的指针空间。
缺点:
-
插入和删除效率低:需要移动大量元素,时间复杂度为 O(n)O(n)。
-
容量固定:顺序表的大小通常是固定的,扩容时需要重新分配内存并复制数据。
5.适用场景:
-
需要频繁访问元素,而插入和删除操作较少的场景。
-
数据量较小且已知最大容量的场景。
如果数据量较大或需要频繁插入和删除,可以考虑使用链表。