c语言数据结构问题,书上伪代码看上去很正确但是为什么放在自己代码里就输出错误呢 3C

顺序表插入函数,
自己用c实现的书上伪代码
struct sqlist* insert(struct sqlist* L,int i,int num1) //第i个元素之前插入一个数值为num1的元素,并且输出
{
int j;
for(j=L->length-1; j>=i-1; j--)
{
L->num[j+1]=L->num[j];

        L->num[i-1]=num1;

++ L->length;
}

return L;

}

这个是自己代码:
struct sqlist* insert(struct sqlist* L,int i,int num1) //第i个元素之前插入一个数值为num1的元素,并且输出
{
int j;
for(j=L->length-1; j>=i-1; j--)
{
L->num[j+1]=L->num[j];
if(j==i-1)
{
L->num[j]=num1;
}
}
L->length++;
return L;
}

8个回答

有如下问题:
1.第一段代码中每一趟循环都给L->length加1,这和我们只插入一个元素,总共给其加1的思路相悖,应该将本句移动到循环后。
2.第一段代码中的L->num[i-1]=num1;句始终在对同一个位置赋值,这明显是不对的,可以改为L->num[j]=num1;,这样一来每一趟的过程即变为:
A)先将当前指向的元素后移一个单元;
B)将当前指向单元存入要插入的元素值;
C)重复AB两步直至当前j指向了最终目标要插入的单元。
3.至于用不用每趟循环都判断一下j==i-1,直到最后一趟循环才令L->num[j]=num1,从效率(生成的汇编代码)的角度上讲我觉得不必,选择使用2.中说的那个ABC步骤好一些
以上一点个人见解,如有错误,欢迎指正。

zuoside__lord
陆狸狸 回复金科教育_飞狐教育: 喔,反正你们说得看上去都非常有道理,,那你把代码给我看,,
2 年多之前 回复
aaabbbqwe
金科教育_飞狐教育 楼上说的不对,正确的是给length+一,让后循环,踢我上去
2 年多之前 回复
zuoside__lord
陆狸狸 后来发现是我抄错了,书上代码被我多加了一个括号,去掉就很正常,,,,,,,谁能想到一个括号威力这么大
2 年多之前 回复

struct sqlist* insert(struct sqlist* L,int i,int num1) //第i个元素之前插入一个数值为num1的元素,并且输出
{
int j;
for(j=L->length-1; j>=i-1; j--)
{
L->num[j+1]=L->num[j];
if(j==i-1)
{
L->num[j]=num1;
break;
}
}
L->length++;
return L;
}

再试下,看看。

无数事实证明,还是书上代码是对,我代码比较有毒,,,,,总是把代码抄错的人类

你是直接修改元素的值,并没有添加元素。

jssmartstar
jssmartstar 人家用的是队列,不是链表
2 年多之前 回复

你只是修改了元素的值,并没有添加新的元素。整个链表的长度并没有发生变化

伪代码那里,for语句后面的大括号去掉就行了。
struct sqlist* insert(struct sqlist* L,int i,int num1) //第i个元素之前插入一个数值为num1的元素,并且输出
{
int j;
for(j=L->length-1; j>=i-1; j--)
L->num[j+1]=L->num[j];
L->num[i-1]=num1;
++ L->length;
return L;
}

jssmartstar
jssmartstar 回复沈大人喊你去学习: 简单点讲,只有L->num[j+1]=L->num[j];这一句是需要循环执行的语句,其作用就是把待插入位置后面的数据全部往后挪一个位置,那就空出一个位置可以填写新数据了。所以大括号只要框住这一行语句,或者去掉这个大括号,默认就循环执行这一行语句。
2 年多之前 回复
zuoside__lord
陆狸狸 回复jssmartstar: 正解,不觉明历
2 年多之前 回复
jssmartstar
jssmartstar 因为这里for的作用就是为新插入的元素腾出位置
2 年多之前 回复

没有对 L->length 判断,L->length 是否大于i呢?
struct sqlist* insert(struct sqlist* L,int i,int num1) //第i个元素之前插入一个数值为num1的元素,并且输出
{
int j;
if(i > L->length)
return L;

for(j=L->length-1; j>=i-1; j--)
{
L->num[j+1]=L->num[j];
if(j==(i-1)) //可能是这样的原因
{
L->num[j]=num1;
break;
}
}

L->length++;
return L;
}

zuoside__lord
陆狸狸 书上是有判断,,,,我懒就把那些要考虑的边界情况都去掉了
2 年多之前 回复

struct sqlist* insert(struct sqlist* L,int i,int num1) //第i个元素之前插入一个数值为num1的元素,并且输出
{
int j;
if (i < 0)
i = 0;
for (j=L->length; j>i; j--)
{
L->num[j]=L->num[j-1];
}
L->num[j] = num1;
L->length++;
return L;
}
这样就完美了,而且不论怎样都能成功插入数据。当i小于或等于0就插入到最前面,当i大于或等于现有列表长度,就追加到最后。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问