实现的功能
int getLength(SqList &L)//获取表长
void initList(SqList &L)//初始化一个顺序表
bool isEmpty(SqList &L)//判断是否为空
void listDisplay(SqList &L)//输出顺序表
void clearList(SqList &L)//清空顺序表
bool listInsert(SqList &L, int i, int e)//插入操作
bool listDelete(SqList &L,int i, int &e)//删除操作
int getElem(SqList L, int i)//按位查找操作
int locateElem(SqList L,int e)//按值查找
静态实现
静态实现要求顺序表不可扩展,所以其存储结构使用数组进行存储即可。
typedef struct {
int data[MaxSize]; //用静态的“数组”存放数据元素
int length; //顺序表当前长度
}SqList; //顺序表类型定义
完整代码:
/*
Name:LinerList_Static(静态实现顺序表)
Copyright:
Author: Sdjzu_Nxy
Date: 2021 年 7 月 20 日
Description:
*/
#include<stdio.h>
#include<stdbool.h>
#define MaxSize 10 //定义最大长度
typedef struct {
int data[MaxSize]; //用静态的“数组”存放数据元素
int length; //顺序表当前长度
}SqList; //顺序表类型定义
//获取表长
int getLength(SqList &L){
return L.length;
}
//初始化一个顺序表
void initList(SqList &L){
for(int i = 0;i < MaxSize; i++ ){
L.data[i] = 0; //所有元素设置为默认初始值
}
L.length = 0; //顺序表初始长度为0
}
/*
初始化一个顺序表
void initList(SqList &L){
L.length = 0; //顺序表初始长度为0,内存中会存在脏数据
}
*/
//判断是否为空
bool isEmpty(SqList &L){
return L.length == 0 ? true : false;
}
//输出顺序表
void listDisplay(SqList &L){
printf("\n");
for(int i = 0; i < L.length; i++){
printf("%d:%d\t",i + 1,L.data[i]);
}
printf("\n");
}
//清空顺序表
void clearList(SqList &L){
for(int i = 0;i < L.length;i++){
L.data[i] = NULL;
}
L.length = 0;
}
//插入操作
bool listInsert(SqList &L, int i, int e){
if(i < 1 || i > L.length + 1){ //判断i的范围是否有效
return false;
}
if(L.length >= MaxSize){
return false;
}
for(int j = L.length; j >= i; j-- ){
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
//删除操作
bool listDelete(SqList &L,int i, int &e){
if(i < 1 || i > L.length + 1){ //判断i的范围是否有效
return false;
}
e = L.data[i - 1]; //被删除的元素赋值给e
for(int j = i; j < L.length; j++){ //将第i个位置后的元素前移
L.data[j - 1] = L.data[j];
}
L.length--; //线性表长度减一
return true;
}
//按位查找操作
int getElem(SqList L, int i){
return L.data[i-1];
}
//按值查找
int locateElem(SqList L,int e){
for(int i = 0;i < L.length;i++){
if(L.data[i] == e){
return i+1; //数组下标为i的元素值等于e,返回其位序i+1 //退出循环,说明查找失败
}
}
return 0;
}
int main(){
int i;
SqList L; //创建一个顺序表
initList(L); //初始化顺序表
//插入测试
listInsert(L, 1, 1);
listInsert(L, 2, 2);
listInsert(L, 3, 3);
listInsert(L, 4, 4);
//判断表是否为空
printf("The lis is empty? %d.\n",isEmpty(L));
//删除测试
int e = -1;
bool flag = listDelete(L, 1, e);
if (flag){
printf("The delete element is %d.\n",e);
}
else{
printf("Illegal deletion of location element!\n");
}
//输出
listDisplay(L);
//按位查找测试
printf("Get elem is %d.\n",getElem(L,3));
//按值查找测试
printf("Get elem index is %d.\n",locateElem(L,e));
//输出
listDisplay(L);
//输出表长
printf("Get list length is %d.\n",getLength(L));
//清空表
clearList(L);
listDisplay(L);
//判断表是否为空
printf("The lis is empty? %d.\n",isEmpty(L));
return 0;
}
运行结果
动态实现
动态实现要求存储大小可动态扩展,所以需要使用指针进行操作,并加入当前最大长度变量,而后根据实际需求进行修改。
typedef struct {
int *data;
int MaxSize; //顺序表当前存放的最大长度
int length; //顺序表当前长度
}SqList; //顺序表类型定义
此外还需要再扩展动态增加顺序表长度的功能。
//增加动态数组长度
void increaseSize(SqList &L, int len){
int *p = L.data;
L.data = (int *)malloc((L.MaxSize + len)*sizeof(int));
for(int i = 0;i < L.length;i++){
L.data[i] = p[i]; //将数据复制到新区域
}
L.MaxSize = L.MaxSize + len; //顺序表最大长度增加 len
free(p); //释放原来的内存空间
}
完整代码:
/*
Name:LinerList_Dynamic(动态实现顺序表)
Copyright:
Author: Sdjzu_Nxy
Date: 2021 年 7 月 20 日
Description:
*/
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define InitSize 3 //定义最大长度
typedef struct {
int *data;
int MaxSize; //顺序表当前存放的最大长度
int length; //顺序表当前长度
}SqList; //顺序表类型定义
//获取表长
int getLength(SqList &L){
return L.length;
}
//初始化一个顺序表
void initList(SqList &L){
//用malloc函数申请一块连续存储空间
L.data = (int *)malloc(InitSize*sizeof(int));
L.length = 0;
L.MaxSize = InitSize;
}
//增加动态数组长度
void increaseSize(SqList &L, int len){
int *p = L.data;
L.data = (int *)malloc((L.MaxSize + len)*sizeof(int));
for(int i = 0;i < L.length;i++){
L.data[i] = p[i]; //将数据复制到新区域
}
L.MaxSize = L.MaxSize + len; //顺序表最大长度增加 len
free(p); //释放原来的内存空间
}
//判断是否为空
bool isEmpty(SqList &L){
return L.length == 0 ? true : false;
}
//输出链表
void listDisplay(SqList &L){
printf("\n");
for(int i = 0; i < L.length; i++){
printf("%d:%d\t",i + 1,L.data[i]);
}
printf("\n");
}
//清空顺序表
void clearList(SqList &L){
for(int i = 0;i < L.length;i++){
L.data[i] = NULL;
}
L.length = 0;
}
//插入操作
bool listInsert(SqList &L, int i, int e){
if(i < 1 || i > L.length + 1){ //判断i的范围是否有效
return false;
}
if(L.length >= L.MaxSize){
return false;
}
for(int j = L.length; j >= i; j-- ){
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
//删除操作
bool listDelete(SqList &L,int i, int &e){
if(i < 1 || i > L.length + 1){ //判断i的范围是否有效
return false;
}
e = L.data[i - 1]; //被删除的元素赋值给e
for(int j = i; j < L.length; j++){ //将第i个位置后的元素前移
L.data[j - 1] = L.data[j];
}
L.length--; //线性表长度减一
return true;
}
//按位查找操作
int getElem(SqList L, int i){
return L.data[i-1];
}
//按位查找
int locateElem(SqList L,int e){
for(int i = 0;i < L.length;i++){
if(L.data[i] == e){
return i+1; //数组下标为i的元素值等于e,返回其位序i+1 //退出循环,说明查找失败
}
}
return 0;
}
int main(){
SqList L; //创建一个顺序表
initList(L); //初始化顺序表
//插入测试
listInsert(L, 1, 1);
listInsert(L, 2, 2);
listInsert(L, 3, 3);
//判断表是否为空
printf("The lis is empty? %d.\n",isEmpty(L));
bool flag = listInsert(L, 4, 4);
if(!flag){
increaseSize(L, 5);
listInsert(L, 4, 4);
}
//删除测试
int e = -1;
flag = listDelete(L, 1, e);
if (flag){
printf("The delete element is %d.\n",e);
}
else{
printf("Illegal deletion of location element!\n");
}
//输出
listDisplay(L);
//按位查找测试
printf("Get elem is %d.\n",getElem(L,3));
//按值查找测试
printf("Get elem index is %d.\n",locateElem(L,e));
//输出
listDisplay(L);
//输出表长
printf("Get list length is %d.\n",getLength(L));
//清空表
clearList(L);
listDisplay(L);
//判断表是否为空
printf("The lis is empty? %d.\n",isEmpty(L));
return 0;
}
运行结果: