线性表的实现(C语言)

来源:互联网 发布:下载手机开关机软件 编辑:程序博客网 时间:2024/05/16 11:45

线性表的实现(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);}
  • 运行结果:
原创粉丝点击