数据结构-顺序表及其应用

(以下主要内容由学生完成) 

  • 实验项目名称:

顺序表及其应用

  • 实验要求

1、      问题描述;

2、      测试结果的分析与讨论,在测试过程中遇到的主要问题及采取的解决措施。

3、      设计与实现过程中的体会,进一步的改进设想。

4、      实现算法的程序清单,应有足够的注释。

  • 实验内容

(1)  实现线性表的顺序存储方法,顺序表建立、插入、删除、查找等基本操作。

(2) 基于顺序表的基本操作,编写算法函数ListReverse(SqList& L),实现顺序表的就地逆置。

  • 算法分析

Status InitList(SqList& L) {// 创建顺序表

    L.elem = new ElemType[MAXSIZE];// 为顺序表分配空间

    if (!L.elem) {// 未分配成功

         exit(OVERFLOW);

    }

    L.length = 0;

    return OK;

}

创建顺序表:为顺序表分配空间,如果未成功返回错误值ERROR

Status GetElem(SqList L, int i, ElemType& e) {// 取值

    if (i < 0 || i > L.length) {// 判断是否越界

         return ERROR;

    }

    e = L.elem[i - 1];

    return OK;

}

取值:时间复杂度O(1),找到该数据返回OK,未成功返回错误值ERROR

int LocateElem(SqList L, ElemType e) {// 查找

    for (int i = 0; i < L.length; i++) {

         if (L.elem[i] == e) {

             return i + 1;

         }

    }

    return 0;

}

查找:时间复杂度O(n)= n,当找到时返回该数据的序号,未成功返回错误值ERROR

Status ListInsert(SqList& L, int i, ElemType e) {// 插入

    if ((i < 1) || (i > L.length + 1)) {// 判断是否越界

         return ERROR;

    }

    if (L.length == MAXSIZE) {

         return ERROR;

    }

    for (int j = L.length - 1; j > i - 1; j--) {

         L.elem[j + 1] = L.elem[j];

    }

    L.elem[i - 1] = e;

    ++L.length;

    return OK;

}

插入:时间复杂度O(n),从最后一个数据开始向后移,一直移到插入序号+1的位置,插入成功返回正确值OK,未成功返回错误值ERROR

Status ListDelete(SqList& L, int i) {// 删除

    if ((i < 1) || (i > L.length + 1)) {// 判断是否越界

         return ERROR;

    }

    for (int j = i; j <= L.length - 1; j++) {

         L.elem[j - 1] = L.elem[j];

    }

    --L.length;// 表长减一

    return OK;

}

删除:时间复杂度O(n),从最后一个数据开始向前移,一直移到删除序号+1的位置,删除成功返回正确值OK,未成功返回错误值ERROR

Status ListReverse(SqList& L) {// 逆置

    if (L.length == 1) {// 长度为一不用逆置

         return OK;

    }

    if (L.length == 0) {

         return ERROR;

    }

    int i;

    int j;

    for (i = 0, j = L.length - 1; i < j; i++, j--) {

         swap(L.elem[i], L.elem[j]);

    }

    return OK;

}

Status swap(ElemType* a, ElemType* b) {// 交换

    ElemType temp = *a;

    *a = *b;

    *b = temp;

    return OK;

}

逆置:时间复杂度O(n),在逆置前判断长度是否为一,是指不用逆置,直接输出。造swap()交换函数,将顺序表首尾的数据交换之后,头向后移,尾向前移,逆置成功返回正确值OK,未成功返回错误值ERROR

  • 实验步骤

在VS2019中编写程序并运行,输出结果。

  • 实验结果

  • 思考体会

经过数据结构的理论学习和上机实验感觉自己对c语言在计算机内存上的实现有了更深的了解和体会,感觉收获很多。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
链表是一种常见的数据结构,用于存储和组织数据。它由节点组成,每个节点包含一个值和一个指向下一个节点的指针。链表中的节点可以按顺序链接,形成一个链式结构。 链表有多种类型,包括单链表、双链表和循环链表。单链表中每个节点只有一个指向下一个节点的指针;双链表中每个节点有两个指针,分别指向前一个节点和后一个节点;循环链表中最后一个节点的指针指向第一个节点,形成一个循环。 链表的优点是插入和删除操作的时间复杂度为O(1),因为只需要修改节点的指针即可。而数组在插入和删除时需要移动其他元素,时间复杂度为O(n)。链表的缺点是访问某个节点的时间复杂度为O(n),因为需要从头节点开始遍历。 链表在许多应用中都有广泛的应用。一些常见的应用包括: 1. 实现栈和队列:链表可以用来实现栈和队列这样的数据结构,其中栈是一种后进先出(LIFO)的结构,队列是一种先进先出(FIFO)的结构。 2. 内存分配:动态内存分配时,链表可以用来管理空闲内存块,以便高效地分配和释放内存。 3. 图的表示:链表可以用来表示图的邻接表,其中每个顶点都用一个链表来存储与其相邻的顶点。 4. 多项式求解:链表可以用来表示多项式,并进行多项式加法、乘法等运算。 5. 缓存实现:链表可以用来实现缓存,其中最近使用的数据节点被放在链表的头部,最久未使用的数据节点被放在链表的尾部。 这些只是链表应用的一些例子,实际上链表在计算机科学和软件工程中有许多其他的应用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微风-_-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值