rsZheng4916 2021-11-16 21:27 采纳率: 60%
浏览 26
已结题

C语言版顺序表的问题

各位懂哥,我是初学者,我有个问题想要请教,这个代码在main方法中,为什么直接使用方法调用的办法能够直接打印,而直接用for循环的,程序却编译不运行,求赐教。【代码在最下面】

一、【结果截图】

  1. 方法调用【printfList()方法】的可以打印

img

  1. 如下是直接用for打印但是无操作的截图。

img

二、【源代码截图】

#include"stdio.h"
#include"stdlib.h"

#define OK 1
#define ERROR -1
#define MaxSize 100
typedef int ElemType;

// 声明顺序表的结构体类型
typedef struct
{
    ElemType *elem; // 线性表数据存放的空间
    int length;        // 当前线性表的长度
}SqList;            // 定义数据类型的名称

/**
 * @brief  * 初始化线性表
 * 构造一个空的线性表,申请存储空间
 * @param L 线性表
 */
void InitList(SqList *L){
    // 申请空间,分配内存,分配失败返回ERROR
    L->elem = (ElemType *)malloc(sizeof(ElemType)*MaxSize);

    if(L->elem == NULL){
        printf("内存分配失败!\n");
        exit(1);
    }

    // 初始化当前线性表的长度
    L->length = 0;
    printf("内存分配成功!\n");
}

/**
 * @brief 销毁线性表
 */
void DestroyList(SqList *L){
    if(L->elem) free(L);
}

/**
 * @brief 清空线性表
 */
void ClearList(SqList *L){
    L->length = 0;
}

/**
 * @brief Get the Length object 获取线性表长度
 */
int GetLength(SqList L){
    return L.length;
}

/**
 * @brief 判断线性表是否为空
 * @return int 
 */
int EmptyList(SqList L){
    if(L.length == 0)  return 1;
    else return -1;
}

/**
 * @brief 打印
 */
void printfList(SqList *L){
    for(int i = 0;i < GetLength(*L);i++)
        printf("%d ",L->elem[i]);
    printf("\n");
}

/**
 * @brief 插入元素
 * @param L 顺序表
 * @param i 插入位置
 * @param e 插入值
 */
void ListInsert(SqList *L,int i,ElemType e){
    // 插入值非法
    if(i < 0 || i > L->length){
        printf("插入位置非法!\n");
        exit(1);
    }
    // 存储空间已满
    if(L->length >= MaxSize){
        printf("顺序表超出范围!\n");
        exit(1);
    }

    for(int j = L->length-1;j >= i;j--)
        L->elem[j+1] = L->elem[j];
    L->elem[i] = e; // 在位置i插入数据e
    L->length++;    // 顺序表长度加1
}

/**
 * @brief 删除元素
 * @param L 顺序表
 * @param i 位置
 */
int ListDelete(SqList *L,int i){
    if(i < 1 || i>L->length){
        printf("删除非法!\n");
        exit(1);
    }

    for(int j = i;j <= L->length;j++){
        L->elem[j-1] = L->elem[j];
    }
    L->length--;
}

int main(){
    SqList *L;
    int n,e;        // n插入元素个数,e插入元素

    InitList(L); 

    printf("请输入顺序表的大小:");
    scanf("%d",&n);
    printf("请输入顺序表的元素:");
    for(int i = 0;i < n;i++){
        scanf("%d",&e);
        ListInsert(L,i,e);
    }

    printf("打印:");
    // printfList(L);
    for(int i = 0;i < L->length;i++)
        printf("%d ",L->elem[i]);
    printf("\n");

    printf("当前长度:%d\n",GetLength(*L));

    ListDelete(L,2);

    printf("删除后长度:%d\n删除后打印:",GetLength(*L));
    // printfList(L);
    for(int i = 0;i < L->length;i++)
        printf("%d ",L->elem[i]);
    printf("\n");
}

各位懂哥,懂的话希望教一下我这个初学者,给点建议或解决方法都可以,谢谢了,感激之情无以言表。

  • 写回答

1条回答 默认 最新

  • 拂面清风三点水 2021-11-16 23:34
    关注

    应该的运行到23行就报错了,你L指针本身都没有初始化就在访问elem怎么行。其实这种问题只需要一部分一部分注释掉,然后运行几次就能很快发现问题的。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月12日
  • 创建了问题 11月16日

悬赏问题

  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗