【 C 语言实现顺序表的基本操作】(数据结构)
C 语言实现顺序表的基本操作(入门教程)
1. 引言
顺序表(Sequential List)是一种 线性表 的存储结构,它使用 一段连续的内存空间 来存储数据。由于存储位置是连续的,顺序表支持 快速读取,但 插入和删除操作 可能涉及大量的数据移动,因此性能相对较低。本文将详细介绍 C 语言 下顺序表的基本操作,并提供完整的代码示例,供初学者学习。
2. 顺序表的基本概念
顺序表是 数组 在逻辑上的扩展,包含:
- 数据存储区(数组
data[]
):用于存放元素。 - 长度标记(变量
length
):记录当前顺序表的元素个数。
顺序表的特点
✅ 支持随机访问,即可以使用 O(1)
时间访问指定元素。
❌ 插入/删除操作复杂,需要移动大量元素,最坏情况时间复杂度为 O(n)
。
3. 顺序表的基本操作
接下来,我们使用 C 语言实现以下基本功能:
- 初始化顺序表
- 插入元素
- 删除元素
- 查找元素
- 打印顺序表
4. C 语言实现顺序表
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50 // 顺序表的最大容量
typedef int ElemType; // 定义数据类型
// 定义顺序表结构
typedef struct {
ElemType data[MaxSize]; // 存储数据的数组
int length; // 记录顺序表当前的长度
} SqList;
// 1. 初始化顺序表
void InitList(SqList *L) {
L->length = 0; // 初始长度为 0
}
// 2. 插入元素
int Insert(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1) { // 检查插入位置是否合法
printf("插入位置不合法!\n");
return 0;
}
if (L->length == MaxSize) { // 顺序表已满
printf("顺序表已满,无法插入!\n");
return 0;
}
for (int j = L->length; j >= i; j--) { // 从最后一个元素开始向后移动
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e; // 插入元素
L->length++; // 表长加 1
return 1;
}
// 3. 删除元素
int Delete(SqList *L, int i, ElemType *e) {
if (i < 1 || i > L->length) { // 检查删除位置是否合法
printf("删除位置不合法!\n");
return 0;
}
*e = L->data[i - 1]; // 取出被删除的元素
for (int j = i; j < L->length; j++) { // 从删除位置开始,后续元素前移
L->data[j - 1] = L->data[j];
}
L->length--; // 表长减 1
return 1;
}
// 4. 查找元素
int LocateElem(SqList L, ElemType x) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == x) {
return i + 1; // 返回逻辑位置(从 1 开始)
}
}
return 0; // 查找失败返回 0
}
// 5. 打印顺序表
void PrintList(SqList L) {
printf("顺序表当前元素:");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
// 主函数
int main() {
SqList L;
InitList(&L); // 初始化顺序表
// 插入一些数据
Insert(&L, 1, 10);
Insert(&L, 2, 20);
Insert(&L, 3, 30);
Insert(&L, 4, 40);
PrintList(L); // 输出:10 20 30 40
// 在第二个位置插入 15
Insert(&L, 2, 15);
PrintList(L); // 输出:10 15 20 30 40
// 删除第三个元素
ElemType e;
Delete(&L, 3, &e);
printf("删除的元素是:%d\n", e);
PrintList(L); // 输出:10 15 30 40
// 查找元素
int pos = LocateElem(L, 30);
if (pos) {
printf("元素 30 位于顺序表的第 %d 位置。\n", pos);
} else {
printf("元素 30 不在顺序表中。\n");
}
return 0;
}
5. 运行结果
顺序表当前元素:10 20 30 40
顺序表当前元素:10 15 20 30 40
删除的元素是:20
顺序表当前元素:10 15 30 40
元素 30 位于顺序表的第 3 位置。
6. 代码讲解
1️⃣ 初始化顺序表
void InitList(SqList *L) {
L->length = 0; // 初始长度为 0
}
- 这里的
SqList *L
代表传入 顺序表的指针,让函数可以直接修改结构体内容。
2️⃣ 插入操作
int Insert(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1) {
printf("插入位置不合法!\n");
return 0;
}
if (L->length == MaxSize) {
printf("顺序表已满,无法插入!\n");
return 0;
}
for (int j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
return 1;
}
- 先 检查插入位置是否合法,防止越界。
- 移动元素,确保插入元素后顺序不变。
- 更新
length
,插入完成后 表长+1。
3️⃣ 删除操作
int Delete(SqList *L, int i, ElemType *e) {
if (i < 1 || i > L->length) {
printf("删除位置不合法!\n");
return 0;
}
*e = L->data[i - 1];
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return 1;
}
- 先 保存被删除的元素,避免数据丢失。
- 移动元素,确保删除后顺序不变。
- 更新
length
,删除完成后 表长-1。
7. 总结
本文介绍了 C 语言实现顺序表 的基本操作,包括 插入、删除、查找和打印。
✅ 适合小白学习,理解顺序表的原理和实现方式。
⚠️ 需要注意 数据移动的影响,避免数组越界错误。
➡️ 顺序表适用于需要 快速访问 但插入删除较少的场景。如果需要频繁插入/删除数据,建议使用 链表 代替。💡