#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
#include<stdio.h>
typedef int ElemType;
typedef struct integer
{
ElemType* elem; //存储空间的基地址
int length; //当前长度
} SqList;
//初始化一个顺序表(顺序表最大单元数为100)
Status InitList_Sq(SqList& L)
{
//构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if (!L.elem)
exit(OVERFLOW); //存储分配失败退出
L.length = 0; //空表长度为0
return OK;
}
//2.线性表的插入(在第i个位置插入元素e)
Status ListInsert_Sq(SqList& L, int i, ElemType e)
{
if ((i < 1) || (i > L.length + 1))
return ERROR;//i值不合法
if (L.length == MAXIZE)
return ERROR;//存储空间已满
for (int j = L.length - 1; j >= i - 1; j--)
{
L.elem[j + 1] = L.elem[j];//插入位置及以后的元素往后移
}
L.elem[i - 1] = e;//在第i个位置插入e
++L.length;//表长+1
return OK;
}
//3.线性表的构造。通过输入构造含有n个元素的的线性表
void Create_list(SqList& L, int n)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &e);
ListInsert_Sq(L, j, e);
}
}
/*4.线性表的输出。按照线性表的逻辑顺序输出给定的顺序表中的元素。
算法步骤:逐个输出线性表中的元素*/
void print_list(SqList L)
{
for (i = 0; i < L.length; i++)
{
printf("%d\n", L.elem[i]);
}
}
/*5.线性表的查找。在给定的顺序表上查找元素e,若找到,函数返回值为其在表中的位置,否则返回-1。
算法步骤:遍历顺序表中的每个元素,将其与元素e比较,若相等则返回其位置,否则返回-1*/
int find_list(SqList L, ElemType e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == e)
return i + 1;
}
return -1;
}
/*6.线性表的插入。在给定的顺序表中的第i个位置插入一个元素e,
使得插入以后的元素成为表中第i个元素。插入成功返回值为1,否则返回值为0。
算法步骤:1.判断i是否合法?存储空间是否满了?(健壮性)
2.将第i个位置及其以后的元素逐个往后移一位,从最后一个元素开始。3.将元素e插入第i个位置
4.判断第i个位置是否为元素e,如果是,返回1,否则返回0*/
int insert_list(SqList& L, int i, ElemType e)
{
ListInsert_Sq(L, i, e);
if (L.elem[i - 1] == e)
return OK;
else
return ERROR;
}
/*7.线性表的删除。在给定的顺序表中删除第i个元素。删除成功返回1,否则返回0。
算法步骤:1.判断i的合法性 2.第i+1个位置及其以后的位置逐个往前移一位,从第i+1个位置的元素开始
3.表长减1. 4.判断第i个位置的元素与之前是否相等,若不相等,返回1,否则返回0*/
int del_list(SqList& L, int i)
{
if ((i < 1) || (i > L.length))
return ERROR;
ElemType e = L.elem[i - 1];
for (int j = i - 1; j < L.length - 1; j++)
L.elem[j] = L.elem[j + 1];
L.length--;
if (L.elem[i - 1] == e)
return ERROR;
else
return OK;
}