王道考研|笔记&补充线性表之顺序表

Posted 鸭梨大吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道考研|笔记&补充线性表之顺序表相关的知识,希望对你有一定的参考价值。

定义线性表是具有相同数据类型的n个数据元素(int,float,struct...)的有限序列

特点除第一个元素外,每个元素有且仅有一个直接前驱除最后一个元素外,每个元素有且仅有一个直接后继顺序表用顺序存储的方式实现线性表--(逻辑相邻的元素物理位置相邻


定义结构

#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;
/*因为数据项里有length记录了存放了多少数据,操作的一般是存放的数据,而非整个开辟的空间,而存放的时候即给data[i]赋值了,因此对data[i]的初始化其实是可以省略掉的*/

void InitList(SqList &L)
L.length = 0;
  • 插入(插入位置之后的元素i~n-1都得后移一位,注意先移动最后的n-1到n,即从后往前移动需要后移的数据元素,否则会发生数据元素覆盖)(提高代码的健壮性:考虑空间不足时无法插入或者空间足够但插入位置不合法)
//在第i个位置(次序)上插入元素e
bool ListInsert(SqList &L, int i, int e)
if (L.length >= MaxSize) //存储空间已满
return false;
if (i<1 || i>L.length + 1) //插入位置不合理
return false;
for (int j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1]; //后移
L.data[i - 1] = e; //次序i,即下标i-1
L.length++;
return true;
  • 删除(删除位置之后的元素i~n-1都得前移一位,直接从前往后依次前移覆盖掉要删除的元素即可)
//将第i位元素删除,并获取被删除的这个元素
bool ListDelete(SqList &L, int i, int &e)
if (i<1 || i>L.length)
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;
  • 查找
  • 因为存储的是相同数据类型的元素,所有每个元素的大小是相同的,c语言提供sizeof()来计算一个数据元素的大小。**假设第一个元素的地址是loc,那么第n个元素的地址是loc+(n-1)*sizeof(ElemType)**


  • 按位查找:
//查找-按位查找第i个元素(次序)
int GetElem(SqList L, int i)
return L.data[i - 1];
  • 按值查找:
//查找-按值查找元素值为e的第一个出现的元素,返回其次序
int LocateElem(SqList L, int e)
for (int i = 0; i < L.length; i++)
if (L.data[i] == e)
return i + 1; //注意要求是返回次序

return -1; //查找失败,该元素不存在

完整代码

//构造数据元素
#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;

//在第i个位置(次序)上插入元素e
bool ListInsert(SqList &L, int i, int e)
if (L.length >= MaxSize) //存储空间已满
return false;
if (i<1 || i>L.length + 1) //插入位置不合理
return false;
for (int j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1]; //后移
L.data[i - 1] = e; //次序i,即下标i-1
L.length++;
return true;

//将第i位元素删除,并获取被删除的这个元素
bool ListDelete(SqList &L, int i, int &e)
if (i<1 || i>L.length)
return (王道408考研数据结构)第二章线性表-第二节1:顺序表的定义

(王道408考研数据结构)第二章线性表-第二节2:顺序表的操作

(王道408考研数据结构)第二章线性表-第三节5:顺序表和链表的比较

线性表之顺序存储结构(顺序表)

(王道408考研数据结构)第七章查找-第二节1:顺序查找及其优化

数据结构之顺序表