【数据结构与算法02】 顺序表

简介: 顺序存储:逻辑上相邻的元素存在地址相邻的区域内,每个元素占的空间都相等

线性表


定义


具有相同的数据类型的几个数据元素有限序列,其中n为表长,当n=0时线性表是空表,如下:



线性表的基本操作(创销、增删改查)


  1. InitList(&L):初始化表,构造空的线性表L,分配内存空间
  2. DestroyList(&L):销毁操作,销毁线性表,并释放空间
  3. ListInsert(&L,i,e):插入
  4. ListDelete(&L,i,e):删除
  5. LocateElem(L,e):按值查找
  6. GetElem(L,e):按位查找
  7. &L:取L的地址


什么时候传入引用&? --对参数的修改结果需要"带回来"


c49bf6ca3d059cca76b3acca43d27783.jpg


顺序表


逻辑上相邻,物理(地址)上也相邻


顺序存储:逻辑上相邻的元素存在地址相邻的区域内,每个元素占的空间都相等


Q:如何判断一个数据元素的大小


A:sizeof(x),x是数据类型,注意sizeof是C语言32个关键字之一


静态分配


8539ef32da57dcc9cd0b54037284ac9d.jpg


动态分配


f93f099923fbd876ec867828ded12047.jpg


动态申请和释放内存空间


malloc:开辟一片存储空间,返回一个空的指针


L.data=(ElemType *)malloc(sizeof(ElemType) *Initsize)


ElemType *:强制转型你定义的元素指针


例如:data的数据类型为int,则ElemType也应转为int类型


顺序表的特点


  1. 随机访问
  2. 存储密度高
  3. 扩展容量难


初始化顺序表


typedef struct {
  int *data;//指示动态分配数组的指针
  int MaxSize;//顺序表的最大容量
  int lenght;//顺序表的当前长度
} SeqList;
void InitList(SeqList &L) {
  //使用malloc申请一片连续的存储空间:sizeof(int)=4Byte
  L.data = (int *)malloc(InitSize * sizeof(int));
  L.lenght = 0;
  L.MaxSize = InitSize;
}


顺序表的插入删除查找


插入


Screenshot_20221002_085333.jpg


//插入
bool ListInsert(SeqList &L, int i, int e) {
  if (i < 1 || i > L.lenght + 1) {
    return false;
  }
  if (L.lenght > InitSize) {
    return false;
  }
  for (int j = L.lenght; j >= i; j--) {
    L.data[j] = L.data[j - 1];
  }
  L.data[i - 1] = e;
  L.lenght++;
  return true;
}


1.传入L,注意这里的L使用了😉&,所以是传入L的本身,而不是它的复制品


2.使用了一个for循环,让第i-1个元素之后的所有元素,都向后移动一位,同时也能逆向找到插入次序i


for (int j = L.lenght; j >= i; j--) {L.data[j] = L.data[j - 1];}


3.插入元素值,L.data[i - 1] = e;


删除


//删除
bool ListDelete(SeqList &L, int i, int &e) {
  printf("%d\n", i);
  if (i < 1 || i > L.lenght) {
    printf("%d", L.lenght);
    return false;
  }
  e = L.data[i - 1];
  for (int j = i; j < L.lenght; j++) {
    L.data[j - 1] = L.data[j];
  }
  L.lenght--;
  return true;
}


查找


2c4bb9a6f9b336c0e1175dfff90656fb.jpg

相关文章
|
11天前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
43 2
|
13天前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
24 6
|
13天前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
18 3
|
13天前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
17 2
|
16天前
|
存储 算法 索引
【数据结构】——顺序表
【数据结构】——顺序表
|
16天前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
18 1
|
17天前
|
存储
数据结构1——顺序表
数据结构1——顺序表
16 1
|
5天前
|
存储
数据结构(顺序表)
数据结构(顺序表)
11 0
|
6天前
|
存储 算法
【数据结构】新篇章 -- 顺序表
【数据结构】新篇章 -- 顺序表
6 0
|
1月前
|
存储 Java 程序员
【数据结构】初识集合&深入剖析顺序表(Arraylist)
Java集合框架主要由接口、实现类及迭代器组成,包括Collection和Map两大类。Collection涵盖List(有序、可重复)、Set(无序、不可重复),Map则由键值对构成。集合通过接口定义基本操作,具体实现由各类如ArrayList、HashSet等提供。迭代器允许遍历集合而不暴露其实现细节。List系列集合元素有序且可重复,Set系列元素无序且不可重复。集合遍历可通过迭代器、增强for循环、普通for循环及Lambda表达式实现,各有适用场景。其中ArrayList实现了动态数组功能,可根据需求自动调整大小。
34 11