m0_64743613 2022-03-13 16:45 采纳率: 100%
浏览 45
已结题

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

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

  • 写回答

2条回答 默认 最新

  • 关注

    问题一: 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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥60 如何把照片修复成原始拍摄图
  • ¥80 Exited too quickly (process log may have details)
  • ¥15 爬知乎登录之后内容加载不出来
  • ¥15 怎么用protues测量通频带
  • ¥15 zepelin使用sparkInterpreter 异常
  • ¥15 paho mqtt 接收不到消息
  • ¥15 函数r关于两个分量y,z方向上的图像,分开画r随y的图像,r随z的图像
  • ¥15 如何用Matlab求Pearcey函数的数值积分?
  • ¥15 一个简单的函数定义问题,输出结果是相反的,怎么回事呢?
  • ¥15 页面加载报错,不知道怎么处理