顺序线性表的操作,出现program received signal sigsegv……,不太清楚指针哪里访问错误
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个问题的原因不是在在函数中开辟的空间地址离开函数就无效。
用
malloc()
函数申请的内存地址离开函数后还是有效,需要主动用free()
函数释放才会无效。这段代码出问题的原因在于,传入到
InitList()
函数的参数类型不对。下面这种写法,传入到该函数的 L 指针参数是传值的方式,在InitList()
函数内部并不能修改外部 L 指针变量的值。即,在你的
main()
函数的下面语句中,SqList *L
这个变量的值并不会因为执行InitList(L);
语句而改变。执行InitList(L);
语句后,L 这个变量值还是没有初始化,并没有指向malloc()
分配出来的内存地址。如果你想要修改外部这个 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 本身的值,并不影响外面实参的值。害,终于把指针又看了一遍才找出问题,把上面这句放到主函数就可以了,因为在函数中开辟的空间地址,离开那个函数就无效了。。。。