关于线性表中顺序表的插入操作的问题

在线性表中的插入操作中,我在第3个位置上插入元素20,总是显示“插入位置出错!输入插入的参数错误!” 但是我不知道为什么

这一段代码是打在主函数里边的

printf("请输入要插入的位置:");
scanf("%d,&i");
printf("请输入要插入的元素值:");
scanf("%d",&x);
if(InsElem(&L,i,x))
{
printf("已成功在第%d的位置上插入%d,插入后的线性表为:\n",i,x);
DispList(&L);
}
else
{
printf("输入插入的参数错误!");
}

下面这两段函数是对应的调用函数
int InsElem(SeqList *L,int i,DataType x)
{
int j;
if(L->Length>=MAXLEN)
{
printf("顺序表已满!");
return -1;
}
if(i<1||i>L->Length+1)
{
printf("插入位置出错!");
return 0;
}
if(i==L->Length+1)
{
L->data[i-1]=x;
L->Length++;
return 1;
}
for(j=L->Length-1;j>=i-1;j--)
{
L->data[j+1]=L->data[j];
L->data[i-1]=x;
L->Length++;
return 1;
}
}

void DispList(SeqList *L)
{
int i;
for(i=0;iLength;i++)
{
printf("%5d ",L->data[i]);
}
}

期待解答~

第3个位置上插入元素20,总是显示“插入位置出错!输入插入的参数错误!” ,说明代码执行到 int InsElem(SeqList *L,int i,DataType x)函数里
if(i<1||i>L->Length+1)
{
printf("插入位置出错!");
return 0;
}
这段了,函数传参过来是 i=3,那就是满足了if(i>L->Lengh+1),所以原来表的Length是否只有1个节点,就执行printf("插入位置出错!");
return 0; ,这里就返回主函数了。另int InsElem(SeqList *L,int i,DataType x)函数里移动顺序表的循环也有问题的,代码修改如下,修改处见注释,供参考:

int InsElem(SeqList *L,int i,DataType x)
{
     int j;
     if(L->Length>=MAXLEN)
     {
        printf("顺序表已满!");
        return -1;
     }
     if(i<1||i>L->Length+1)
     {
        printf("插入位置出错!");
        return 0;
     }
     if(i==L->Length+1)
     {
        L->data[i-1]=x;
        L->Length++;
        return 1;
     }
     for(j=L->Length-1;j>=i-1;j--)
     {
        L->data[j+1]=L->data[j];
     }
     L->data[i-1]=x;
     L->Length++;
     return 1;

     //}
}

void DispList(SeqList *L)
{
     int i;
     for(i=0;i < Length;i++)
     {
        printf("%5d ",L->data[i]);
     }
}



```c
#include<stdio.h>

#define MAXLEN 100
    typedef int DataType;
    typedef struct
    {
        DataType data[MAXLEN];
        int Length;
    }SeqList;
    SeqList L;

void Menu()
{
    printf("顺序表的各种操作\n");
    printf("1--建立顺序表\n");
    printf("2--插入元素\n");
    printf("3--删除元素\n");
    printf("4--按位置查找元素\n");
    printf("5--按元素值查找其在表中位置\n");
    printf("6--求顺序表的长度\n");
    printf("0--返回\n");
    printf("请输入菜单号(0-6):");
}

void InitList(SeqList *L)
{
    L->Length=0;
}

void CreateList(SeqList *L,int n)
{
    int i;
    printf("请输入%d个整数:",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&L->data[i]);
    }
    L->Length=i;
}

int GetElem(SeqList *L,int i,DataType *x)
{
    if(i<1||i>L->Length)
    {
        return 0;
    }
      else
      {
           *x=L->data[i-1];
           return 1;
    }
}
    
int Locate(SeqList *L,DataType x)
{
    int i=0;
    while(i<L->Length && L->data[i]!=x)
    {
        i++;
    }
    if(i>=L->Length)
    {
        return 0;
    }
    else
    {
        return i+1;
    }
}

int InsElem(SeqList *L,int i,DataType x)
{
    int j;
    if(L->Length>=MAXLEN)
    {
        printf("顺序表已满!");
        return -1;
    }
    if(i<1||i>L->Length + 1)
    {
        printf("L->Lenth=%d\n",L->Length);
        printf("插入位置出错!");
        return 0;
    }
    if(i==L->Length + 1)
    {
        L->data[i-1]=x;
        L->Length++;
        return 1;
    }
    for(j=L->Length-1;j>=i-1;j--)
    {
        L->data[j+1]=L->data[j];    
    }
        L->data[i-1]=x;
        L->Length++;
        return 1; 

    return 0;
}

int DelElem(SeqList *L,int i,DataType *x)
{
    int j;
      if(L->Length == 0)
      {
           printf("顺序表为空!");
           return 0;
      }
      if(i<1 || i>L->Length)
      {
           printf("不存在第i个元素");
           return 0;
      }
      *x=L->data[i-1];
      for(j=i;j<L->Length;j++)
       {
           L->data[j-1]=L->data[j];
    }
      L->Length--;
      return 1;
}

void DispList(SeqList *L)
{
    int i;
    for(i=0;i<L->Length;i++)
    {
        printf("%5d ",L->data[i]);
    }
}

int main()
{
    SeqList L;
    DataType x;
    int n,i,loc;
    char ch1,ch2,a;
    ch1='y';    
    while(ch1=='y'||ch1=='Y')
    {
        Menu();
        scanf("%c",&ch2);
        getchar();
        switch(ch2)
        {
            case '1': 
                InitList(&L);
                printf("请输入建立线性表的个数:");
                scanf("%d",&n);
                CreateList(&L,n);
                printf("建立的线性表为:");    
                DispList(&L);
                break;
            case '2':
                printf("请输入要插入的位置:");
                scanf("%d,&i");
                printf("请输入要插入的元素值:");
                scanf("%d",&x);
                if(InsElem(&L,i,x)) 
                {
                    printf("已成功在第%d的位置上插入%d,插入后的线性表为:\n",i,x);
                    DispList(&L);
                }
                else
                {
                    printf("输入插入的参数错误!");
                }
                break;
            case '3':
                printf("请输入要删除元素的位置");
                scanf("%d",&i);
                if(DelElem(&L,i,&x))
                {
                    printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n",i,x);
                    DispList(&L);
                }
                else
                {
                    printf("\n输入删除的参数错误!"); 
                }
                break;
            case '4':
                printf("请输入要查看表中元素位置(从1开始):");
                scanf("%d",&i);
                if(GetElem(&L,i,&x))
                {
                    printf("当前线性表第%d个元素的值为:%d",i,x);
                }
                else
                {
                    printf("输入的位置错误!");    
                } 
                break;
            case '5':
                printf("请输入要查找的元素值为:");
                scanf("%d",&x);
                loc=Locate(&L,x);
                if(loc)
                {
                    printf("查找元素值为%d的位置为:%d",x,loc);
                }
                else
                {
                    printf("该表中无此元素!");
                }
                break;    
            case '6':
                printf("当前线性表的长度为:%d",L.Length);
                break;    
            case '0':
                ch1='n';
                break;    
            default: printf("输入有误,请输入0~6进行选择!");break;
        }
        if(ch2!='0')
        {
            printf("\n按回车键继续,按任意键返回主菜单!\n");
            a=getchar();
            if(a!='\xA')
            {
                getchar();
                ch1='n';
            }    
        }    
    }
    return 0;
}

```