顺序表概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
静态顺序表:使用定长数组的顺序表。
对于表,栈,队列,树,图等等数据结构,我们都可以通过选择顺序存储结构或者链式存储结构来进行实现,由于静态顺序表较为简单,下面将代码呈上
预处理指令:
#pragma once
#include<stdio.h>
#include <stdlib.h>
//函数结构状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef int ElemType; //顺序表中存储的数据元素类型
typedef int Status; //Status是函数返回值类型,其值是函数结果状态代码
数据结构:
//静态顺序表
typedef struct Sqlist
{
ElemType elem[MAXSIZE]; //最大存储空间
int length; //记录当前长度 <用size_t更为准确>
}Sqlist; //顺序表的结构类型为 Sqlist
接口实现:
Status InitList(Sqlist* L);//初始化静态顺序表
Status PushBackList(Sqlist* L, ElemType x);//顺序表尾插
Status PopBackList(Sqlist* L);//顺序表尾删
Status PushFrontList(Sqlist* L, ElemType x);//顺序表头插
Status PopFrontList(Sqlist* L);//顺序表头删
Status FindList(Sqlist* L, ElemType x);//顺序表查找
Status PrintList(Sqlist* L);//顺序表打印
Status DeleteList(Sqlist* L, int i);//顺序表在指定位置删除
Status InsertList(Sqlist* L, int i, ElemType e);//顺序表在指定位置插入
初始化静态顺序表:
//初始化静态顺序表
Status InitList(Sqlist* L)
{
L->length = 0; //顺序表长为0
return OK;
}
顺序表头插:
//顺序表头插
Status PushFrontList(Sqlist* L, ElemType x)
{
if (L->length >= MAXSIZE) return OVERFLOW; //判断存储空间是否已满
for (int tmp = L->length; tmp > 0; tmp--)
L->elem[tmp] = L->elem[tmp - 1]; //依次将顺序表中的数据元素向后移一个存储单元
L->elem[0] = x; //将顺序表头部的存储单元存储数据x
L->length++; //表长加1
return OK;
}
顺序表尾插:
//顺序表尾插
Status PushBackList(Sqlist* L, ElemType x)
{
if (L->length >= MAXSIZE) return OVERFLOW; //判断存储空间是否已满
L->elem[L->length] = x; //尾部插入数据元素x
L->length++; //表长加1
return OK;
}
顺序表头删:
//顺序表头删
Status PopFrontList(Sqlist* L)
{
if (L->length == 0)return OVERFLOW; //判断存储空间是否为空
for (int tmp = 0; tmp < L->length - 1; tmp++)
L->elem[tmp] = L->elem[tmp + 1]; //将顺序表中的数据元素依次向前移动一个存储单元
L->length--; //表长减1
return OK;
}
顺序表尾删:
//顺序表尾删
Status PopBackList(Sqlist* L)
{
if (L->length == 0)return OVERFLOW; //判断存储空间是否为空
L->length--; //表长减1;
return OK;
}
顺序表查找:
//顺序表查找
Status FindList(Sqlist* L, ElemType x)
{
for (int i = 0; i < L->length; i++)
if (L->elem[i] == x) return i + 1; //找到返回序号
return ERROR;
}
顺序表打印:
//顺序表打印
Status PrintList(Sqlist* L)
{
for (int i = 0; i < L->length; i++)
{
printf("%d ", L->elem[i]); //打印
}
printf("\n");
return OK;
}
顺序表在指定位置删除:
//顺序表在指定位置删除
Status DeleteList(Sqlist* L, int i) //在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
{
if ((i < 1) || (i > L->length))return ERROR; //i值不合法
for (int j = i; j <= L->length - 1; j++)
L->elem[j - 1] = L->elem[j]; //被删除之后的元素向后移
L->length--; //表长减1
return OK;
}
顺序表在指定位置插入:
//顺序表在指定位置插入
Status InsertList(Sqlist* L, int i, ElemType e)
{
if ((i < 1) || (i > L->length + 1)) return ERROR; //i值不合法
if (L->length == MAXSIZE) return ERROR; //当前存储空间已满
for (int j = L->length - 1; j >= i - 1; j--)
L->elem[j + 1] = L->elem[j]; //插入之后的元素后移
L->elem[i - 1] = e; //将新元素e放入第i个位置
L->length++; //表长加1
return OK;
}
顺序表的特点是:逻辑上相邻的数据元素,其物理次序也是相邻的。