大家帮我看一下这个顺序表的插入数据元素的算法是不是有问题?

在顺序表L的第p(1<=p<=length+1)个位置插入新的元素e.如果p的输入不正确,则返回0,代表插入失败;如果p的输入正确则将顺序表第p个元素及以后的元素右移一个位置,腾出一个空位置插入新元素,顺序表长度增加1,插入操作成功,返回1.
顺序表的结构定义
typedef struct
{
int data[maxsize];
int length;
}Sqlist;
书上的算法:
int insert(Sqlist &L,int p,int e)
{
int i;
if(p<1||p>L.length+1||L.length==maxSize)
return 0;
for(i=L.length;i>=p;--i)
L.data[i+1]=L.data[i];
L.data[p]=e;
++(L.length);
return 1;
}
我想问的是if语句中的 L.length==maxSize应该改成L.length+1==maxSize吧?因为这个时候才是表长已经达到顺序表的最大允许值吧?求真相,!
0号单元不存储数据

思路比较清晰。条件判断中有三个
1、<1的位置不存数据这个插入位置不在范围内。
2、>L.lenght+1在表的尾部之后了,超出范围。
3、L.length==maxSize-1,说明表是满的,就没有再插入的可能。(0位置不算表空间)

所以你的说法是正确的。

程序书写太不规范,容易出现理解性错误。

int insert(Sqlist &L,int p,int e)
{
int i;
if(((p<1) || (p>L.length+1)) || (L.length==maxSize-1))// 不在表范围,或满 ,退出
{
return 0;
}
for(i=L.length;i>=p;--i)
{
L.data[i+1]=L.data[i];
}
L.data[p]=e;
++(L.length);
return 1;
}

如果你说的是0位置不存数据也不算表长,表长就要比定义的小1.
if(((p<1) || (p>L.length+1)) || (L.length==maxSize-1))// 不在表范围,或满 ,退出追问

发错人了,我要发给另外两个的,我以为你说我错了,不好意思

追答

你说的对。
所以长度达到
if(((pL.length+1)) || (L.length==maxSize-1))// 不在表范围,或满 ,退出

就是判断如果长度达到最大,下面的循环就不要做了。

(o_o)
一刷新,问题变了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-18
int data[maxsize];
由这个定义可知表的最大长度是maxsize,下表是0~maxsize-1,所以上面是对的。
你犯糊涂了吧追问

但是L.length永远不可能等于maxsize啊,L.length至少要比maxsize小1吧?假设按你说的,书上的代码没有错,if中是(L.length==maxsize),那么如果这时L.length==maxsize-1,则后面的for循环执行,i=L.length=maxsize-1, L.data[i+1]=L.data[i];岂不是错了?因为=左边的L.data[i+1]不就是L.data[maxsize]了吗?数组下标最多取L.data[maxsize-1]啊!

追答

你现在条件又变了:0号单元不存储数据。如果这样的话,确实里面应该变成L.length==maxsize-1

本回答被网友采纳
第2个回答  2012-09-18
原题目是正确的,if后面的3个条件,只要有一个成立就说明插入不成功,return 0;L.length ==maxSize表示你在插入这个元素之前,链表已经达到最大值了,所以你的插入肯定是违法的,肯定不成功,返回0. 如果你改成L.length + 1==maxSize,则表示我插入这个元素以后链表才达到最大值,而这种情况是插入成功的情况,不是插入不成功的情况。if后面要跟着的是插入不成功的情况追问

但是L.length永远不可能等于maxsize啊,L.length至少要比maxsize小1吧?假设按你说的,书上的代码没有错,if中是(L.length==maxsize),那么如果这时L.length==maxsize-1,则后面的for循环执行,i=L.length=maxsize-1, L.data[i+1]=L.data[i];岂不是错了?因为=左边的L.data[i+1]不就是L.data[maxsize]了吗?数组下标最多取L.data[maxsize-1]啊!

相似回答
大家正在搜