/*在建立空表的操作上我们要明确区分。
顺序表是通过数组存储,按照顺序,定义一个整数来存放数组长度
链式表是借用指针来存储存储结构。
本题中明显是顺序表,但是与平常的建立空表又不一样,平常是传递结构体的地址给建立空表的函数,将长度归0,以此来达到初始化
在本题上我们需要特别注意,首先函数没有传入的参数,而是通过返回值赋值来达到目的,返回值为指针,所以我们可以知道要使用指针
因为没有申请空间,所以先要申请空间,就是通过malloc,使得建表函数获取拥有这样一段空间的地址的指针。并在最后将这个地址通过函数返回值赋给了主函数中的指针,也就是使它能指向那份空间,所以即使建表的函数中的指针在不使用该函数时指针销毁也没事,因为我们要的是这个空间,最后在主函数中释放内存即可*/
List MakeEmpty(){
List L;
L=(List)malloc(sizeof(struct LNode));
L->Last=-1;//因为题目中说的是线性表中最后一个元素的位置,若初设为0也代表其有一个元素,所以我们应该设置为-1来代表
return L;
}
/*代码分析:这是一个查找代码,*/
Position Find(List L,ElementType X){
int i;
for(i=0;i<=L->Last;i++){
if(X==L->Data[i])return i;
}
return ERROR;
}
/*代码分析:插入数据,!!!首先我们要考虑输入的数据,根据边界情况分类讨论
首先插入位置应该要符合要求,不可以超过当前线性表长度(即不可不在线性表范围内)
其次表要有能插入的空间
在这要注意,由于在表尾与不在表尾的操作不同所以我们要分情况讨论*/
bool Insert(List L,ElementType X,Position P){
if(L->Last==MAXSIZE-1){
printf("FULL");
return false;
}//我有一个疑问:这里P的非法位置是指末尾前还是线性表最大长度前呢
//!!答案当插入位置比第一位置小或者比最后一位置后一位置还要大时
else if(P<0||P>L->Last+1){
printf("ILLEGAL POSITION");
return false;
}
//在表尾插入
if(P==L->Last+1){
L->Data[P]=X;
L->Last++;
}
//在非表尾插入,那么就需要将插入位置后面的所有数据往后面移动一位,并且为了防止被覆盖需要从最后一个开始移动
else{
int i;
for(i=L->Last;i>=P;i--){
L->Data[i+1]=L->Data[i];
}
L->Data[P]=X;
L->Last++;
}
return true;
}
//删除直接覆盖要删除的
bool Delete(List L,Position P){
if(P<0||P>L->Last){
printf("POSITION %d EMPTY",P);
return false;
}
int i;
if(P==L->Last){
L->Last--;
}
//这里删除也要分是否删除表尾,若不分这里的for无法删除表尾,因为在判断条件时候就已经通过不了了
else{
for(i=P+1;i<=L->Last;i++){
L->Data[i-1]=L->Data[i];
}
L->Last--;
}
return true;
}