线性表的实现(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);

}
  • 运行结果:
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性表是一种常见的数据结构,其操作包括插入、删除、查找等。以下是线性表的几个基本操作的 C 语言实现。 ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 线性表的最大长度 typedef struct { int data[MAXSIZE]; // 存储线性表的数组 int length; // 线性表的当前长度 } List; // 初始化线性表 void initList(List *list) { list->length = 0; } // 插入元素 int insert(List *list, int index, int value) { if (index < 1 || index > list->length + 1) { return 0; // 插入位置不合法 } if (list->length >= MAXSIZE) { return 0; // 线性表已满 } for (int i = list->length; i >= index; i--) { list->data[i] = list->data[i - 1]; // 后面的元素往后移动一位 } list->data[index - 1] = value; // 插入元素 list->length++; // 线性表长度加1 return 1; // 插入成功 } // 删除元素 int delete(List *list, int index) { if (index < 1 || index > list->length) { return 0; // 删除位置不合法 } for (int i = index; i < list->length; i++) { list->data[i - 1] = list->data[i]; // 前面的元素往前移动一位 } list->length--; // 线性表长度减1 return 1; // 删除成功 } // 查找元素 int search(List *list, int value) { for (int i = 0; i < list->length; i++) { if (list->data[i] == value) { return i + 1; // 返回元素的位置(从1开始) } } return 0; // 没有找到元素 } int main() { List list; initList(&list); insert(&list, 1, 10); insert(&list, 2, 20); insert(&list, 3, 30); printf("第2个元素是:%d\n", list.data[1]); delete(&list, 2); printf("第2个元素是:%d\n", list.data[1]); printf("元素30的位置是:%d\n", search(&list, 30)); return 0; } ``` 在上面的代码中,我们使用了结构体来定义线性表,其中 `data` 数组存储线性表的元素,`length` 表示线性表的长度。`initList` 函数用于初始化线性表,`insert` 函数用于插入元素,`delete` 函数用于删除元素,`search` 函数用于查找元素。在 `main` 函数中,我们演示了如何使用这些函数来操作线性表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值