顺序线性表的操作,出现program received signal sigsegv……,不太清楚指针哪里访问错误

发布于 2022-09-12 01:45:21 字数 2513 浏览 14 评论 0

微信图片_20200320162206.png

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define MaxSize 50
typedef char Elemtype; //用Elemtype代替char


//定义结构体
typedef struct 
{
    char data[MaxSize];//
    int length;
} SqList;

int main() {
    int InitList(SqList *L);//初始化;
    int DestoryList(SqList *L);//释放;
    int ListEmpty(SqList *L);//判断是否为空;
    int ListLength(SqList *L);//获取长度;
    int DispList(SqList *L);//输出;
    int GetElem(SqList *L,int i,Elemtype e);//获取第i个数;
    int LocateEmpty(SqList *L,Elemtype e);//查找;
    int ListInsert(SqList *L,int i,Elemtype e);//插入;
    int ListDelete(SqList *L,int i,Elemtype e);//删除;

    SqList *L;
    Elemtype e;
    printf("初始化线性表\n");
    InitList(L);
    printf("插入7,9,12,13,14,15,18\n");
    ListInsert(L,1,7);
    ListInsert(L,2,9);
    ListInsert(L,3,12);
    ListInsert(L,4,13);
    ListInsert(L,5,14);
    ListInsert(L,6,15);
    ListInsert(L,7,18);
    printf("输出顺序表L\n");
    DispList(L);
    printf("\n");
    printf("顺序表L的长度=%d\n",ListLength(L));
    printf("顺序表第三个元素\n");
    GetElem(L,3,12);
    printf("元素15的位置\n");
    LocateEmpty(L,15);
}

//初始化线性表
int InitList(SqList *L) {
    L=(SqList *)malloc(sizeof(SqList));//为顺序表分配空间
    L->length=0;
}

//释放
int DestroyList(SqList *L) {
    free(L);
}

//判断是否为空
int ListEmpty(SqList *L) {
    return(L->length==0);
}

//获取长度
int ListLength(SqList *L) {
    return(L->length);
}

//输出
int DispList(SqList *L) {
    int i;
    if(!ListEmpty(L)) return 0;
    else
        for(i=0; i<L->length; i++)
            printf("%c ",L->data[i]);
}

//获取第i个元素
int GetElem(SqList *L,int i,Elemtype e) {
    if(i<1||i>L->length)
        return 0;
    else
        return e=L->data[i-1]; //i-1将位置转化为下标;
}

//查找
int LocateEmpty(SqList *L,Elemtype e) {
    int i;
    for(i=0; i<L->length; i++)
        if(L->data[i]==e)
            return i+1;
    if(i>L->length)
        return 0;
}

//插入
int ListInsert(SqList *L,int i,Elemtype e) {
    int j;
    if(i<1||i>L->length+1)
        return 0;
    /*if (i>=j)
    {
     L->data[i-1]=e;
     L->length++;
    }*/
    else {
        i--; //将位置转化为数组下标;
        for(j=L->length; j>i; j--) //j>i才会到data[i+1]=data[i]停;
            L->data[j]=L->data[j-1];  //从最后一个开始后移;
        L->data[i]=e;
        L->length++;    //长度变长;
    }
}
/*
//删除
int ListDelete(SqL */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

み零 2022-09-19 01:45:21

把上面这句放到主函数就可以了,因为在函数中开辟的空间地址,离开那个函数就无效了

这个问题的原因不是在在函数中开辟的空间地址离开函数就无效。

malloc() 函数申请的内存地址离开函数后还是有效,需要主动用 free() 函数释放才会无效。

这段代码出问题的原因在于,传入到 InitList() 函数的参数类型不对。下面这种写法,传入到该函数的 L 指针参数是传值的方式,在 InitList() 函数内部并不能修改外部 L 指针变量的值。

int InitList(SqList *L) {
    L=(SqList *)malloc(sizeof(SqList));//为顺序表分配空间
    L->length=0;
}

即,在你的 main() 函数的下面语句中,SqList *L 这个变量的值并不会因为执行 InitList(L); 语句而改变。执行 InitList(L); 语句后,L 这个变量值还是没有初始化,并没有指向 malloc() 分配出来的内存地址。

    SqList *L;
    Elemtype e;
    printf("初始化线性表\n");
    InitList(L);

如果你想要修改外部这个 L 变量的值,要把 InitList 函数的参数类型改成 InitList(SqList **L),然后再该函数里面用 *L 来为它赋值。

L=(SqList *)malloc(sizeof(SqList));//为顺序表分配空间 提到主函数有效,就是因为这会真正为 L 变量赋值。

你可以用 printf("L: %p", &L); 语句打印 L 指针变量的地址来查看 InitList() 函数内外 L 的地址,看是否一样。

对于 InitList(SqList *L) 这种函数来说,可以用 L 指针来修改 L 指向的内存地址的值,但是这个 L 是形参,修改 L 本身的值,并不影响外面实参的值。

满栀 2022-09-19 01:45:21
L=(SqList *)malloc(sizeof(SqList));//为顺序表分配空间

害,终于把指针又看了一遍才找出问题,把上面这句放到主函数就可以了,因为在函数中开辟的空间地址,离开那个函数就无效了。。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文