版权声明:本文为博主原创文章,未经博主允许不得转载

是时候重新系统的学习/复习一遍《数据结构》了!教材用的是清华出版社严蔚敏的《数据结构》,但众所周知,这本教材中给出的都是伪C代码,没法直接在PC上编译、运行。为了自己复习以及给那些刚开始学习数据结构的小白们一些参考,我花了点时间把书中的一些代码改为C语言程序,大神请绕过!!!当然我早就了解到了,很久之前已经有人做过该事情了,不过也许自己做一遍会更有意思。

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。

存储结构定义

// -----线性表的动态分配顺序存储结构-----
#define LIST_INT_SIZE 100                           // 线性表存储空间的初始分配量
#define LISTINCREMENT 10                            // 线性表存储空间的分配增量
typedef int ElemType;                               // ElemType类型根据实际情况而定,这里假设为int型
typedef int Status;
typedef struct {ElemType *elem;                                 // 存储空间基址int length;                                     // 当前长度int listSize;                                   // 当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;

线性表的初始化

线性表的初始化主要是为了分配存储空间

// -----------线性表初始化-----------
Status InitList_Sq(SqList *L) {// 构造一个空的线性表LL->elem = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType));if (!L->elem) return ERROR;                     // 存储分配失败L->length = 0;L->listSize = LIST_INT_SIZE;                    // 初始存储容量return OK;
}

线性表的插入操作

线性表的插入操作是指在线性表的第i-1个数据元素和第i个数据元素之间插入一个新的数据元素,使新插入的这个数据元素成为新的第i个数据元素。
注意:一般情况下,在第i(1≤i≤n)个元素之前插入一个元素时,需将第n至第i(共n-i+1)个元素向后移动一个位置。如果插入的数据元素元素位于表尾,不需要这种移动操作!!!教材中给出的算法存在该问题,这里我已经改正了这个bug。

// ----------线性表的插入------------
Status ListInsert_Sq(SqList *L, int i, ElemType e) {// 在线性表L中第i个位置之前插入新的元素e// i的合法值为1≤i≤ListLength_Sq(L)+1ElemType *p, *q;if (i < 1 || i > L->length + 1) return ERROR;   // i值不合法if (L->length >= L->listSize) {                 // 当前存储空间已满,增加分配ElemType *newbase = (ElemType *)realloc(L->elem, (L->listSize + LISTINCREMENT) * sizeof(ElemType));if (!newbase) return ERROR;                 // 存储分配失败L->elem = newbase;                          // 新基址L->listSize += LISTINCREMENT;               // 增加存储容量}q = L->elem + (i - 1);                          // q为插入的位置if (i <= L->length) {                           // 若插入数据位置不在表尾// 插入位置及之后的元素右移for (p = L->elem + L->length - 1; p >= q; --p)*(p + 1) = *p;}*q = e;                                         // 插入e++L->length;                                    // 表长增1return OK;
}

线性表的删除操作

线性表的删除操作是使长度为n的线性表变为长度为n-1的线性表。
注意:一般情况下,删除第i(1≤i≤n)个元素时需将从第i+1至第n(共n-1)个元素依次向前移动一个位置。如果删除的数据元素位于表尾,则不需要这种移动操作!!!教材中给出的算法存在该问题,这里我已经改正了这个bug。

// ----------线性表的删除------------
Status ListDelete_Sq(SqList *L, int i, ElemType *e) {// 在顺序线性表L中删除第i个元素,并用e返回其值// i的合法值为1≤i≤ListLength_Sq(L)ElemType *p, *q;if (L->length == 0)                             // 线性表为空return ERROR;if (i < 1 || i > L->length)                     // i值不合法return ERROR;p = L->elem + (i - 1);                          // p为被删除元素的位置*e = *p;                                        // 被删除的元素值赋给e指向的内存单元q = L->elem + (L->length - 1);                  // 表尾元素的位置if (i < L->length) {                            // 如果删除的元素不是最后位置的元素for (++p; p <= q; ++p) {                    // 被删除元素之后的元素左移*(p - 1) = *p;}}--L->length;                                    // 表长减1return OK;
}

源代码

#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0// -----线性表的动态分配顺序存储结构-----
#define LIST_INT_SIZE 100                           // 线性表存储空间的初始分配量
#define LISTINCREMENT 10                            // 线性表存储空间的分配增量
typedef int ElemType;                               // ElemType类型根据实际情况而定,这里假设为int型
typedef int Status;
typedef struct {ElemType *elem;                                 // 存储空间基址int length;                                     // 当前长度int listSize;                                   // 当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;// -----------线性表初始化-----------
Status InitList_Sq(SqList *L) {// 构造一个空的线性表LL->elem = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType));if (!L->elem) return ERROR;                     // 存储你分配失败L->length = 0;L->listSize = LIST_INT_SIZE;                    // 初始存储容量return OK;
}// ----------线性表的插入------------
Status ListInsert_Sq(SqList *L, int i, ElemType e) {// 在线性表L中第i个位置之前插入新的元素e// i的合法值为1≤i≤ListLength_Sq(L)+1ElemType *p, *q;if (i < 1 || i > L->length + 1) return ERROR;   // i值不合法if (L->length >= L->listSize) {                 // 当前存储空间已满,增加分配ElemType *newbase = (ElemType *)realloc(L->elem, (L->listSize + LISTINCREMENT) * sizeof(ElemType));if (!newbase) return ERROR;                 // 存储分配失败L->elem = newbase;                          // 新基址L->listSize += LISTINCREMENT;               // 增加存储容量}q = L->elem + (i - 1);                          // q为插入的位置if (i <= L->length) {                           // 若插入数据位置不在表尾// 插入位置及之后的元素右移for (p = L->elem + L->length - 1; p >= q; --p)*(p + 1) = *p;}*q = e;                                         // 插入e++L->length;                                    // 表长增1return OK;
}// ----------线性表的删除------------
Status ListDelete_Sq(SqList *L, int i, ElemType *e) {// 在顺序线性表L中删除第i个元素,并用e返回其值// i的合法值为1≤i≤ListLength_Sq(L)ElemType *p, *q;if (L->length == 0)                             // 线性表为空return ERROR;if (i < 1 || i > L->length)                     // i值不合法return ERROR;p = L->elem + (i - 1);                          // p为被删除元素的位置*e = *p;                                        // 被删除的元素值赋给e指向的内存单元q = L->elem + (L->length - 1);                  // 表尾元素的位置if (i < L->length) {                            // 如果删除的元素不是最后位置的元素for (++p; p <= q; ++p) {                    // 被删除元素之后的元素左移*(p - 1) = *p;}}--L->length;                                    // 表长减1return OK;
}int main(int argc, const char * argv[]) {SqList list;                                    // 定义一个线性表list(实质上是一个结构体)ElemType temp;                                  //if (InitList_Sq(&list))printf("线性表初始化成功!\n");elseprintf("线性表初始化失败!\n");for (int i = 1; i <= 10; i++)                   // 在线性表的第1个位置连续插入10个元素1~10ListInsert_Sq(&list, 1, i);printf("插入%d个元素后的线性表为:", list.length);for (int i = 0; i < list.length; i++)printf("%d ", *(list.elem + i));printf("\n\n");ListDelete_Sq(&list, 3, &temp);                 // 删除线性表中第3个位置的元素printf("删除第3个元素“%d“后的线性表为:", temp);for (int i = 0; i < list.length; i++)printf("%d ", *(list.elem + i));printf("\n\n");return 0;
}

输出结果:

线性表初始化成功!
插入10个元素后的线性表为:10 9 8 7 6 5 4 3 2 1 删除第3个元素“8“后的线性表为:10 9 7 6 5 4 3 2 1

转载于:https://www.cnblogs.com/weixiaochao/p/6240503.html

02_线性表的顺序表示和实现相关推荐

  1. 数据结构-线性表的顺序结构

    1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int ElemType; //线性表存储基本类型 ...

  2. 数据结构源码笔记(C语言):线性表的顺序表示

    /* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...

  3. 四、【线性表】线性表的顺序表示和实现

    线性表的顺序表示和实现 前文我们提到过线性表是逻辑结构,只说明了数据元素之间的相互关系,想要使用线性表,我们还需要在计算机上表示出这些数据元素以及元素之间的关系.而对于同一种逻辑结构,可以有多种存储结 ...

  4. c语言建立线性表(顺序储存,链式储存,循环,双向)全

    c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...

  5. mysql 线性表_数据结构-线性表之顺序表

    线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...

  6. 数据结构——绪论以及线性表的顺序表示

    绪论 数据类型 数据类型是一个值的集合和定义在此集合上一组操作的总称. (1)原子类型:其值不可再分的数据类型,如int,char,float. (2)结构类型:其值可以再分解为若干成分的数据类型. ...

  7. 数据结构(2) -- 线性表的顺序表示

    2.2 线性表的顺序表示 顺序表基本操作: 插入操作:最坏情况O(n),最好情况O(1),平均情况O(n) 删除操作:最坏情况O(n),最好情况O(1),平均情况O(n) 按值查找:最坏情况O(n), ...

  8. 线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法

    线性表基本概念 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串 线性表在逻辑上是线性结构 ...

  9. 数据结构-线性表之顺序表

    线性表包括顺序表和链表(单链表.双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现. 线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表 ...

最新文章

  1. LeetCode实战:二叉搜索树的最近公共祖先
  2. ICLR2021 | 利用数据扩充提高蛋白质序列模型的通用性
  3. 【Flutter】Flutter 拍照示例 ( 拍照并获取照片源码示例 | image_picker: ^0.5.2 版本 )
  4. 如何读取resources目录下的文件路径(九种方式)
  5. 三十八、练习、Python判断一个信用卡号是否合理
  6. animate.css(第三方动画使用方法)
  7. Jsoup 数据修改
  8. 飞鸽传书为什么传书?
  9. 观点:比特币新一轮突破“即将到来”
  10. 某些面向对象的思想--一步步更新
  11. 保险行业持续扩展,巨杉数据库再次中标人保财险
  12. BZOJ3637 Query on a tree VI
  13. 计算机编程ebcdic码,ASCII码和EBCDIC码
  14. 短视频运营小技巧,掌握推荐机制很重要,吸粉引流也不难
  15. Android App应用市场功能的框架图
  16. 模拟鼠标键盘操作,含硬件模拟技术
  17. mezzanine 历险记
  18. 通知:首届CISM大赛华东赛区决赛将于30日在马鞍山举行
  19. Android 连续点击屏幕(次数可定,事件可定)后进行操作
  20. postgresql Count estimate

热门文章

  1. 循环单链表 python_循环单链表报错
  2. 把地图中的道路以线条提取出来_自动驾驶中基于车道线的高清制图方法回顾
  3. Golang实践录:简单的代码片段
  4. sscanf一小用法
  5. 【Elasticsearch】基于 Elasticsearch + kibana 实现 IP 地址分布地图可视化
  6. 【Spring】jpa数据库表实体命名规则 Unknown column ‘user0_.create_time‘ in ‘field list‘
  7. 【Flink】FlinkException The file LOG does not exist on the TaskExecutor
  8. 95-190-642-源码-窗口操作符-EvictingWindowOperator
  9. 60-100-040-使用-DataSource-介绍
  10. Flink 1.9报错:No implicits found for parameter evidence$2: TypeInformation[(String, String, String)]