一篇文章快速搞懂顺序表的插入函数和删除函数

1.了解顺序表
1.1 首先,我们先要了解一下顺序表是什么?
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
各位小伙伴是不是看到这一段话仿佛被当头一棍,感觉整个人都不好了。
在这里插入图片描述
简单来说的话,就是将数组中的各个元素按顺序依次存放在顺序表的结点中。然后顺序表会将这些结点存放在内存中的一块地址连续的空间中。

就像下面图片表示的那样
图源:老九学堂

1.2 其次我们清楚顺序表的存储结构是什么?
顺序表的存储结构指的是一段地址连续的存储单元依次存储顺序表的数据元素

描述顺序表存储结构需要三个元素:

  1. 存储空间的起始位置:数组datas的存储位置
  2. 顺序表的最大存储容量:数组长度,MAX_SIZE
  3. 顺序表的当前长度

顺序表的存储结构:

//1.需要定义顺序表的最大存储空间
#define MAX_SIZE
//2.需要有统一类型的元素集合
typedef int ElemType;
typedef struct{
   
    int id,
    char * name;
}ElemenType;    //为元素集合起一个Element的别名
//3.定义结构
typedef struct{
   
    ElementType datas[MAX_SIZE];   //datas的最大容量为MAX_SIZE
    int length;    //顺序表的当前长度
}SeqList;    //结构的别名SeqList

1.3 最后我们再来看看计算机中的地址是如何计算的?
在计算机中:

  • 第n 个元素的内存地址 = 数组的内存地址 + 第n 个元素的下标
  • 这里还要解释一些两个名词position 和index
  1. position:位置,从1开始(就是下面图中的顺序存储数据元素);
  2. index:下标,从0开始(图中的下标)。
    图源:老九学堂

2.在顺序表中实现插入和删除
在了解了顺序表的一些基础知识之后,我们开始学习两个算法(插入算法和删除算法)

2.1 插入算法:
2.1.1 还是老样子,我们先来了解插入算法的原理是什么?

  • 将数据元素a 插入到顺序表(a_1, a_2, ····, a_n)因为打不出来下标,所以用下划线代替!下标为i 的位置
  • 下标为i 及下标为i 以后的所有数据元素后移;
  • 下标i 的位置放入数据元素a。

2.1.2 注意:

  • 插入元素后的顺序表长度要为n+1;
  • 插入元素后,最后一个元素的下标变为n;
  • C 语言数组实现时,顺序表长度不能超过它的最大长度;
  • 除非i = n + 1,否则必须移动数据元素的位置来适应逻辑结构的改变。
    图源:老九学堂

2.1.3 代码实现
首行注释为文件名,需要创建4个文件,默认的main.c、DataElement.h(用来定义数据元素)、SequenceList.h(定义函数)、SequenceList.c(实现函数)

//main.c
#include <stdio.h>
#include <stdlib.h>
#include "DataElement.h"

//测试数据
ElementType dataArray[] = {
   
    {
   1, "巴菲特"},
    {
   2, "比尔·盖茨"},
    {
   3, "乔布斯"}
};

//测试函数
void TestSequenceList();

int main()
{
   
    TestSequenceList();     //调用测试函数
    return 0;
}

void TestSequenceList()
{
   
    SeqList seqList;    //要操作的顺序表
    InitList(&seqList, dataArray, sizeof(dataArray) / sizeof(dataArray[0]));    //初始化顺序表
    //sizeof(dataArray) / sizeof(dataArray[0]) 用sizeof 来求出dataArray 数组的整个长度,再除以单个元素的长度,就得出了数组元素的个数。
    PrintfList(&seqList);   //打印顺序表
}

注意:
因为PrintList()方法的声明的第一个参数是SeqList * 类型,所以在调用PrintList()方法时,第一个参数应该为SeqList * 结构体指针类型,因此传入参数为&seqList。

//DataElement.h
#ifndef DATAELEMENT_H_INCLUDED
#define DATAELEMENT_H_INCLUDED

 //1.定义顺序表的最大空间
 #define MAX_SIZE 255

 //2.定义数据类型
 //typedef int ElementType;
 /*
  * datas = {
   {1, ""}, {2, ""}};
  */
 typedef struct{
   
    int id;
    char * name;
 }ElementType;

 //3.定义顺序表的结构
 typedef struct{
   
    ElementType datas[MAX_SIZE];    //表明顺序表的最大空间
    int length;                     //记录顺序表的长度
 }SeqList;
#endif // DATAELEMENT_H_INCLUDED
//SequenceList.h
#ifndef SEQUENCELIST_H_INCLUDED
#define SEQUENCELIST_H_INCLUDED

//要引用的头文件
#include <
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值