题目地址
https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId=725&page=0
注意审题,返回false的时候不要返回ERROR,否则答案错误,机器规则是死的。
位置一般指数组下标,位序一般指数组下标+1。但是思路是一样的
比如向位置1插入元素,现在L->last是5
相当于向位序2插入元素,目前元素length有6个
但都是执行(5-1)+1 或者(6-2)+1次 即 L->last-P+1次
这个自己列举2个例子就能推出。
下面是个人写的代码,注释部分为我犯得错误,可以忽略,主要是本人记录学习用的
/*位置一般指数组下标,位序一般指数组下标+1*/
#define MAXSIZE 5
#define ERROR -1
typedef enum {false, true} bool;
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
/*创建一个空的顺序表*/
List MakeEmpty()
{
int i = 0;
List L = (List)malloc(sizeof(struct LNode));
for(;i<MAXSIZE;i++)
{
L->Data[i]=0;
}
//L->Last=-1;一定要写这个,我之前不写这个就错了,-1即不合法也就是刚创建的时候赋为-1
L->Last=-1;
return L;
}
/*返回顺序表中的元素X的位置(数组下标),找不到返回ERROR*/
Position Find(List L,ElementType X)
{
int i = 0;
//for(;i<MAXSIZE;i++) //查找长度应该是L->Last+1次,而不是MAXSIZE
for(;i<(L->Last+1);i++)
{
if(L->Data[i]==X)
return i;
}
return ERROR;//这里只能写ERROR不能写false 因为题目要求
}
/*将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;
如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;*/
bool Insert( List L, ElementType X, Position P )
{
int i =0;
/*判断空间满了就返回FULL*/
if(L->Last == MAXSIZE-1)
{
printf("FULL");
//return ERROR;
return false;
}
//if(P<0||P>MAXSIZE-1) MAXSIZE和L->Last不是一个东西啊,哎呦忘了
if(P<0||P>(L->Last+1)) //也就是P=L->Last+2的时候明显不合适,因为中间的 L->Last+1这个位置空了
{
printf("ILLEGAL POSITION");
//return ERROR;
return false;
}
ElementType t = L->Last;
for(i=0;i<(L->Last+1)-P;i++)
{
L->Data[t+1]=L->Data[t];
t--; //一定要在for循环里面加t--,不然for循环相当于重复执行相同操作
}
L->Data[P]=X;
L->Last++;
return true;//一定要写这个,否则就是答案错误,这题目好蛋疼,必须按照要求来
}
/*将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。*/
bool Delete( List L, Position P )
{
int i = 0;
if(P<0||P>=((L->Last)+1)) //这里错了
// if(P<0||P>(L->Last))
{
//printf("POSITION %d EMPTY\n",P); //不能加\n,否则提示格式不对
printf("POSITION %d EMPTY",P);
//return ERROR; //题目让写false,就不能写ERROR
return false;
}
for(;i<(L->Last)-P;i++)
{
L->Data[P]=L->Data[P+1];
P=P+1;
}
L->Last--;
return true;
}