一、顺序表的定义
1、线性表的顺序存储又称顺序表,用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
2、连续的存储单元就是数组。
4、定义顺序表的数据结构
#define Maxsize 20 //顺序表的大小
typedef int Elemtype; //方便改变顺序表的中数据元素的类型
typedef struct{ //定义顺序表结构体
Elemtype data[Maxsize]; //用一段连续的空间即数组来存储顺序表
int length; //顺序表的长度
}Sqlist; //顺序表的类型定义
5、初始化:
Sqlist L;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.length = 3;
二、顺序表的插入
1、首先判断:插入的位置是否合理,若现在有三位数字,则插入的合理位置为第一位到第四位(最后一位的后面一位也可以插入),其次判断顺序表存储空间是否已满。
//首先要判断插入的位置是否合理
if(pos<1||pos>L.length+1) //L.length+1 即是顺序表最后一位的后面
{
return false;
}
if(L.length==Maxsize) //顺序表已满
{
return false;
}
2、移动元素:把要插入的位置的元素和以后的元素全部后移,用下标 i 记录每个元素后移后的位置,用前一个位置的元素覆盖,下标i 的范围应该是L.length到pos。这样的话,最后一位元素data[L.length-1]就移动到了L.length下标处,下标pos-1也就是我们实际要插入的位置,就移动到了pos下标处。
//移动元素
for(int i=L.length; i>=pos; i--) //用i记录顺序表中元素被移动后的新位置 当然是从L.length开始
{
L.data[i] = L.data[i-1]; //右边的元素被左边的元素覆盖 即元素后移
}
3、插入元素,并更新结构体。
L.data[pos-1] = new_data; //插入新元素
L.length++; //更新顺序表的长度
三、顺序表的删除
1、首先判断删除位置是否合理,若现在有三位元素,则能删除的位置自然是第一位到第三位,其次判断顺序表是否为空。
//判断删除的位置是否合理
if(pos<1||pos>L.length)
{
return false;
}
if(L.length==0) //顺序表是空的
{
return false;
}
2、移动元素,把要删除位置的元素的后面一位元素移动到要删除位置,就完成了元素的覆盖,也就删除了该元素,用下标 i 记录要移动的元素的位置,覆盖到前一位置,下标 i 的范围应该是pos到L.length,这样下标pos-1位置也就是实际要删除的位置的元素就被下标pos覆盖了,顺序表最后一位元素下标L.length-1就被下标L.length位置空元素覆盖了。
//移动元素
for(int i=pos; i<=L.length; i++) //i记录右边的元素 从pos-1元素开始被覆盖 也删除了第pos-1位
{
L.data[i-1] = L.data[i]; //左边的元素被右边的元素覆盖 即前移
}
3、更新结构体
L.length--; //更新顺序表的长度
四、顺序表的查询
1、遍历
2、判断
3、返回第一个满足条件的位置
for(int i=0;i<L.length;i++) //遍历
{
if(L.data[i]==data)
{
return i+1;
}
}
五、完整代码
#include <stdio.h>
#define Maxsize 20 //顺序表的大小
typedef int Elemtype; //方便改变顺序表的中数据元素的类型
typedef struct{ //定义顺序表结构体
Elemtype data[Maxsize]; //用一段连续的空间即数组来存储顺序表
int length; //顺序表的长度
}Sqlist; //顺序表的类型定义
//插入顺序表
bool insert_list(Sqlist &L, int pos, Elemtype new_data) //因为要改变顺序表的值所以要加引用&
{
//首先要判断插入的位置是否合理
if(pos<1||pos>L.length+1) //L.length+1 即是顺序表最后一位的后面
{
return false;
}
if(L.length==Maxsize) //顺序表已满
{
return false;
}
//移动元素
for(int i=L.length; i>=pos; i--) //用i记录顺序表中元素被移动后的新位置 当然是从L.length开始
{
L.data[i] = L.data[i-1]; //右边的元素被左边的元素覆盖 即元素后移
}
//移动结束 说明此时pos位置被pos-1覆盖了
L.data[pos-1] = new_data; //插入新元素
L.length++; //更新顺序表的长度
return true;
}
//删除
bool delete_list(Sqlist &L, int pos, Elemtype &backup) //backup 用来记录要删除的元素的值
{
//判断删除的位置是否合理
if(pos<1||pos>L.length)
{
return false;
}
if(L.length==0) //顺序表是空的
{
return false;
}
//移动元素
for(int i=pos; i<=L.length; i++) //i记录右边的元素 从pos-1元素开始被覆盖 也删除了第pos-1位
{
L.data[i-1] = L.data[i]; //左边的元素被右边的元素覆盖 即前移
}
L.length--; //更新顺序表的长度
return true;
}
//查询元素的位置
int located_list(Sqlist L, Elemtype data)
{
for(int i=0;i<L.length;i++) //遍历
{
if(L.data[i]==data)
{
return i+1;
}
}
return 0;
}
//打印顺序表
void print(Sqlist L)
{
for(int i=0;i<L.length;i++)
{
printf("%d ",L.data[i]);
}
}
int main()
{
//定义顺序表
Sqlist L;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.length = 3;
//插入
bool ret; //用来接收插入函数的返回值
ret = insert_list(L,4,90);
if(ret){
print(L);
printf("\n");
}else{
printf("error\n");
}
//删除
Elemtype backup; //用来存储要删除的那个元素
ret = delete_list(L,3,backup);
if(ret){
print(L);
printf("\n");
}else{
printf("error\n");
}
//查询元素的位置
int pos; //接收函数的返回值 所查询元素的位置
pos=located_list(L, 90);
if(pos)
{
printf("%d\n",pos);
}else{
printf("error\n");
}
return 0;
}