跃2.0 2017-11-05 03:40 采纳率: 40%
浏览 2491
已结题

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

  • 写回答

8条回答 默认 最新

  • 造轮使者 2017-11-05 04:04
    关注

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

    评论

报告相同问题?