2.2顺序表的增删改查
数据结构
2.1线性表的定义和基本操作
InitList(&L):初始化表。
DestroyList(&L):销毁表。
ListInsert(&L,i,e):插入操作。
ListDelete(&L,i,e):删除操作。
LocalElem(L,e):按值查找操作。
GetElem(L,i):按位查找操作。
Length(L):求表长
PrintList(L):输出操作
Empty(L):判空操作
Tips:
- 对数据的操作(记忆思路) --创销、增删改查
- c语言函数的定义 -- <返回值类型> 函数名 (<参数1类型> 参数1,<参数2类型> 参数2)
- 实际开发中,可根据实际需求定义其他的基本操作
- 函数名和参数的形式、命名都可以改变
- 什么时候要传入引用“&” --对参数的修改结果需要 带回来

2.2.1顺序表的定义
顺序表的实现--静态分配
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
#include <stdio.h>
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}Sqlist;
void InitList(Sqlist &L){
for(int i=0;i<Maxsize;i++);
L.data[i]=0;
L.length=0;
}
int main(){
Sqlist L;
InitList(L);
return(0);
}
顺序表的实现--动态分布
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}Sqlist;//顺序表的类型定义(动态分配方式)
//c -- malloc、free函数
// L.data=(Elemtype *)malloc(sizeof(ElemType)* InitSize)
//malloc函数返回一个指针,需要强制转型为你定义的数据元素类型指针
//malloc函数的参数,指明要分配多大的连续内存空间
//C++ -- new、detelt关键字
#include <stdio.h>
#define InitSize 10
typedef struct{
ElemType *data;
int MaxSize;
int length;
}Sqlist;
void InitList(Sqlist &L){
L.data = (int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize=InitSize;
}
void IncreaseSize(Sqlist &L,int len){
int *p=L.data;
L.data=(int *)malloc((L.maxSize+len)*sizeof(int));
for(int i=1:i<L.length;i++){
L.data[i]=p[i];
}
L.MaxSize=L.MaxSize+len;
free(p);
}
int main(){
Sqlist L;
InitList(L);
IncreaseSize(L,5);
return(0);
}


2.2.2_1顺序表的插入删除
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}SqList;
void ListInsert(SqList &L,int i,int e){
for(int j=L.length;j>=i;j--)
L.data[j] = L.data[j-1];
L.data[i-1] = e;
L.length++;
}
int main(){
SqList(L);
InitList(L);
ListInsert(L,3,3);
return 0;
}
豆包后可执行
#include <stdio.h>
#define MaxSize 10
typedef struct {
int data[MaxSize];
int length;
} SqList;
bool ListInsert(SqList &L, int i, int e) {
if (i < 1 || i > L.length + 1)
return false;
if (L.length >= MaxSize)
return false;
int j;
for (j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1];
L.data[j] = e;
L.length++;
return true;
}
// 打印顺序表
void PrintList(SqList L) {
for (int k = 0; k < L.length; k++)
printf("%d ", L.data[k]);
printf("\n");
}
int main() {
SqList L;
L.length = 0;
ListInsert(L, 1, 10);
ListInsert(L, 2, 20);
ListInsert(L, 2, 15);
PrintList(L); // 输出:10 15 20
return 0;
}
时间复杂度:O(n)
删除
bool ListDelete(SqList &L,int i,int &e){
if(i<1||i>L.length)//判断i的范围是否有效
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++)//将被删除的元素赋值给e
L.data[j-1]=L.data[j];//将第i个位置后的元素前移
L.length--;//线性表长度减一
return true;
}
int main(){
SqList L;//声明一个顺序表
InitList(L);//初始化顺序表
//。。。此处省略一些代码,插入几个元素
int e = -1;//用变量e把删除的元素带回来
if(ListDelete(L,3,e))
printf("已删除第三个数,删除元素值为=%d\n",e);
else
printf("位序不合法,删除失败\n");
return 0;
}
豆包后
#include <stdio.h>
#define MaxSize 10
typedef struct {
int data[MaxSize];
int length;
} SqList;
// 初始化顺序表
void InitList(SqList &L) {
L.length = 0; // 一开始长度为0
}
// 顺序表删除:删除第 i 个元素,用 e 返回被删元素
bool ListDelete(SqList &L, int i, int &e) {
// 1. 判断位序是否合法
if (i < 1 || i > L.length)
return false; // 你之前写成 flase,已修复
// 2. 把被删除的元素存起来
e = L.data[i - 1];
// 3. 元素前移
for (int j = i; j < L.length; j++)
L.data[j - 1] = L.data[j];
// 4. 长度减一
L.length--;
return true;
}
int main() {
SqList L;
InitList(L);
// 手动插入几个元素方便测试
L.data[0] = 11;
L.data[1] = 22;
L.data[2] = 33;
L.data[3] = 44;
L.length = 4; // 当前有 4 个元素
int e = -1;
// 删除第 3 个元素(值为33)
if (ListDelete(L, 3, e))
printf("已删除第3个元素,删除元素值为 = %d\n", e); // 中文分号已修复
else
printf("位序不合法,删除失败\n");
return 0;
}
时间复杂度O(n)

2.2.2_2顺序表的查找
GetElem(L,i):按位查找
#define MaxSize 10//定义最大长度
typedef struct{
ElemType data[MaxSize];//用静态的数组存放数据元素
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义(静态分配的方式)
ElemType GetElem(SqList L,int i){
return L.data[i-1];
}
#动态分配方式的顺序表(动态顺序表)
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义(动态分配方式)
ElemType GetElem(SqList L,int i){
return L.data[i-1];
}

顺序表的按值查找
LocateElem(L,e):按值查找
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}SeqList;//顺序表的类型定义(动态分配方式)
//在顺序报L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L,ElemType e){
for (int i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;//数组下标为i的元素值等于e,返回其位序i+1
return 0;//退出循环,说明查找失败
}
结构体无法直接用==进行比较 需要依次对比各个分量来判断两个结构体是否相等

时间复杂度O(n)

豆包增删改查完全版
#include <stdio.h>
#define MaxSize 10 // 顺序表最大容量
typedef int ElemType; // 数据元素类型(存整数)
// 1. 顺序表结构体定义(静态分配)
typedef struct {
ElemType data[MaxSize];
int length; // 当前元素个数
} SqList;
// 2. 初始化顺序表
void InitList(SqList &L) {
L.length = 0; // 最开始没有元素
}
// 3. 判空
bool IsEmpty(SqList L) {
return L.length == 0;
}
// 4. 判满
bool IsFull(SqList L) {
return L.length >= MaxSize;
}
// ===================== 【增】插入 =====================
// 在第 i 个位置插入元素 e,成功返回true,失败false
bool ListInsert(SqList &L, int i, ElemType e) {
// 位置非法 / 表满 → 不能插
if (i < 1 || i > L.length + 1) return false;
if (IsFull(L)) return false;
// 从后往前挪,腾出位置
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e; // 插入新元素
L.length++;
return true;
}
// ===================== 【删】删除 =====================
// 删除第 i 个元素,用 e 返回被删元素
bool ListDelete(SqList &L, int i, ElemType &e) {
if (i < 1 || i > L.length) return false; // 位置非法
if (IsEmpty(L)) return false;
e = L.data[i - 1]; // 保存被删元素
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j]; // 前移覆盖
}
L.length--;
return true;
}
// ===================== 【查】按位查找 =====================
// 获取第 i 个元素的值
ElemType GetElem(SqList L, int i) {
if (i < 1 || i > L.length) return -1; // 非法返回-1
return L.data[i - 1];
}
// ===================== 【查】按值查找 =====================
// 查找第一个值等于 e 的元素,返回位序,找不到返回0
int LocateElem(SqList L, ElemType e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i + 1; // 下标→位序
}
}
return 0;
}
// ===================== 【改】按位修改 =====================
// 修改第 i 个元素为 e
bool UpdateElem(SqList &L, int i, ElemType e) {
if (i < 1 || i > L.length) return false;
L.data[i - 1] = e;
return true;
}
// ===================== 打印顺序表 =====================
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);
// 插入
ListInsert(L, 1, 10);
ListInsert(L, 2, 20);
ListInsert(L, 2, 15);
PrintList(L); // 10 15 20
// 删除
int e;
ListDelete(L, 2, e);
printf("删除元素:%d\n", e); // 15
PrintList(L); // 10 20
// 按位查找
printf("第1个元素:%d\n", GetElem(L, 1)); // 10
// 按值查找
printf("值为20的位序:%d\n", LocateElem(L, 20)); // 2
// 修改
UpdateElem(L, 2, 99);
PrintList(L); // 10 99
return 0;
}

浙公网安备 33010602011771号