问题描述
- c语言程序编译都没问题,运行就崩溃,求解!!!
- #include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;int InitList_Sq(SqList L){
//构造一个空的线性表
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L.elem)exit(OVERFLOW);//存储分配失败
L.length = 0;//空表长度为0
L.listsize = LIST_INIT_SIZE;//初始存储容量
return OK;
}//InitList_Sqint ListInsert_Sq(SqList Lint i ElemType e){
//在线性顺序表L中第i个位置之前插入新的元素e,
//I的合法值为1<=i= ElemType *q *p;
ElemType *newbase;
if (iL.length + 1)return ERROR;//i值不合法
if (L.length >= L.listsize){//当前存储空间已满,增加分配
newbase = (ElemType*)realloc(L.elem (L.listsize +LISTINCREMENT)*sizeof(ElemType));
if (!newbase)exit(OVERFLOW);//存储分配失败
L.elem = newbase;//新基址
L.listsize += LISTINCREMENT;// 增加存储容量
}
q = &(L.elem[i - 1]);//q为插入位置
for (p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p;//插入位置及之后的元素右移
*q = e;//插入e
++L.length;//表长增1
return OK;
}//ListInsert_SqElemType ListDelete_Sq(SqList L int i ElemType e){
//在顺序表L中删除第i个元素,并用e返回值
//i的合法值为1=<i<=ListLength_Sq(L)
ElemType *q *p;
p = &(L.elem[i - 1]);//p为被删除元素的位置
e = *p;//被删除元素的值赋给e
q = L.elem + L.length - 1;//表尾元素的位置
for (++p; p <= q; ++p) *(p - 1) = *p;//被删除元素之后的元素左移
--L.length;//表长减1
return e;
}//ListDrlete_Sq
int LocateElem_Sq(SqList L ElemType e){
//在顺序线性表L中查找第一个与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回0
ElemType *p;
int i = 1;//i的初值为第一个元素的位序
p = L.elem;//p的初值为第一个元素的存储位置
while (i <= L.length && *p++!=e)++i;
if (i <= L.length)return i;
else return 0;
}//LocateElem_Sq
int SqList_print(SqList L){
int i;
for( i = 0;i < L.length;i++)
{
printf(""%d""L.elem[i]);
}
return 0;
}
int Show_UI(){
printf(""-----------------Welcome-----------------
"");
printf(""0:插入元素,请输入插入的位置和相应元素
"");
printf(""1:删除元素,请输入需要删除什么位置的元素
"");
printf(""2:查找元素,请输入需要查找的元素
"");
printf(""3:结束程序
"");
printf(""-------------------END-------------------
"");
return 0;
}int main(){
int ch;
int i e;
SqList L;
int a=0;
Show_UI();
while (a == 0){
scanf(""%d"" &ch);
switch (ch)
{
case 0:{
scanf(""%d%d"" &i &e);
ListInsert_Sq(L i e);
printf(""在第%d个位置,插入了元素%d
"" i e);
printf(""%d"" SqList_print(L)); }break;//插入元素
case 1:{
scanf(""%d"" &i);
printf(""删除了第%d个位置的元素%d
"" i ListDelete_Sq(L i e));
printf(""%d"" SqList_print(L)); }break; //删除元素
case 2:{
ElemType *p;
scanf(""%d"" e);
LocateElem_Sq(L e);
if (i != 0){
printf(""您查找的元素%d在第%d个位置
"" e i);
}
else{
printf(""您查找的元素不合法
"");
}}break; //查找线性表中是否含有用户所输入的元素
case 3: a = 1; break; //出口,结束程序
default:printf(""您输入的选择不在可选范围内,请重新选择相应功能!
""); break;
}
Show_UI();
}
return 0;
}
解决方案
首先,case1和case2代码里面没看到对ElemType *elem; 初始化;其它各个子函数都没有对空指针进行判断处理。最后main函数结束时也没有对内存进行释放的操作,有内存泄漏的隐患。
至于调试方法个人建议,在代码量不大的情况下,可以多添加一些打印进行定位即可。
解决方案二:
在linux下编译运行c语言程序
Linux 下编译并运行C语言程序
解决方案三:
代码不完整……而且错误是什么
解决方案四:
可否给出奔溃是的错误,或者啥可以确定的东西?
解决方案五:
单步调试,可以知道是在什么地方崩溃