#define InitSize 100
#define Increment 10
#define NUM 5
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int size;
}SqList;
Status InitList(SqList &L)
{
L.elem = (ElemType*)malloc(InitSize*sizeof(ElemType));
if(!L.elem)
{
exit(OVERFLOW);
}
//为新申请的内存做初始化
memset(L.elem,0,InitSize * sizeof(ElemType));
L.length = 0;
L.size = InitSize;
return OK;
}
Status ListInsert(SqList &L,int i,ElemType e)
{
ElemType *newbase,*q,*p;
if(i<1 || (i>L.length+1))
return ERROR;
if(L.length >= L.size)
{
//将已分配的起始地址为L.elem、长度为L.size的内存区改为L.size + Increment
newbase = (ElemType*)realloc(L.elem,(L.size + Increment)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem = newbase;
L.size += Increment;
}
q = &(L.elem[i-1]);
for(p = &(L.elem[L.length-1]); p >= q; p--)
*(p+1) = *p;
*q = e;
L.length++;
return OK;
}
//形参和实参同步更新的方法:1.加引用 2.声明为指针 3.声明为全局变量
Status ListDelete(SqList &L,int i,ElemType &e)
{
ElemType *q,*p;
if(i < 1 || i > L.length)
return ERROR;
p = &(L.elem[i-1]);
e = *p;
q = L.elem + L.length - 1;
for(p++ ; p <= q ; p++)
*(p-1) = *p;
L.length--;
return OK;
}
Status equal(ElemType i,ElemType j)
{
if(i == j)
return OK;
else
return ERROR;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType,ElemType))
{
int i;
ElemType *p;
i = 1;
p = L.elem;
while(i<L.length && !(*compare)(*p++,e))
i++;
if(i <= L.length)
return i;
else
return 0;
}
int main(int argc, char* argv[])
{
SqList L;
ElemType delElem;
int i,pos;
InitList(L);
printf("测试初始值\t\t length = %d\n",L.length);
for(i=0;i<NUM;i++)
printf("elem[%d]=%d ",i,L.elem[i]);
printf("\n\n");
for(i=1 ; i<=NUM; i++)
ListInsert(L,i,i);
printf("测试插入功能\t\t length = %d\n",L.length);
for(i=0 ; i<L.length ; i++)
printf("elem[%d]=%d ",i,L.elem[i]);
printf("\n\n");
ListDelete(L,2,delElem);
printf("测试删除功能\t\t length = %d\n",L.length);
for(i=0 ; i<L.length ; i++)
printf("elem[%d]=%d ",i,L.elem[i]);
printf("\n delElem = %d\n\n",delElem);
printf("测试查找功能\t\t length = %d\n",L.length);
for(i=1 ; i<L.length ; i++)
{
pos = LocateElem(L,i,equal);
printf("pos = %d ",pos);
}
printf("\n\n");
//在main函数中,return 0是正常退出,return非零为异常退出,返回值是返回给操作系统识别的状态。
return 0;
}
#define Increment 10
#define NUM 5
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int size;
}SqList;
Status InitList(SqList &L)
{
L.elem = (ElemType*)malloc(InitSize*sizeof(ElemType));
if(!L.elem)
{
exit(OVERFLOW);
}
//为新申请的内存做初始化
memset(L.elem,0,InitSize * sizeof(ElemType));
L.length = 0;
L.size = InitSize;
return OK;
}
Status ListInsert(SqList &L,int i,ElemType e)
{
ElemType *newbase,*q,*p;
if(i<1 || (i>L.length+1))
return ERROR;
if(L.length >= L.size)
{
//将已分配的起始地址为L.elem、长度为L.size的内存区改为L.size + Increment
newbase = (ElemType*)realloc(L.elem,(L.size + Increment)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem = newbase;
L.size += Increment;
}
q = &(L.elem[i-1]);
for(p = &(L.elem[L.length-1]); p >= q; p--)
*(p+1) = *p;
*q = e;
L.length++;
return OK;
}
//形参和实参同步更新的方法:1.加引用 2.声明为指针 3.声明为全局变量
Status ListDelete(SqList &L,int i,ElemType &e)
{
ElemType *q,*p;
if(i < 1 || i > L.length)
return ERROR;
p = &(L.elem[i-1]);
e = *p;
q = L.elem + L.length - 1;
for(p++ ; p <= q ; p++)
*(p-1) = *p;
L.length--;
return OK;
}
Status equal(ElemType i,ElemType j)
{
if(i == j)
return OK;
else
return ERROR;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType,ElemType))
{
int i;
ElemType *p;
i = 1;
p = L.elem;
while(i<L.length && !(*compare)(*p++,e))
i++;
if(i <= L.length)
return i;
else
return 0;
}
int main(int argc, char* argv[])
{
SqList L;
ElemType delElem;
int i,pos;
InitList(L);
printf("测试初始值\t\t length = %d\n",L.length);
for(i=0;i<NUM;i++)
printf("elem[%d]=%d ",i,L.elem[i]);
printf("\n\n");
for(i=1 ; i<=NUM; i++)
ListInsert(L,i,i);
printf("测试插入功能\t\t length = %d\n",L.length);
for(i=0 ; i<L.length ; i++)
printf("elem[%d]=%d ",i,L.elem[i]);
printf("\n\n");
ListDelete(L,2,delElem);
printf("测试删除功能\t\t length = %d\n",L.length);
for(i=0 ; i<L.length ; i++)
printf("elem[%d]=%d ",i,L.elem[i]);
printf("\n delElem = %d\n\n",delElem);
printf("测试查找功能\t\t length = %d\n",L.length);
for(i=1 ; i<L.length ; i++)
{
pos = LocateElem(L,i,equal);
printf("pos = %d ",pos);
}
printf("\n\n");
//在main函数中,return 0是正常退出,return非零为异常退出,返回值是返回给操作系统识别的状态。
return 0;
}