C顺序表读入键入的值

初学数据结构,C语言基础不太好,做这么一个练习,东拼西凑,严蔚敏的书上C++和C混用,不知道纯用C怎么写
设顺序表va中的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性
测试输入:
1,3,5,8,9
2
期待输出:
1,2,3,5,8,9

#include<stdio.h>
#include<stdlib.h>

#define LIST_INIT_SIZE 20  
#define OK 1    
#define ERROR 0 
#define OVERFLOW -1

typedef int Status;

typedef int ElemType;

typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList(SqList *L){ //构造一个空的线性表L
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem){
        exit(OVERFLOW);
    }
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return OK;
}

SqList *L;


void Input(SqList *L,char shu)//写入 
 {
  InitList(L);
  int input=0;
  while((getchar())!='\n') 
     {
      if(shu!=',')
      {
       shu=shu-48;
       L -> elem[input]=shu;
       input++;
         }
     }
 }
Status ListInsert(SqList *L, int i, ElemType e){
    int k;
    if (L->length == LIST_INIT_SIZE){  //线性表已满
        return ERROR;
    }   
    if (i < 1 || i > L->length+1){ //当i不在范围内时
        return ERROR;
    }
    if (i <= L->length){  //若插入位置不在表尾
        for(k = L->length-1;k >= i-1;k--){
            L->elem[k+1] = L->elem[k];
        }
    }   
    L->elem[i-1] = e;   
    L->length++;    
    return OK;
}

int main(){
    int x,i;
    char shu;
    int d=0;
    InitList(L);
    Input(L,shu);
    scanf("%d",&x);
    int r=0;
    while((L->elem[r])>x){
        r++;
    }
    ListInsert(L, i, x);
    for(d=0;d<L->length;d++){
        if(d!=(L->length-1)){
            printf("%d,",L->elem[d]);
        }else{
            printf("%d",L->elem[d]);
        }        
    }
    return 0;
}

编译不报错,但运行时弹出黑框后无法操作,过几秒返回 3221225477

应该是读入的时候出的问题,这个逗号也很难办

问题一: 30行 L没有初始化,没有分配内存空间。有两种修改方法:
一是:用malloc申请空间

SqList *L = (SqList*)malloc(sizeof(SqList));

第二种方法是直接用全局变量,SqList *L改成 SqList L;下面main函数中使用的时候直接用&L就可以了。

问题二:Input函数中不需要调用InitList(L);函数了,因为已经在main函数中调用了。
问题三:Input函数中的shu是干什么用的?在main中也没有初始化就出入Input函数了
代码修改如下,修改部分在代码中有注释:

img

代码:

#include<stdio.h>
#include<stdlib.h>

#define LIST_INIT_SIZE 20  
#define OK 1    
#define ERROR 0 
#define OVERFLOW -1

typedef int Status;

typedef int ElemType;

typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList(SqList *L){ //构造一个空的线性表L
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem){
        exit(OVERFLOW);
    }
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return OK;
}

SqList L;//修改  直接用全局变量,这时候内存由编译器自动分配


void Input(SqList *L /*,char shu*/ )//修改,这里不需要第二个参数 
{
    //InitList(L);  //修改,这里不需要在调用,因为在main函数中已经初始化过了
    char ch;
    int input=0;
    while(1) //修改,这里用ch接收一下输入的字符
    {
        scanf("%d",&L->elem[input]);
        input++;
        if( (ch = getchar())!='\n') //如果输入字符不是回车,继续读取
            continue;
        else
            break;
        /*if(shu!=',')
        {
            shu=shu-48;
            L -> elem[input]=shu;
            input++;
        }*/
    }
    L->length = input; //这里设置表中的实际数据个数
}
Status ListInsert(SqList *L, int i, ElemType e){ 
    int k;
    if (L->length == LIST_INIT_SIZE){  //线性表已满
        return ERROR;
    }   
    if (i < 0 || i > L->length){ //当i不在范围内时  修改,范围
        return ERROR;
    }
    if (i < L->length){  //若插入位置不在表尾
        for(k = L->length-1;k >= i;k--){ //修改 
            L->elem[k+1] = L->elem[k];
        }
    }
    L->elem[i] = e;//修改
    L->length++;    
    return OK;
}


int main(){
    int x,i;
    //char shu;
    int d=0;
    InitList(&L);
    Input(&L /*,shu*/);
    scanf("%d",&x);
    
    int r=0;
    while((L.elem[r])<x){ //修改,应该是<,不是>
        r++;
    }
    ListInsert(&L, r, x);
    for(d=0;d<L.length;d++){
        if(d!=(L.length-1)){
            printf("%d,",L.elem[d]);
        }else{
            printf("%d",L.elem[d]);
        }        
    }
    return 0;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632