C语言线性表运行问题,谢啦

C语言程序没问题,但运行输入时一半,回车准备接着输入。。程序被迫终止,为啥腻?

#include<stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct{
int *elem;
int length;
int listsize;
} sqlist;
void init(sqlist L)
{
L. elem=(int )malloc(100sizeof(int));
L. length = 0;
}

void read(sqlist *L,int n)
{
int i;
printf("输入元素:");
for (i=0;i<n;i++)
{
scanf("%d",&L->elem[i]);
L->length=n;
}
}

void printvalue(sqlist *L)
{
int i;
for(i=0;ilength-1;i++)
{
printf("%5d",L->elem[i]);
}
printf("\n");
}

void insert(sqlist *L,int i ,int e)
{
int *p,*q;
if(i<1||i>L->length+1)
printf("error");
else
{
q=&L->elem[i-1];
for(p=&(L->elem[L->length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++L->length;
}
}

int main()
{
sqlist L;int e;int i,n;
init(L);
printf("请输入元素的个数:");
scanf("%d",&n);
int m=n;
read(&L,m);
printf("元素的个数为%d\n",n);
printvalue(&L);
printf("请输入插入位置和元素:");
scanf("%d%d",&i,&e);
insert (&L,i,e);
printf("插入后的结果是");
printvalue(&L);
}

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct {
    int* elem;
    int length;
    int listsize;
} sqlist;

void init(sqlist *L)//void init(sqlist L)
{
    L->elem = (int*)malloc(100*sizeof(int));//L.elem = (int)malloc(100sizeof(int));
    L->length = 0;//L.length = 0;
}

void read(sqlist* L, int n)
{
    int i;
    printf("输入元素:");
    for (i = 0; i < n; i++)
    {
        scanf("%d",&L->elem[i]);
        L->length++; //L->length = n;
    }
    
}

void printvalue(sqlist* L)
{
    int i;
    for (i = 0; i < L->length; i++) //for (i = 0; ilength - 1; i++)
    {
        printf("%5d", L->elem[i]);
    }
    printf("\n");
}

void insert(sqlist* L, int i, int e)
{
    int* p, * q;
    if (i<1 || i>L->length + 1)
        printf("error");
    else
    {
        q = &L->elem[i - 1];
        for (p = &(L->elem[L->length - 1]); p >= q; --p)
        {
            *(p + 1) = *p;
        }
        *q = e;
        ++L->length;
    }
}

int main()
{
    sqlist L; 
    int e; 
    int i, n;

    init(&L);//nit(L);
    printf("请输入元素的个数:");
    scanf("%d", &n);
    int m = n;
    read(&L, m);
    printf("元素的个数为%d\n", n);
    printvalue(&L);

    printf("请输入插入位置和元素:");
    scanf("%d%d", &i, &e);
    insert(&L, i, e);
    printf("插入后的结果是");
    printvalue(&L);

    return 0;
}

void init(sqlist L);
sqlist L;
init(L);
这初始化函数分配的空间和定义的sqlist L没关系,使用的结构体并没有分配内存 初始化需传指针或引用