/*
线性表的插入,删除
*/
# include
# include
# define INCRE_SIZE 2 //线性表空间增量
//定义线性表类型
typedef struct
{
int * ele; //线性空间基址
int length; //当前有效元素个数
int initsize; //空间大小
}SqList;
SqList create_list(); //创建线性空间
void traverse(SqList s); //遍历元素
void insert(SqList &s, int pos, int e); //在第pos个位置插入元素e
void del(SqList &s, int pos, int * val); //删除第pos个位置元素
int main(void)
{
int val;
SqList s = create_list();
traverse(s);
//在线性表的第i个位置前插入元素e
printf("在第3个位置上插入5\n");
insert(s, 3, 5);
traverse(s);
//删除线性表的第i个元素
printf("删除第1个元素\n");
del(s, 1, &val);
printf("删除的元素为 %d\n", val);
traverse(s);
return 0;
}
//创建线性表
SqList create_list()
{
SqList s;
int len;
int val;
int i;
printf("输入线性表的长度 len = ");
scanf("%d", &len);
//线性表分配空间
s.ele = (int *)malloc(sizeof(int) * len);
s.initsize = len;
for(i = 0; i < len; i++)
{
printf("输入第%d个元素 val = ", i+1);
scanf("%d", &val);
s.ele[i] = val; //线性表元素赋值
}
s.length = len;
return s;
}
//遍历线性表
void traverse(SqList s)
{
int i;
for(i = 0; i < s.length; i++)
{
printf("%d ", s.ele[i]);
}
printf("\n");
}
//在线性表s的第pos为之前插入元素e
void insert(SqList &s, int pos, int e)
{
int i;
if(pos < 1 || pos > s.length + 1)
{
printf("插入位置错误!\n");
}
else
{
//若元素个数大于空间,则新增空间
if(s.length >= s.initsize)
{
s.ele = (int *)realloc(s.ele, sizeof(int) * (s.initsize + INCRE_SIZE));
s.initsize = s.initsize + INCRE_SIZE;
}
//pos以后的元素后移
for(i = s.length -1; i >= pos - 1; i--)
{
s.ele[i + 1] = s.ele[i];
}
//插入元素
s.ele[pos - 1] = e;
s.length ++;
}
}
void del(SqList &s, int pos, int * val)
{
int i;
if(pos < 1 || pos > s.length)
{
printf("删除位置错误!\n");
return;
}
*val = s.ele[pos - 1];
//表中的第pos+1个往后的元素向前移一位
for(i = pos; i < s.length; i++)
{
s.ele[i-1] = s.ele[i];
}
s.length --;
}