【HELP】数据结构(基于c语言)线性表的插入有关问题

【HELP】数据结构(基于c语言)线性表的插入问题
照书上敲的代码,怎么就插入不了呢,比如:
输入长度:3;
输入元素值:1 2 3;
输入要插入的值:4;
输入要插入的位置:4;
最后的线性表应该是:1 2 3 4 而实际上还是 1 2 3
怎么回事呢?请指教~~

C/C++ code
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define OK     1
#define ERROR  0
#define TRUE   1
#define FALSE  0
#define INFEASIBLE -1
#define OVERFLOW   -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10


typedef struct{
int *elem;
int length;
int listsize;
}SqList;//定义了顺序表数据类型


/*初始化顺序表*/
int SqList_Init(SqList &L){
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem) 
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}

/*建立顺序表*/
int SqList_Create(SqList &L){
int i;
printf("请输入各个元素的值:");
for(i=0;i<L.length;i++)
scanf("%d",&L.elem[i]);
return OK;

}
/*插入值到顺序表*/
int SqList_Insert(SqList &L, int i, int e){
    int *newbase,*q,*p;
    if(i<1||i>L.length+1)  printf("要插入的位置不合法!\n"); return ERROR;
    if(L.length>=L.listsize){ //空间已满,增加分配
    newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
       if(!newbase) exit(OVERFLOW);
       L.elem=newbase;
       L.listsize+=LISTINCREMENT;
    }
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
 *(p+1)=*p;
*q=e;
++L.length;
return OK;
}

void main(){
int i,e,n;
SqList L;
SqList_Init(L);
printf("\n输入长度:");
scanf("%d",&n);
L.length=n;
SqList_Create(L);
printf("输入插入的数据:");
scanf("%d",&e);
printf("输入插入的位置:");
scanf("%d",&i);
if(SqList_Insert(L,i,e)){
printf("插入后的顺序表:");
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
    }
else 
printf("数据插入失败!\n");
}


------解决方案--------------------
C/C++ code
 if(i<1||i>L.length+1)
    {
       printf("要插入的位置不合法!\n");
        return ERROR;
    }