#include
#include
#define LIST_INIT_SIZE 100//初始化分配容量大小
#define LISTINCREMENT 10 //线性表存储空间的分布增量
typedef short int Status;//0和1
typedef int ElemType;
typedef struct{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
Status InitList_Sq(SqList *L);//线性表初始化
void ListPrint_Sq(SqList *L);//线性表打印
Status ListInsert_Sq(SqList *L,int i,ElemType e);//在线性表第i个位置之前插入元素e
Status ListDelete_Sq(SqList *L,int i,ElemType *e);//删除线性表中z第i个元素,并用e返回其值
int LocateElem_Sq(SqList *L,ElemType e,Status (*cmpare)(ElemType,ElemType));//在顺序表中查找第一个值与e满足compare()的位序
Status compare(ElemType e1,ElemType e2);//比较函数,定义指针函数
void MergeList_Sq(SqList la,SqList lb,SqList *lc);//已知la和lb的元素按值非递减排列\
归并la和lb得到的新序列lc,lc的元素也按非递减排列
int main()
{
SqList L;
if(InitList_Sq(&L)){
printf("初始化成功\n");
}else{
printf("初始化失败\n");
}
/* if(ListInsert_Sq(&L,1,1)){
printf("插入成功\n");
}else{
printf("插入失败\n");
}*/
int i = 1;
while(i <= 15){
if(ListInsert_Sq(&L,i,i)){
i++;
}
}
ListPrint_Sq(&L);
printf("\n");
ElemType e;
if(ListDelete_Sq(&L,1,&e)){
printf("删除成功,删除第1个元素的值为:%d\n",e);
}
ListPrint_Sq(&L);
printf("\n");
printf("10在线性表中的第 %d 个位置。\n",LocateElem_Sq(&L,10,compare));
printf("\n");
printf("L.elem[0]: %d\n",L.elem[0]);
printf("L.length = %d\n",L.length);
printf("L.listsize = %d\n",L.listsize);
return 0;
}
Status InitList_Sq(SqList *L)//初始化成功返回1,失败返回零
{
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->elem){
return 0;
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return 1;
}
void ListPrint_Sq(SqList *L)//线性表打印
{
int i = 0;
while(i <= L->length - 1)
{
printf("%6d",L->elem[i]);
++i;
}
}
Status ListInsert_Sq(SqList *L,int i,ElemType e)
{
if(i < 1 || i > L->length + 1){
printf("插入不合法\n");
return 0;//插入失败
}
if(L->length >= L->listsize){//当前存储空间已满
ElemType *newbase = (ElemType*)realloc(L->elem,(L->listsize + LISTINCREMENT) * sizeof(ElemType));
if(!newbase){
exit(0);
}
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
ElemType *q = &(L->elem[i - 1]);
ElemType *p = &(L->elem[L->length - 1]);
for(p; p >= q; p--){
*(p + 1) = *p;
}
*q = e;
++ (L->length);//表长增加1
return 1;//插入成功
}
Status ListDelete_Sq(SqList *L,int i,ElemType *e)//删除线性表中z第i个元素,并用返回其值
{
if((i < 1) || (i > L->length)){
printf("删除位置不合法\n");
return 0;
}
ElemType *p = &(L->elem[L->length - 1]);
ElemType *q = &(L->elem[i - 1]);//被删除的位置
*e = *q;
for(p ;q < p; q++){
*q = *(q + 1);
}
-- (L->length);
return 1;//删除成功
}
int LocateElem_Sq(SqList *L,ElemType e,Status (*cmpare)(ElemType,ElemType))//在顺序表中查找第一个值与e满足compare()的位序
{
unsigned int i = 1;
ElemType *p = L->elem;//首元素的存储地址
while(i < L->length && !(*compare)(e,*p)){
++p;
++i;
}
if(i < L->length){
return i;
}else{
return 0;
}
}
Status compare(ElemType e1,ElemType e2)
{
if(e1 == e2){
return 1;
}else{
return 0;
}
}
void MergeList_Sq(SqList la,SqList lb,SqList *lc)//已知la和lb的元素按值非递减排列\
归并la和lb得到的新序列lc,lc的元素也按非递减排列
{
ElemType *pa = la.elem;
ElemType *pb = lb.elem;
lc->listsize = lc->length = la.length + lb.length;
lc->elem = (ElemType *)malloc(lc->listsize * sizeof(ElemType));
if(!lc->elem){
printf("合成的链表的空间分配失败\n");
exit(0);
}
ElemType *pc = lc->elem;
ElemType *pa_end = la.elem + (la.length - 1);
ElemType *pb_end = lb.elem + (lb.length - 1);
while(pa <= pa_end && pb <= pb_end){
if(*pa < *pb){
*pc = *pa;
pc++;
pa++;
}else{
*pc = *pb;
pc++;
pb++;
}
}
while(pa <= pa_end){//插入剩余的la元素
*pc++ = *pa++;
}
while(pb <= pb_end){//插入剩余的lb元素
*pc++ = *pb++;
}
}
//注:已测试