线性表的实现(C语言)

线性表的实现(C语言)

SqList

1.储存结构定义:

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define INITSIZE 100//线性表储存结构初始分配分量
#define ENLARGE 10  //线性表储存结构分配增量

typedef int Status;
typedef int ElemType;

typedef struct
{
    ElemType *elem; //线性表基址
    int length; //线性表长度
    int listsize;   //当前分配的容量
}SqList;  

2.构造线性表:

Status InitList(SqList *L)
{
    //构造一个空的线性表
    L->elem = (ElemType*)malloc(INITSIZE * sizeof(ElemType));
    if(!L->elem) exit(OVERFLOW);
    L->length = 0;
    L->listsize = INITSIZE;
    return OK;
}

3.销毁线性表:

Status DestroyList(SqList *L)
{
    //销毁线性表L
    free(L->elem);
    L->elem = NULL;
    L->length = 0;
    L->listsize = 0;
    return OK;
}

4.重置线性表

Status ClearList(SqList *L)
{
    //将L重置为空表
    free(L->elem);
    L->elem = (ElemType*)malloc(INITSIZE * sizeof(ElemType));
    if(!L->elem) exit(OVERFLOW);
    L->length = 0;
    L->listsize = INITSIZE;
    return OK;
}  

5.判断线性表是否为空表

Status EmptyList(SqList *L)
{
    //判断L是否为空表
    if(!L->elem) exit(INFEASIBLE);
    if(L->length == 0) return TRUE;
    else return FALSE;
}

6.线性表长度

Status ListLength(SqList *L)
{
    //返回线性表L中的元素个数
    return L->length;
}

7.返回值

Status GetElem(SqList *L,int i)
{
    //用e返回线性表L中的第i个值
    ElemType *p = L->elem;
    if(i >= 1 && i <= L->length){
        return *(p + i - 1);
    }
    else return ERROR;
}

8.判断元素

Status LocateElem(SqList *L,ElemType e)
{
    //判断线性表中是否存在e
    ElemType *p;
    p = L->elem;
    int i = 1;
    while(i <= L->length && *(p++) != e){
        i++;
    }
    if(i <= L->length) return i;
    else return ERROR;
}

9.找前驱

Status PriorElem(SqList *L,int i)
{
    //找线性表中第i个元素的前驱
    if(i == 1)
        return ERROR;
    else{
        return L->elem[i - 2];
    }
}

10.找后继

Status NextElem(SqList *L,int i)
{
    //找线性表中第i个元素的后继
    if(i == L->length)
        return ERROR;
    else{
        return L->elem[i];
    }
}

11.扩充储存空间

Status MallocAgain(SqList *L)
{
    //扩充线性表的储存空间
    ElemType *p;
    p = (ElemType*)realloc(L->elem,ENLARGE * sizeof(ElemType));
    if(!p) exit(OVERFLOW);
    L->elem = p;
    L->listsize += ENLARGE;
    printf("储存空间已扩充!");
    return OK;
}

12.插入元素

Status ListInsert(SqList *L,int i,ElemType e)
{
    //在线性表第i个位置前插入e
    int k;
    ElemType *p;
    p = L->elem;
    if(L->length == INITSIZE){
        MallocAgain(&L);
    }
    if(i < 1 || i > L->length + 1){
        printf("插入位置不正确!");
        return ERROR;
    }
    if(i >= 1 && i <= L->length){       //非表尾插入的情况
        if(L->length != 0){
            for(k = L->length - 1;k >= i - 1;k--){
                *(p + k + 1) = *(p + k);
            }
        }
    }
    *(p + i - 1) = e;
    L->length = L->length + 1;
    return OK;
}

13.删除元素

Status ListDelete(SqList *L,int i)
{
    //删除线性表第i个元素
    ElemType *p;
    ElemType e;
    p = L->elem;
    if(EmptyList(L)){
        printf("线性表为空,无法进行操作!");
        return ERROR;
    }
    e = *(p + i - 1);
    for(int j = i - 1;j < L->length;j++){
        *(p + j) = *(p + j +1);
    }
    L->length--;
    return e;
}

14.遍历线性表

Status ListTraverse(SqList *L)
{
    //遍历输出线性表元素
    for(int i = 1;i <= L->length;i++){
        printf("%d\n",GetElem(L,i));
    }
    return OK;
}

15.主函数

int main()
{
    SqList *L;
    ElemType e;
    int len;
    ElemType *cur_e;
    InitList(&L);
    ListInsert(&L,1,18);
    ListInsert(&L,1,17);
    ListInsert(&L,1,16);
    ListInsert(&L,1,15);
    ListInsert(&L,1,14);
    len = ListLength(&L);
    for(int i = 1;i <= len;i++){
        printf("%d\n",GetElem(&L,i));
    }
    printf("线性表长度:%d\n",len);
    printf("*****************************\n");

    printf("删除:%d\n",ListDelete(&L,1));
    len = ListLength(&L);
    for(int i = 1;i <= len;i++){
        printf("%d\n",GetElem(&L,i));
    }
    printf("线性表长度:%d\n",len);
    printf("*****************************\n");

    printf("第三个元素的前驱:%d\n",PriorElem(&L,3));
    printf("第三个元素的后继:%d\n",NextElem(&L,3));
    printf("*****************************\n");

    ListTraverse(&L);

    DestroyList(&L);

}
  • 运行结果:

你可能感兴趣的:(数据结构)