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

顺序表插入函数,
自己用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;
}

有如下问题:
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步骤好一些
以上一点个人见解,如有错误,欢迎指正。

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;
}

再试下,看看。

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

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

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

伪代码那里,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;
}

没有对 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;
}

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大于或等于现有列表长度,就追加到最后。