顺序表的基本操作
基本操作:
InitList_Sq(&L)
操作结果:构造一个空的线性表L。
ClearList(&L)
初始条件:线性表L已存在。
操作结果:将L重置为空表。
GetLength(L)
初始条件:线性表L已存在。
操作结果:返回L中数据元素的个数。
IsEmpty(L)
初始条件:判断线性表L是否为空。
操作结果:为空返回1,不为空返回0。
GetElem(L,i,&e)
初始条件:线性表L已存在,1<=i<=ListLength(L)。
操作结果:用e返回中第i个数据的元素。
LocateELem(L,e)
初始条件:线性表L已存在,1<=i<=ListLength(L)。
操作结果:查找成功,返回序号,查找失败,返回0。
ListInsert_Sq(&L,i,e)
初始条件:线性表L已存在,1<=i<=ListLength(L)+1。
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。
ListDelete_Sq(&L,i)
初始条件:线性表L已存在,1<=i<=ListLength(L)。
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//函数结果状态代码
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char ElemType;
//线性表的静态定义
typedef struct
{
ElemType elem [MAXSIZE] ;
int length;
}SqlList;
//线性表的静态初始化
Status InitList_Sq(SqlList& L) //构造一个空的顺序表L
{
//L.elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType)); //为顺序表分配空间
for (int i = 0; i < MAXSIZE; i++)
{
L.elem[i] = 0;
}
if (!L.elem) //存储分配失败
exit(OVERFLOW);
L.length = 0; //空表长度为0
return OK;
}
//清空线序表
void ClearList(SqlList& L)
{
L.length = 0; // 将线性表的长度置为0;
}
int GetLength(SqlList L) //求线性表的长度
{
return(L.length);
}
//判断线性表是否为空
int IsEmpty(SqlList L)
{
if (L.length == 0)
{
return 1;
}
else
{
return 0;
}
}
//顺序表的取值(用e返回L中第i个数据元素的值)
int GetElem(SqlList L, int i, ElemType& e)
{
if (i<1 || i>L.length)
{ //判断i值是否合理,若不合理,返回ERROR
return ERROR;
}
e = L.elem[i - 1]; //第i-1的单元存储着第i个数据
return OK;
}
//顺序表的查找
int LocateElem(SqlList L, ElemType e)
{ //在线性表中查找值为e的数据元素,返回其序号。
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == e)
{
return i + 1; //返回成功,返回序号
}
return 0; //查找失败,返回0
}
}
//顺序表的插入
Status ListInsert_Sq(SqlList& L, int i, ElemType e)
{
if (i<1 || i>L.length + 1) //i值不合法
{
return ERROR;
}
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++; //表的长度加一
return OK;
}
//删除L的第i个数据元素,L的长度减一
Status ListDelete_Sq(SqlList& L, int i)
{
if (i<1 || i>L.length + 1) //i值不合法
{
return ERROR;
}
for (int j = i; j <= L.length - 1; j++)
{
L.elem[j - 1] = L.elem[i]; //被删除元素之后的元素前移
L.length--; //表长减一
}
return OK;
}
//顺序表显示
void print(SqlList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
int main()
{
ElemType e;
SqlList L;
InitList_Sq(L);
ListInsert_Sq(L, 1, 1);
ListInsert_Sq(L, 2, 2);
ListInsert_Sq(L, 3, 3);
ListInsert_Sq(L, 4, 5);
print(L);
ListInsert_Sq(L, 4, 4);
print(L);
GetElem(L, 2, e);
printf("%d ", e);
return 0;
}