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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器