线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。
预定义常量及类型:
#define MAXSIZE 100
typedef char ElemType;
typedef int Status;
单链表的存储结构:
typedef struct
{
char *elem;
int length;
}SqList;
初始化
顺序表的初始化操作就是构造一个空的顺序表。
为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
将表的当前长度设为0。
//初始化
void InitList(SqList &L)
{
L.elem = new ElemType[MAXSIZE];
if(!L.elem) //判断申请储存是否失败
{
printf("ERROR");
exit(0);
}
L.length = 0;
}
创建
创建操作是根据指定的位置序号i,输入顺序表中第i个数据元素的值。
//创建
void CreatList(SqList &L)
{
printf("输入你想建立的顺序表的元素(以'?'结束):");
while(scanf("%c",&L.elem[L.length]))
{
if(L.elem[L.length] == '?')
{
break;
}
L.length++;
}
getchar();
}
打印
打印操作既是将顺序表中的元素用for循环输出
//打印
void PrintList(SqList L)
{
printf("你建立的顺序表为:");
if(L.length == 0)
{
printf(" ");
}
else
{
for(int i=0;i<L.length;i++)
{
printf("%c",L.elem[i]);
if(i<L.length-1)
{
printf("->");
}
}
}
printf("\n");
}
查找
查找操作是根据指定的i值,查找顺序表中第i个的元素。若查找成功,则将该元素赋值给e。判断指定的位置序号i值是否合理(1≤i≤L.length)。
//查找元素
void GetElem(SqList L, int i, ElemType &e)
{
if(i<1 || i>L.length)
{
printf("输入的元素序位不合法\n");
}
else
{
e = L.elem[i-1];
}
}
查找元素位置
查找元素位置根据指定的元素值e,查找顺序表中第1个值与e相等的元素。若查找成功,则饭回该元素在表中的位置序号,若查找失败,则打印‘未找到’。
从第一个元素起,依次将其值和e相比较,若找到值与e相等的元素,则打印该元素的位置。
2若查遍整个顺序表都没有找到,则查找失败。
//查找元素位置
void LocateElem(SqList L, ElemType e)
{
int tool = 0;
for(int i = 0;i < L.length;i++)
{
if(L.a[i]==e)
{
printf("你想查找的元素为%c序位为:%d",e,i+1);
tool = 1;
break;
}
}
if(tool == 0)
{
printf("未找到");
}
}
插入元素
线性表的插入操作是指在表的第i个位置插人一个新的数据元素e,使长度为n的线性表变成长度为n+1的线性表
判断插入位置i是否合法(i值的合法范围是1≤in +1),若不合法则打印‘不合法’。
判断顺序表的存储空间是否已满,若满则打印‘空间已满’。
将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置( i=n+l时无须移动)。
将要插人的新元素e放人第i个位置。
表长加1。
//插入元素
void ListInsert(SqList &L, int i ,ElemType e)
{
if((i<1 || i>L.length+1))
{
printf("输入的元素序位不合法\n");
}
else if(L.length == MAXSIZE)
{
printf("储存空间已满\n");
}
else
{
for(int j=L.length-1;j>=i-1;j--)
{
L.elem[L.length] = L.elem[L.length-1];
}
L.elem[i-1] = e;
L.length++;
printf("插入后顺序表为:");
for(int i=0;i<L.length;i++)
{
printf("%c",L.elem[i]);
if(i<L.length-1)
{
printf("->");
}
}
printf("\n");
}
}
7.删除元素
线性表的删除操作是指将表的第i个元素删去,将长度为n的线性表。
判断删除位置i是否合法(合法值为1≤i≤n),若不合法则打印‘不合法’。
将第i+1个至第n个元素依次向前移动一个位置(i=n时无须移动)。
表长减1。
//删除元素
void ListDelete(SqList &L , int i)
{
if(i<1 || i>L.length)
{
printf("输入的元素序位不合法");
}
else
{
for(int j=i; j<L.length; j++)
{
L.elem[j-1] = L.elem[j];
}
L.length--;
printf("删除后顺序表为:");
for(int i=0;i<L.length;i++)
{
printf("%c",L.elem[i]);
if(i<L.length-1)
{
printf("->");
}
}
printf("\n");
}
}