/
*顺序表 数组a[i],有一个基址a 相当于&a[0],还有下标i,代表第i 个元素,
*数组的最大容量,假定声明一个数组为a[10],则该数组的容量为10
化为指针形式 a[i] = (a+i),[]就相当于*
*要注意的是a是一个常量,它代表的是数组的首地址,是不可以发生变化的
*关于数组的扩容,从新给数组分配空间始终在原有的基址上进行操作
*数组元素的插入和删除操作,就要相应地将插入位置元素的后面的元素前移
/
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
typedef int ElemType;
typedef struct List
{
ElemType *elem; //线性表的基址,相当于数组的首地址
int length; //线性表的当前长度
int listsize; //线性表的容量
}sqList;
/////////线性表的初始化
void InitList(sqList &s)
{
s.elem = (int *)malloc(sizeof(ElemType)*LIST_INIT_SIZE); //分配数组空间
if(!s.elem)
exit(0); //若分配失败,则退出
s.listsize = LIST_INIT_SIZE; //设置数组容量
s.length = 0; //刚开始时数组为空
}
////////////////销毁线性表
void DestoryList(sqList &s)
{
free(s.elem); //销毁线性表只需要回收已分配的空间即可
}
////////////////向线性表中插入元素
int ListInsert(sqList &s,int i,ElemType e) //表示在线性表s第i位插入元素e
{
ElemType *p,*q;
if(i<1 || i>s.length+1) //i的值不合法
return -1;
if(s.length >= s.listsize) //如果线性表已满,就重新分配空间
{
s.elem = (ElemType *)realloc(s.elem,sizeof(ElemType)*(LIST_INIT_SIZE+s.listsize));
s.listsize += LIST_INCREMENT;
}
q = s.elem + i - 1; //q为要插入的位置,因为数组的下标从0开始,所以减一
for(p = s.elem+s.length-1 ; p >= q ; --p) //从线性表的最后一个元素位置遍历到插入位置的后一个
*(p+1) = *p; //将元素后移一位
/*for(int j = s.length-1 ; j >= i ; --j) //另一种移位法
*(s.elem+j+1) = *(s.elem+j);*/
*q = e; //插入e
s.length ++;
return 1;
}
/////////////////删除线性表中的元素
int ListDelete(sqList &s,int i)
{
ElemType *p,*q;
if(s.length == 0 || i<1 || i>=s.length) //判断线性表是否为空和i的位置是否合法
exit(0);
q = s.elem + i - 1; //q为要插入的位置
for(p = q; p <= s.elem+s.length-1; p++)
*p = *(p+1);
/*
for(int j = i-1; j <= s.length-1 ; j++)
*(s.elem+j) = *(s.elem+j+1); //将删除位置后的元素前移一位*/
s.length --;
return 1;
}
int main()
{
sqList s;
int a[10] = {9,6,0,3,2,5,8,4,7,1};
int i;
InitList(s);
for(i=0;i<10;i++) //向线性表中加入10个元素
ListInsert(s,i+1,a[i]);
for(i=0;i<10;i++) //打印线性表中的每个元素
printf("%d ",*(s.elem+i));
printf("\n");
ListDelete(s,2); //删除线性表第二个元素
for(i=0;i<9;i++)
printf("%d ",*(s.elem+i));
printf("\n");
ListInsert(s,5,-2); //在线性表第5个元素的位置插入-2这个元素
for(i=0;i<10;i++)
printf("%d ",*(s.elem+i));
printf("\n");
DestoryList(s);
return 0;
}