C数据结构代码实现-----严蔚敏 (1) 线性表

#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++;
    }
}
//注:已测试

你可能感兴趣的:(数据结构,线性表)