两种操作方式
一、利用点运算符访问
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct
{
int data[MAXSIZE]; //存放数组元素
int last; //数组的最后一个元素的下标
}squeuelist;
squeuelist l={0};
int main(void)
{
int choice=0, mount=0, i=0, dat=0, pos=0;
while(1)
{
printf(" 线性顺序表操作练习\n");
printf("1.创建一个顺序表\n");
printf("2.插入数据\n");
printf("3.删除数据\n");
printf("4.打印顺序表\n");
printf("5.退出\n");
printf("请输入你的选择(1-5):");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入你要创建的元素个数:");
scanf("%d", &mount);
if(mount>MAXSIZE)
{
printf("创建的个数大于规定范围!");
break;
}
printf("请输入数据:");
for(i=0; i<mount; i++)
{
scanf("%d",&l.data[i]);
}
l.last = mount-1;
break;
//插入操作
case 2:
printf("请输入要插入的元素值及所在位置(位置1表示元素0,依次类推):");
scanf("%d %d", &dat, &pos);
if(l.last>MAXSIZE-1)
{
printf("空间溢出!\n");
break;
}
else if(pos<1 || pos>l.last+2)
{
printf("插入的位置非法!\n");
break;
}
else
{
for(i=l.last; i>=pos-1;i--)
{
l.data[i+1] = l.data[i];
}
l.data[pos-1] = dat;
l.last += 1;
}
break;
//删除操作
case 3:
printf("请输入你要删除元素所在的位置(位置1代表元素0,依次类推):");
scanf("%d",&pos);
if(pos<1 || pos>l.last+1)
{
printf("输入的位置无效!\n");
break;
}
else
{
for(i=pos; i<=l.last; i++)
{
l.data[i-1] = l.data[i];
}
l.last -= 1;
}
break;
//打印输出顺序表
case 4:
if (mount<=0)
{
printf("No data!\n");
break;
}
printf("顺序表为:");
for(i=0; i<=l.last; i++)
{
printf("%d ", l.data[i]);
}
printf("\n");
printf("顺序表的个数为:%d\n",l.last+1);
break;
//退出程序
case 5:
exit(0);
break;
default:
break;
}
}
return 1;
}
这种访问方式能够成功!
第二种方式利用指针访问
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct
{
int data[MAXSIZE]; //存放数组元素
int last; //数组的最后一个元素的下标
}squeuelist;
squeuelist *l=NULL;
int main(void)
{
int choice=0, mount=0, i=0, dat=0, pos=0;
while(1)
{
printf(" 线性顺序表操作练习\n");
printf("1.创建一个顺序表\n");
printf("2.插入数据\n");
printf("3.删除数据\n");
printf("4.打印顺序表\n");
printf("5.退出\n");
printf("请输入你的选择(1-5):");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入你要创建的元素个数:");
scanf("%d", &mount);
if(mount>MAXSIZE)
{
printf("创建的个数大于规定范围!");
break;
}
printf("请输入数据:");
for(i=0; i<mount; i++)
{
scanf("%d",&l->data[i]);
}
l->last = mount-1;
break;
//插入操作
case 2:
printf("请输入要插入的元素值及所在位置(位置1表示元素0,依次类推):");
scanf("%d %d", &dat, &pos);
if(l->last>MAXSIZE-1)
{
printf("空间溢出!\n");
break;
}
else if(pos<1 || pos>l->last+2)
{
printf("插入的位置非法!\n");
break;
}
else
{
for(i=l->last; i>=pos-1;i--)
{
l->data[i+1] = l->data[i];
}
l->data[pos-1] = dat;
l->last += 1;
}
break;
//删除操作
case 3:
printf("请输入你要删除元素所在的位置(位置1代表元素0,依次类推):");
scanf("%d",&pos);
if(pos<1 || pos>l->last+1)
{
printf("输入的位置无效!\n");
break;
}
else
{
for(i=pos; i<=l->last; i++)
{
l->data[i-1] = l->data[i];
}
l->last -= 1;
}
break;
//打印输出顺序表
case 4:
if (mount<=0)
{
printf("顺序表无数据!\n");
break;
}
printf("顺序表为:");
for(i=0; i<=l->last; i++)
{
printf("%d ", l->data[i]);
}
printf("\n");
printf("顺序表的个数为:%d\n",l->last+1);
break;
//退出程序
case 5:
exit(0);
break;
default:
break;
}
}
return 1;
}
当运行创建一个顺序表时,显示出错,报指令引用的“0x00000000”内存,该内存不能被“written”。
求大神帮忙分析下~
调试,看看指针是否分配了空间,是否访问越界
你看看你结构体定义的对象l是否为NULL吧,。应该是这个为NULL导致的,添加l 是否为NULL的判断应该就ok了
l没有初始化,main开头加上
l = new squeuelist();
结尾加上
delete(l);
new和delete是C++的语法。
如果你用的是纯C,那么使用malloc和free。
这个问题主要是你没有明白什么是指针。第一种你是定义了一个变量是squeuelist类型的,运行的时候已经给其分配了内存空间。第二种你只是定义了一个squeuelist的执行并赋值为NULL,这就是空指针的问题,意思就是现在这个指针变量还没有指向到具体的内存空间,你需要使用new squeuelist或malloc为其分配内存空间。
指针越界等,设置断点单步跟踪一下