顺序表的插入、删除
顺序表的插入、删除
顺序表——线性表的顺序表示
顺序表的定义
#define MAX_SIZE 50 //定义线性表的长度
typedef int ElemType; //借用王道的重命名
typedef struct {
ElemType data[MAX_SIZE]; //顺序表的元素 => 数组表示
int length; // 顺序表当前的长度
}SqList; //顺序表的类型定义
可视化显示一个顺序表
优缺点
优点
- 可以随机存取(根据表头元素地址和元素序号)表中的任意一个元素。
- 存储密度高,每个节点只存储数据元素。
缺点
- 插入和删除操作需要移动大量元素.
- 线性表变化较大时,难以确定存储空间的容量.
- 存储分配需要一段连续的存储空间,不够灵活.占用一大段连续的内存,产生大量的碎片
顺序表的插入
顺序表的插入方式采用遍历插入的方法
比如
i = 2
向上面的例子中插入:
开始移动,第一次将顺序表中的最后一个元素向后移动一位
直到
i = 2
位置的元素空出来
然后将需要插入的元素放到指定位置,最后
L.length ++
/**
* 顺序表的插入操作,返回布尔类型
* SqList &L 顺序表,需要改变L,使用引用
* int i 插入的位置,即下标+1,规定用法
* ElemType element 需要插入的元素
**/
bool insertSqList(SqList &L, int i, ElemType element)
{
//判断i的合法性
if(i < 1 || i > L.length || L.length == MAX_SIZE) return false;
for(int j = L.length; j >= i; j --){
L.data[j] = L.data[j - 1]; //将顺序表的元素从表尾到i依次向后移动一位
}
L.data[i - 1] = element;//将空出的位置放入element
L.length ++; //当前长度+1;
return true;
}
顺序表的删除操作
根据顺序表的插入元素,可以知道插入操作是将顺序表的元素从
L.length
位置到i
位置依次向后移动一位;
那么可以推想出删除的操作就是
从需要删除的位置(i)到最后一个元素的位置(L.length)依次向前移动一个位置
,通俗的讲就是用后面的元素把前面的元素给覆盖掉!
/**
* 顺序表的删除操作
* SqList &L 顺序表,需要改变L,使用引用
* int i 插入的位置,即下标+1,规定用法
* ElemType &delElement 存储被删除的元素
**/
bool listDelete(SqList &L, int i, ElemType &delElement)
{
//判断删除的位置i是否合法
if(i < 1 || i > L.length) return false;
delElement = L.data[i - 1]; //存储被删除的元素
for(int j = i; j <= L.length; j ++){
L.data[j - 1] = L.data[j];//将顺序表中的元素从i到L.length依次向前移动一位
}
L.length --;
return true;
}
演示例子
初始化顺序表(顺序表中元素为整型),里边的元素是1,2,3,然后通过scanf读取一个元素(假如插入的是6),插入到第2个位置,打印输出顺序表,每个元素占3个空格,格式为1 6 2 3,然后scanf读取一个整型数,是删除的位置(假如输入为1),然后输出顺序表 6 2 3,假如输入的位置不合法,输出false字符串。
#include <stdio.h>
#include <stdbool.h>
#define MaxSize 50
typedef int ElemType; //类型定义
typedef struct{
ElemType data[MaxSize];
int length; //顺序表当前的长度
}SqList; //顺序表的类型定义
//顺序表的插入操作
bool insertList(SqList &L, int i, ElemType in_elem)
{
if(i < 0 || i > L.length || L.length == MaxSize) return false;
for(int j = L.length; j >= i; j --){
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = in_elem;
L.length ++;
return true;
}
//顺序表的删除操作
bool deleteList(SqList &L, int i)
{
if(i < 0 || i > L.length) return false;
for(int j = i; j <= L.length; j ++){
L.data[j - 1] = L.data[j];
}
L.length --;
return true;
}
void printSqList(bool ret, SqList L)
{
if(ret){
for(int i = 0; i < L.length; i++){
printf(" %d", L.data[i]);
}
printf("\n");
}
else printf("false\n");
}
int main()
{
SqList L;
ElemType in_elem; //需要插入顺序表的元素
int i;
// ElemType del_elem; //删除顺序表中的元素的复制值
bool ret; //判断插入或删除操作的返回值
L.data[0] = 1; L.data[1] = 2; L.data[2] = 3;
L.length = 3;
scanf("%d", &in_elem); //键盘输入需要插入的元素
scanf("%d", &i);
ret = insertList(L, 2, in_elem);
printSqList(ret, L);
ret = deleteList(L, i);
printSqList(ret, L);
return 0;
}