写了个线性表的代码,编译通过但是运行报错,求大神指点迷津
#include<stdio.h> #include<stdlib.h>
#define LIST_INIT_SIZE 5 //线性表存储空间的初始分配量
#define LINSTINCREMENT 1 //线性表存储空间的分配增量
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList; SqList L;
void main()
{int i,e,j;
Status InitList_Sq(SqList &L);
Status creat(SqList &L);
Status abc(SqList &L);
Status ListDelete_Sq(SqList &L, int i, ElemType &e);
Status ListInsert_Sq(SqList &L, int i, ElemType e);
printf("\t\t请选择对顺序表的操作,操作菜单如下: \n");
printf("\t\t*************************************************\n");
printf("\t\t 1 建立顺序表(C) \n");
printf("\t\t 2 初始化顺序表(N) \n");
printf("\t\t 3 顺序表中插入元素(I) \n");
printf("\t\t 4 数据表中删除元素(D) \n");
printf("\t\t 5 退出系统(E) \n");
printf("\t\t*************************************************\n");
printf("\t\t作者:HLX \n");
printf("\n选择进行的操作:");
do {
scanf("%d",&j);
if(j<1||j>5)
printf("输入错误,重新输入正确的数字\n");
}while(j<1||j>5);
switch(j)
{case 1:creat(L);
break;
case 2:InitList_Sq(L);
break;
case 3:ListInsert_Sq(L, i, e);
break;
case 4:ListDelete_Sq(L, i, e);
break;
case 5:exit(0);
break;
}
}
Status InitList_Sq(SqList &L) //构造一个新的线性表L。
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (L.elem==0)
{ printf("存储分配失败\n");
return 0;
}
else
{L.length = 0; // 空表长度为0
L.listsize = LIST_INIT_SIZE; // 初始存储容量
}
return 1;
}
Status creat(SqList &L)
{int i,n;
do{
printf("请输入线性表的元素的个数:");
scanf("%d",&n);
if(n<1||n>LIST_INIT_SIZE)
printf("输入错误,请重新输入");
}while(n<1||n>LIST_INIT_SIZE);
for(i=0;i<n;i++) //读入元素
scanf("%d",&L.elem[i]);
L.length =n;
for(i=0;i<L.length;i++) //利用循环输出元素
printf("%d ",L.elem[i]);
return 0;
}
Status ListInsert_Sq(SqList &L, int i, ElemType e) // 在线性表L中插入新的元素e
{ ElemType *p;
int j,*newbase;
printf("请输入你要插入的数据");
scanf("%d",&e);
do //输入数据插入的位置直到输入正确的位置
{printf("请输入你要插入的位置");
scanf("%d",&i);
if(i<1 || i>L.length+1)
printf("请重新输入正确的位置");
}while(i<1 || i>L.length+1);
if (L.length >= L.listsize)
{ // 当前存储空间已满,增加容量
ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize+LINSTINCREMENT)*sizeof (ElemType));
if (newbase==0) return 0; // 存储分配失败
L.elem = newbase; // 新基址
L.listsize += LINSTINCREMENT; // 增加存储容量
}
ElemType *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
for(j=0;j<L.length;j++)
{ printf("%d ",L.elem[j]); }
return 0;
}
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
// 在顺序线性表L中删除第i个元素,并用e返回其值。
{ ElemType j,*p, *q;
do{ printf("请输入你需要删除第几个数据");
scanf("%d",&i);
if (i<1 || i>L.length)
printf("请重新输入正确的位置数字"); // i值不合法
}while(i<1 || i>L.length);
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
for(j=0;j<L.length;j++)
{ printf("%d ",L.elem[j]); }
return 0;
}