顺序表(增删查改)

简介: 顺序表(增删查改)

一、什么是顺序表


顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。换句话说就是一个动态开辟的数组,然后用一个结构体来封装这一个动态数组,再增加两个结构体成员记录数组中保存数据的情况。


二、顺序表的增删查改


2.1 结构体的声明


typedef int SLDataType;
typedef struct SeqList
{
  SLDataType* data;
  int sz;
  int capacity;
}SL;


2.2 顺序表的初始化


void SeqListInit(SL* ps)
{
  assert(ps);
  ps->data = (SLDataType*)malloc(sizeof(SLDataType) * 4);
  if (ps->data == NULL)
  {
    perror("malloc fail");
    return;
  }
  ps->capacity = 4;
  ps->sz = 0;
}


2.3 顺序表检查容量


void check_capacity(SL* ps)
{
  assert(ps);
  if (ps->capacity == ps->sz)
  {
    SLDataType* tmp = (SLDataType*)realloc(ps->data, sizeof(SLDataType) * ps->capacity * 2);
    if (tmp == NULL)
    {
      perror("realloc fail");
      return;
    }
    ps->data = tmp;
    ps->capacity *= 2;
  }
}


2.4 顺序表尾部插入数据


void SeqListPushBack(SL* ps,SLDataType x)
{
  /*assert(ps);
  check_capacity(ps);
  ps->data[ps->sz] = x;
  ps->sz++;*/
  SeqListInsert(ps, ps->sz, x);
}


2.5 顺序表头部插入数据


void SeqListPushFront(SL* ps, SLDataType x)
{
  /*assert(ps);
  check_capacity(ps);
  int i = ps->sz - 1;
  for (i; i >= 0; i--)
  {
    ps->data[i + 1] = ps->data[i];
  }
  ps->data[0] = x;
  ps->sz++;*/
  SeqListInsert(ps, 0, x);
}


2.6 顺序表尾部删除数据


void SeqListPopBack(SL* ps)
{
  /*assert(ps);
  assert(ps->sz > 0);
  ps->sz--;*/
  SeqListErase(ps, ps->sz - 1);
}


2.7 顺序表头部删除数据


void SeqListPopFront(SL* ps)
{
  /*assert(ps);
  assert(ps->sz > 0);
  int i = 0;
  for (i = 0; i < ps->sz - 1; i++)
  {
    ps->data[i] = ps->data[i + 1];
  }
  ps->sz--;*/
  SeqListErase(ps, 0);
}


2.8 顺序表查找数据


int SeqListFind(SL* ps, SLDataType x)
{
  assert(ps);
  int i = 0;
  for (i = 0; i < ps->sz; i++)
  {
    if (ps->data[i] == x)
    {
      printf("找到了,下标为:%d\n", i);
      return i;
    }
  }
  printf("找不到!\n");
  return -1;
}


2.9 顺序表任意位置插入数据


void SeqListInsert(SL* ps, int pos, SLDataType x)
{
  assert(ps);
  assert(pos >= 0 && pos <= ps->sz);
  check_capacity(ps);
  int i = 0;
  for (i = ps->sz - 1; i >= pos; i--)
  {
    ps->data[i + 1] = ps->data[i];
  }
  ps->data[pos] = x;
  ps->sz++;
}


2.10 顺序表任意位置删除数据


void SeqListErase(SL* ps, int pos)
{
  assert(ps);
  assert(pos >= 0 && pos < ps->sz);
  int i = 0;
  for (i = pos; i < ps->sz - 1; i++)
  {
    ps->data[i] = ps->data[i + 1];
  }
  ps->sz--;
}


2.11 顺序表打印数据


void Print(SL* ps)
{
  assert(ps);
  int i = 0;
  for (i = 0; i < ps->sz; i++)
  {
    printf("%d ", ps->data[i]);
  }
  printf("\n");
}


2.12 顺序表销毁


void SeqListDestroy(SL* ps)
{
  assert(ps);
  free(ps->data);
  ps->data = NULL;
  ps->capacity = ps->sz = 0;
}


三、顺序表汇总


SeqList.h


#pragma once
/
//SeqList.h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLDataType;
typedef struct SeqList
{
  SLDataType* data;
  int sz;
  int capacity;
}SL;
//函数声明
extern void SeqListInit(SL* ps);
extern void SeqListDestroy(SL* ps);
extern void SeqListPushBack(SL* ps, SLDataType x);
extern void SeqListPushFront(SL* ps, SLDataType x);
extern void SeqListPopBack(SL* ps);
extern void SeqListPopFront(SL* ps);
extern void Print(SL* ps);
extern int SeqListFind(SL* ps, SLDataType x);
extern void SeqListInsert(SL* ps, int pos, SLDataType x);
extern void SeqListErase(SL* ps, int pos);


SeqList.c


#define _CRT_SECURE_NO_WARNINGS 1
/
//SeqList.c
#include "SeqList.h"
void SeqListInit(SL* ps)
{
  assert(ps);
  ps->data = (SLDataType*)malloc(sizeof(SLDataType) * 4);
  if (ps->data == NULL)
  {
    perror("malloc fail");
    return;
  }
  ps->capacity = 4;
  ps->sz = 0;
}
void SeqListDestroy(SL* ps)
{
  assert(ps);
  free(ps->data);
  ps->data = NULL;
  ps->capacity = ps->sz = 0;
}
void check_capacity(SL* ps)
{
  assert(ps);
  if (ps->capacity == ps->sz)
  {
    SLDataType* tmp = (SLDataType*)realloc(ps->data, sizeof(SLDataType) * ps->capacity * 2);
    if (tmp == NULL)
    {
      perror("realloc fail");
      return;
    }
    ps->data = tmp;
    ps->capacity *= 2;
  }
}
void SeqListPushBack(SL* ps,SLDataType x)
{
  /*assert(ps);
  check_capacity(ps);
  ps->data[ps->sz] = x;
  ps->sz++;*/
  SeqListInsert(ps, ps->sz, x);
}
void Print(SL* ps)
{
  assert(ps);
  int i = 0;
  for (i = 0; i < ps->sz; i++)
  {
    printf("%d ", ps->data[i]);
  }
  printf("\n");
}
void SeqListPushFront(SL* ps, SLDataType x)
{
  /*assert(ps);
  check_capacity(ps);
  int i = ps->sz - 1;
  for (i; i >= 0; i--)
  {
    ps->data[i + 1] = ps->data[i];
  }
  ps->data[0] = x;
  ps->sz++;*/
  SeqListInsert(ps, 0, x);
}
void SeqListPopBack(SL* ps)
{
  /*assert(ps);
  assert(ps->sz > 0);
  ps->sz--;*/
  SeqListErase(ps, ps->sz - 1);
}
void SeqListPopFront(SL* ps)
{
  /*assert(ps);
  assert(ps->sz > 0);
  int i = 0;
  for (i = 0; i < ps->sz - 1; i++)
  {
    ps->data[i] = ps->data[i + 1];
  }
  ps->sz--;*/
  SeqListErase(ps, 0);
}
int SeqListFind(SL* ps, SLDataType x)
{
  assert(ps);
  int i = 0;
  for (i = 0; i < ps->sz; i++)
  {
    if (ps->data[i] == x)
    {
      printf("找到了,下标为:%d\n", i);
      return i;
    }
  }
  printf("找不到!\n");
  return -1;
}
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
  assert(ps);
  assert(pos >= 0 && pos <= ps->sz);
  check_capacity(ps);
  int i = 0;
  for (i = ps->sz - 1; i >= pos; i--)
  {
    ps->data[i + 1] = ps->data[i];
  }
  ps->data[pos] = x;
  ps->sz++;
}
void SeqListErase(SL* ps, int pos)
{
  assert(ps);
  assert(pos >= 0 && pos < ps->sz);
  int i = 0;
  for (i = pos; i < ps->sz - 1; i++)
  {
    ps->data[i] = ps->data[i + 1];
  }
  ps->sz--;
}


test.c


#define _CRT_SECURE_NO_WARNINGS 1
/
//test.c
#include "SeqList.h"
void test_SeqListPushBack(void)
{
  SL sl;
  SeqListInit(&sl);
  SeqListPushBack(&sl, 1);
  SeqListPushBack(&sl, 2);
  SeqListPushBack(&sl, 3);
  SeqListPushBack(&sl, 4);
  SeqListPushBack(&sl, 5);
  SeqListInsert(&sl, 2, 9);
  SeqListErase(&sl, 3);
  Print(&sl);
  SeqListFind(&sl, 4);
}
void test_SeqListPushFront(void)
{
  SL sl;
  SeqListInit(&sl);
  SeqListPushFront(&sl, 1);
  SeqListPushFront(&sl, 2);
  SeqListPushFront(&sl, 3);
  SeqListPushFront(&sl, 4);
  SeqListPushFront(&sl, 5);
  Print(&sl);
}
void test_SeqListPopBack(void)
{
  SL sl;
  SeqListInit(&sl);
  SeqListPushBack(&sl, 1);
  SeqListPushBack(&sl, 2);
  SeqListPushBack(&sl, 3);
  SeqListPushBack(&sl, 4);
  SeqListPushBack(&sl, 5);
  Print(&sl);
  SeqListPopFront(&sl);
  Print(&sl);
  SeqListPopFront(&sl);
  Print(&sl);
  SeqListPopFront(&sl);
  Print(&sl);
  SeqListPopFront(&sl);
  Print(&sl);
  SeqListPopFront(&sl);
  Print(&sl);
}
int main()
{
  //test_SeqListPushBack();
  //test_SeqListPushFront();
  test_SeqListPopBack();
  return 0;
}
相关文章
|
7月前
|
安全 网络安全 数据安全/隐私保护
Windows Server 2025 Active Directory 重置用户密码
密码重置是管理员日常任务之一,用户因忘记或多次输错密码导致账户锁定时需进行重置。本文介绍在Active Directory服务器上重置密码的三种方法。
491 3
|
8月前
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
215 69
|
6月前
|
人工智能 JavaScript 安全
一文彻底搞清楚HarmonyOS NEXT中的this
程序员Feri是一位拥有12年+经验的开发者,擅长Java、嵌入式、鸿蒙、人工智能等领域。本文深入探讨了ArkTS中this关键字的重要性及其核心规则。通过分析组件方法、异步回调、@Builder上下文隔离和装饰器方法中的this指向,揭示其运行机制与常见陷阱。同时提供了高阶技巧如内存管理、函数式组件优化及性能对比,并总结调试指南与最佳实践,助你构建高性能HarmonyOS NEXT应用。
217 8
|
NoSQL C# 数据库
使用c#对MongoDB进行查询(1)
1.BsonDocument对象     在MongoDB.Bson命名空间下存在一个BsonDocument类,它是MongoDB的文档对象,代表着MongoDB中不规则数据一条条实体模型。可以使用BsonDocument对不规则数据进行操作,这个类型继承了IEnumberable类,也就是说又将...
2516 0
|
9月前
|
人工智能 Java 程序员
HarmonyOS实战开发之HMRouter实现跳转
本文介绍了HarmonyOS页面跳转的两种方式:组件导航(Navigation)和页面路由(@ohos.router),并推荐使用更灵活的组件导航。进一步详细讲解了HMRouter,一个解决HarmonyOS页面跳转问题的框架,其功能包括页面跳转、弹窗提示、转场动效等。通过下载依赖、配置插件、初始化和实现跳转四个步骤,可以轻松集成HMRouter,实现高效页面管理。文章还展示了具体代码示例和效果截图,帮助开发者快速上手。关注Feri,带你掌握鸿蒙开发技巧!
532 1
|
10月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
310 3
|
11月前
|
SQL 分布式计算 Hadoop
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
380 2
|
10月前
|
存储 人工智能 大数据
物联网、大数据、云计算、人工智能之间的关系
物联网、大数据、云计算、人工智能之间的关系是紧密相连、相互促进的。这四者既有各自独立的技术特征,又能在不同层面上相互融合,共同推动信息技术的发展和应用。
2853 0
|
Prometheus 监控 关系型数据库
监控数据的几种采集方式
【1月更文挑战第14天】
|
XML NoSQL Linux
内存泄漏专题(3)内存泄漏调试神器valgrind
内存泄漏专题(3)内存泄漏调试神器valgrind
263 0