程序没有报错,但每次调用CreatList()的时候就结束了,一直运行不下去,这是为什么?
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX_SIZE 100
#define LISTINCREMENT 10
#define OK 1;
#define ERROR 0;
typedef int DataType;
typedef struct{
DataType *elem;
int length;
int listsize;
}SqList;
int InitList_sq(SqList &L){//建立一个空表L
L.elem=(DataType *)malloc(sizeof(DataType)*MAX_SIZE);
//用malloc函数开辟一块大小为MAX_SIZE且类型为DataType的空间
if(!L.elem)exit(OVERFLOW);
//OVERFLOW为math.h的一个宏定义,其值为3, 含义为运算过程中出现了上溢
L.length=0;//空表长度为0
L.listsize=MAX_SIZE;
return OK;
}
void Empty (SqList *L){//顺序表判空
if(L->length==0) printf("空表。");//L指向结构体中的length,成员变量为指针所以使用->
else printf("不是空表。");
}
int ListInsert (SqList &L,int i,DataType e){
//在顺序线性表L中插入元素e使其在第i个位置
int *newbase,*q,*p;
if(i<1||i>L.length+1)return ERROR;
if(L.length>=L.listsize){//当前存储空间已满,增加分配
newbase=(DataType *)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(DataType));
if(!newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p){//从最后一个元素开始循环
*(p+1)=*p;//插入元素后面的元素全部右移
}
*q=e;
L.length++;
return OK;
}
int ListDelete(SqList &L,int i,DataType &e ){
int *p,*q;
if(i<1||i>L.length)return ERROR;
p=&(L.elem[i-1]);//p是被删除元素的地址
e=*p ;//把被删除的值赋给e
q=L.elem+L.length-1;//L.elem是首元素的地址+L.length总数组的长度-1即为表尾元素的地址
for(p=p+1;p<=q;p++) *(p-1)=*p;
L.length--;
return OK;
}
int CreatList(SqList *L,DataType a[],int n){
if(n>MAX_SIZE){return ERROR;}
else
{for(int i=0;i<n;i++)
L->elem[i]=a[i];
L->length=n;
return OK;}
}
int ListLength(SqList &L){
return(L.length);
}
int LocateELem(SqList &L,DataType *e){
int i;
for(int i=0;i<L.length;i++)
if(L.elem[i]==*e) return i+1;
else return OK;
}
int GetElem(SqList &L,int i){
if(i<1||i>L.length){
printf("查找失败\n");return 0;
}
else {printf("检索的元素为%d。\n",L.elem[i-1]);return 1;}
}
int main()
{
int i ,j,*e,n,a[200];
SqList L;
while(i!=10){
printf("1.建立空表\n2.存储数据\n3.删除指定位置元素\n4.在指定位置插入元素\n5.按值检索元素\n6.按位置检索元素\n7.判空\n8.输出顺序表长度\n9.输出顺序表\n10.结束操作\n");
printf("请输入要进行的操作:\n");
scanf("%d",&i);
switch (i) {
case 1:
if(InitList_sq(L))printf("建立成功!\n");
else printf("建立失败。\n");
break;
case 2:
printf("请指定顺序表大小:\n");
scanf("%d",&n);
printf("请输入存储元素:\n");
for (j=0;j<n;j++)
scanf("%d",a[j]);
if(CreatList(&L,a,n))printf("顺序表的空间不够,无法建立顺序表\n");
else printf("存储成功!\n");
break;
case 3:
printf("请输入删除元素位置:\n");
scanf("%d",&j);
if(ListDelete(L,j,*e))printf("删除元素为%d\n",*e);
else printf("删除失败!\n");
break;
case 4:
printf("请输入插入元素位置:\n");
scanf("%d",&j);
printf("请输入插入元素:\n");
scanf("%d",e);
if(ListInsert(L,j,*e))printf("插入成功!\n");
else printf("插入失败!\n");
break;
case 5:
printf("请输入检索元素的值:\n");
scanf("%d",e);
printf("在第%d个位置。\n",LocateELem(L,e));
break;
case 6:
printf("请输入检索元素的位置:\n");
scanf("%d",&j);
GetElem(L,j);
break;
case 7:
Empty(&L);
break;
case 8:
printf("顺序表长度为%d。\n",ListLength(L));
break;
case 9:
for(j=0;j<L.length;j++)
{printf("%5d",L.elem);
if(j%5==0)printf("\n");
break;
default:printf("不存在此操作项!\n");
break;
}
}
}
return 0;
}