编译器没有检查出错误,但是没有结果输出
//尾插尾删,头插头删,中间插入删除,查找
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SqList
{
SLDataType* a;//存储数据
int size;//有效数据长度
int Capacity;//开辟内存的空间
}SL,SqList;
void SqListInit(SL* ps)//初始化
{
ps->a=(SLDataType*)malloc(sizeof(SLDataType)*4);
if(ps->a==NULL)
{
printf("初始化失败!\n");
exit(-1);
}
ps->a=NULL;
ps->size=0;
ps->Capacity=4;
}
void SqListCheckcapcity(SL* ps)
{
assert(ps);
if(ps->size>ps->Capacity)
{
ps->Capacity *=2;
ps->a=(SLDataType*)realloc(ps->a,sizeof(SLDataType)*ps->Capacity);
if(ps->a=NULL)
{
printf("扩容失败!\n");
exit(-1);
}
}
}
void SqListprintf(SL* ps)//遍历
{
assert(ps);
int i=0;
for(;i<ps->size;i++)
{
printf("%d",ps->a[i]);
}
printf("\n");
}
void SqListpushback(SL* ps,SLDataType x)//尾插
{
assert(ps);
SqListCheckcapcity(ps);
if(ps->Capacity>0)
{
ps->a[ps->size]=x;
}
ps->size++;
}
void SqListpopback(SL* ps)
{
assert(ps);
ps->size--;
}
void SqListpushfront(SL* ps,SLDataType x) //头插
{
assert(ps);
SqListCheckcapcity(ps);
int end=ps->size;
while(end>0)
{
ps->a[end]=ps->a[end-1];
end--;
}
ps->a[0]=x;
ps->size++;
}
void SqListpopfront(SL* ps)
{
assert(ps);
int begin=0;
while(begin<ps->size-1)
{
ps->a[begin]=ps->a[begin+1];
begin++;
}
ps->size--;
}
void SqListinsert(SL* ps,SLDataType pos,int x)//中间插入
{
assert(ps);
SqListCheckcapcity(ps);
int end=ps->size;
while(ps->Capacity>0&&pos<end)
{
ps->a[end]=ps->a[end-1];
end--;
}
ps->a[pos]=x;
ps->size++;
}
void SqListerase(SL* ps,SLDataType pos)
{
assert(ps);
int end=ps->size-1;
if(ps->Capacity>0&&pos<end)
{
ps->a[pos]=ps->a[pos+1];
pos++;
}
ps->size--;
}
int main(void)
{
SqList ps;
SqListInit(&ps);
SqListpushback(&ps,1);//尾插
SqListpushback(&ps,2);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps,3);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps,4);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps,5);//尾插
SqListprintf(&ps);//遍历
SqListpopback(&ps);//尾删
SqListprintf(&ps);//遍历
SqListpushfront(&ps,9);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps,8);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps,7);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps,6);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpopfront(&ps);//头删,向前边移,前边的先移
SqListprintf(&ps);//遍历
return 0;
}
希望找到问题所在!谢谢
修改的部分在代码中有注释,代码修改如下:
//尾插尾删,头插头删,中间插入删除,查找
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SqList
{
SLDataType* a;//存储数据
int size;//有效数据长度
int Capacity;//开辟内存的空间
}SL, SqList;
void SqListInit(SL* ps)//初始化
{
ps->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);
if (ps->a == NULL)
{
printf("初始化失败!\n");
exit(-1);
}
//ps->a = NULL; //修改1 已经申请空间了,这里不应该再设置为NULL
ps->size = 0;
ps->Capacity = 4;
}
void SqListCheckcapcity(SL* ps)
{
assert(ps);
if (ps->size >= ps->Capacity) //修改2,这里应该是>=
{
ps->Capacity *= 2;
ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->Capacity);
if (ps->a == NULL) //修改3 应该是 ==,不是=
{
printf("扩容失败!\n");
exit(-1);
}
}
}
void SqListprintf(SL* ps)//遍历
{
assert(ps);
int i = 0;
for (; i < ps->size; i++)
{
printf("%d", ps->a[i]);
}
printf("\n");
}
void SqListpushback(SL* ps, SLDataType x)//尾插
{
assert(ps);
SqListCheckcapcity(ps);
if (ps->Capacity > ps->size ) //修改4 ps->Capacity > 0
{
ps->a[ps->size] = x;
}
ps->size++;
}
void SqListpopback(SL* ps)
{
assert(ps);
ps->size--;
}
void SqListpushfront(SL* ps, SLDataType x) //头插
{
assert(ps);
SqListCheckcapcity(ps);
int end = ps->size;
while (end > 0)
{
ps->a[end] = ps->a[end - 1];
end--;
}
ps->a[0] = x;
ps->size++;
}
void SqListpopfront(SL* ps)
{
assert(ps);
int begin = 0;
while (begin < ps->size - 1)
{
ps->a[begin] = ps->a[begin + 1];
begin++;
}
ps->size--;
}
void SqListinsert(SL* ps, SLDataType pos, int x)//中间插入
{
assert(ps);
SqListCheckcapcity(ps);
int end = ps->size;
while (ps->Capacity > 0 && pos < end)
{
ps->a[end] = ps->a[end - 1];
end--;
}
ps->a[pos] = x;
ps->size++;
}
void SqListerase(SL* ps, SLDataType pos)
{
assert(ps);
int end = ps->size - 1;
if (ps->Capacity > 0 && pos < end)
{
ps->a[pos] = ps->a[pos + 1];
pos++;
}
ps->size--;
}
int main(void)
{
SqList ps;
SqListInit(&ps);
SqListpushback(&ps, 1);//尾插
SqListpushback(&ps, 2);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps, 3);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps, 4);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps, 5);//尾插
SqListprintf(&ps);//遍历
SqListpopback(&ps);//尾删
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 9);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 8);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 7);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 6);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpopfront(&ps);//头删,向前边移,前边的先移
SqListprintf(&ps);//遍历
return 0;
}
根据返回信息看,应该是指针操作错误崩溃了
第20行应该删除啊,前面给a分配了空间,怎么突然加一行将a设置为空呢?设置为空后面还怎么玩
第31行错了, if(ps->a=NULL) 改为 if(ps->a==NULL)
第28行分配空间在等于时就需要分配
//尾插尾删,头插头删,中间插入删除,查找
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SqList
{
SLDataType* a;//存储数据
int size;//有效数据长度
int Capacity;//开辟内存的空间
}SL,SqList;
void SqListInit(SL* ps)//初始化
{
ps->a=(SLDataType*)malloc(sizeof(SLDataType)*4);
if(ps->a==NULL)
{
printf("初始化失败!\n");
exit(-1);
}
// ps->a=NULL;
ps->size=0;
ps->Capacity=4;
}
void SqListCheckcapcity(SL* ps)
{
assert(ps);
if(ps->size>=ps->Capacity)
{
ps->Capacity *=2;
ps->a=(SLDataType*)realloc(ps->a,sizeof(SLDataType)*ps->Capacity);
if(ps->a==NULL)
{
printf("扩容失败!\n");
exit(-1);
}
}
}
void SqListprintf(SL* ps)//遍历
{
assert(ps);
int i=0;
for(;i<ps->size;i++)
{
printf("%d",ps->a[i]);
}
printf("\n");
}
void SqListpushback(SL* ps,SLDataType x)//尾插
{
assert(ps);
SqListCheckcapcity(ps);
if(ps->Capacity>0)
{
ps->a[ps->size]=x;
}
ps->size++;
}
void SqListpopback(SL* ps)
{
assert(ps);
ps->size--;
}
void SqListpushfront(SL* ps,SLDataType x) //头插
{
assert(ps);
SqListCheckcapcity(ps);
int end=ps->size;
while(end>0)
{
ps->a[end]=ps->a[end-1];
end--;
}
ps->a[0]=x;
ps->size++;
}
void SqListpopfront(SL* ps)
{
assert(ps);
int begin=0;
while(begin<ps->size-1)
{
ps->a[begin]=ps->a[begin+1];
begin++;
}
ps->size--;
}
void SqListinsert(SL* ps,SLDataType pos,int x)//中间插入
{
assert(ps);
SqListCheckcapcity(ps);
int end=ps->size;
while(ps->Capacity>0&&pos<end)
{
ps->a[end]=ps->a[end-1];
end--;
}
ps->a[pos]=x;
ps->size++;
}
void SqListerase(SL* ps,SLDataType pos)
{
assert(ps);
int end=ps->size-1;
if(ps->Capacity>0&&pos<end)
{
ps->a[pos]=ps->a[pos+1];
pos++;
}
ps->size--;
}
int main(void)
{
SqList ps;
SqListInit(&ps);
SqListpushback(&ps,1);//尾插
SqListpushback(&ps,2);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps,3);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps,4);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps,5);//尾插
SqListprintf(&ps);//遍历
SqListpopback(&ps);//尾删
SqListprintf(&ps);//遍历
SqListpushfront(&ps,9);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps,8);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps,7);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps,6);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpopfront(&ps);//头删,向前边移,前边的先移
SqListprintf(&ps);//遍历
system("pause");
return 0;
}
```c
//尾插尾删,头插头删,中间插入删除,查找
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SqList
{
SLDataType* a;//存储数据
int size;//有效数据长度
int Capacity;//开辟内存的空间
}SL, SqList;
void SqListInit(SL* ps)//初始化
{
ps->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);
if (ps->a == NULL)
{
printf("初始化失败!\n");
exit(-1);
}
//【主要错误】这里将刚分配的内存丢失了
//ps->a = NULL;
ps->size = 0;
ps->Capacity = 4;
}
void SqListCheckcapcity(SL* ps)
{
assert(ps);
//if (ps->size > ps->Capacity)
if (ps->size >= ps->Capacity)
{
ps->Capacity *= 2;
ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType)*ps->Capacity);
if (ps->a == NULL)
{
printf("扩容失败!\n");
exit(-1);
}
}
}
void SqListprintf(SL* ps)//遍历
{
assert(ps);
int i = 0;
for (; i < ps->size; i++)
{
printf("%d", ps->a[i]);
}
printf("\n");
}
void SqListpushback(SL* ps, SLDataType x)//尾插
{
assert(ps);
SqListCheckcapcity(ps);
if (ps->Capacity > 0)
ps->a[ps->size] = x;
ps->size++;
}
void SqListpopback(SL* ps)
{
assert(ps);
ps->size--;
}
void SqListpushfront(SL* ps, SLDataType x) //头插
{
assert(ps);
SqListCheckcapcity(ps);
int end = ps->size;
while (end > 0)
{
ps->a[end] = ps->a[end - 1];
end--;
}
ps->a[0] = x;
ps->size++;
}
void SqListpopfront(SL* ps)
{
assert(ps);
int begin = 0;
//while (begin < ps->size - 1)
//需要-2 因为从0开始最大应该到size-1 但是下面会执行到begin+1 所以实际到了size 会越界
while (begin < ps->size - 2)
{
ps->a[begin] = ps->a[begin + 1];
begin++;
}
ps->size--;
}
void SqListinsert(SL* ps, SLDataType pos, int x)//中间插入
{
assert(ps);
SqListCheckcapcity(ps);
int end = ps->size;
while (ps->Capacity > 0 && pos < end)
{
ps->a[end] = ps->a[end - 1];
end--;
}
ps->a[pos] = x;
ps->size++;
}
void SqListerase(SL* ps, SLDataType pos)
{
assert(ps);
int end = ps->size - 1;
if (ps->Capacity>0 && pos < end)
{
ps->a[pos] = ps->a[pos + 1];
pos++;
}
ps->size--;
}
int main(void)
{
SqList ps;
SqListInit(&ps);
SqListpushback(&ps, 1);//尾插
SqListpushback(&ps, 2);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps, 3);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps, 4);//尾插
SqListprintf(&ps);//遍历
SqListpushback(&ps, 5);//尾插
SqListprintf(&ps);//遍历
SqListpopback(&ps);//尾删
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 9);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 8);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 7);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpushfront(&ps, 6);//头插,向后边挪,后边的先移
SqListprintf(&ps);//遍历
SqListpopfront(&ps);//头删,向前边移,前边的先移
SqListprintf(&ps);//遍历
getchar();
return 0;
}
```
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!