数组 和 链表是最基本的数据结构,栈、队列、树、图等复杂数据结构都是基于数组或链表方式存储


  • 线性表采用顺序存储的方式存储被称为顺序表,顺序表将表中结点依次存放在计算机内存中一组地址连续的存储单元中。从顺序表定义中可看出顺序表就是数组

顺序表结构体

  • c语言的struct结构体 类似于 java的class类

  • typedef struct SeqList *List;表示定义一个struct SeqList *类型的结构指针,该指针指向SeqList结构体,List是自定义类型的别名。

  • 定义结构指针的目的:对顺序表进行操作时,直接将结构体作为函数参数传递不好,使用结构指针传递的效率更高。(所以我们将List定义为结构指针,然后就可以利用List定义线性表L,即List L;这样就可以通过L访问线性表的内容。比如下标为i的元素,可以通过L->data[i]访问。)

#define MAX_SIZE 100  //顺序表最大容量
typedef int ElemType;//顺序表结构
struct SeqList {ElemType data[MAX_SIZE]; //顺序表元素int length; //顺序表实际长度
};
//定义一个struct SeqList *类型的结构指针,该指针指向SeqList结构体
typedef struct SeqList *List;

精简代码(上面和下面两组代码是一样的)

#define MAX_SIZE 100  //顺序表最大容量
typedef int ElemType;//顺序表结构
typedef struct SeqList {ElemType data[MAX_SIZE]; //顺序表元素int length; //顺序表实际长度
} *List;

建空表

  • L是SeqList的指针,指向名为SeqList的结构体
  • malloc(sizeof(SeqList))是指向系统申请一块大小为sizeof(SeqList)的内存地址
  • (List)指的是把这个地址强制转化成SeqList *的指针
//创建一个空的顺序表
List Init() {List L; //定义顺序表的指针变量(L指的是SqList *的指针,指向名为SqList的结构体)L = (List)malloc(sizeof(SeqList)); //给顺序表开辟一块sizeof(SeqList)大小的存储空间L->length = 0; //设置顺序表的长度为0,表示顺序表为空return L; //返回顺序表的首地址
}

求表长

//顺序表长度
int Length(List L) {return L->length;
}

元素插入

  • 顺序表的位序元素下标是两个不同概念,位序从1开始,元素下标从0开始。位置为i的元素,它的下标为i-1

  • 当i的值在[1,L->length+1]区间内时,都是有效的插入位置。1表示待插入元素取代第1个元素,L->length+1表示插入到最后一个元素的后面。记得,i是位序,不是下标,它的有效插入位置是(i < 1 || i > L->length + 1),不要写成(i < 0 || i > L->length),i为下标时才是这种写法。

//顺序表元素插入
int Insert(List L, int i, ElemType x) {//注意:i是元素插入位置,不是下标,位置是从1开始的,下标是从0开始//如果顺序表满了if (L->length == MAX_SIZE - 1) {return 0; //插入失败}//判断i访问是否合法(插入的有效位置是[1,L->length+1])if (i < 1 || i > L->length + 1) {return 0;}//将第i个元素及之后的元素后移一位for (int j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}//将元素x插入i位置L->data[i - 1] = x;//顺序表长度加1L->length++;return 1;
}
  • 最好的情况:在表尾插入,即i = L->length+1的位置插入,元素后移语句无需执行,时间复杂度为O(1)

  • 最坏的情况:在表头插入,即i = 1的位置插入,元素后移语句将执行n次,时间复杂度为O(n)

元素删除

//顺序表元素删除
int Delete(List L, int i) {int j;//判断删除的位置是否是有效位置(删除的有效位置是[1,L->length])if (i < 1 || i > L->length) {printf("位序%d不存在元素", i);return 0;}将第i个元素之后的元素前移一位for (j = i; j < L->length; j++) {L->data[j - 1] = L->data[j];}//数组长度减1L->length--;return 1;
}

元素查找

//顺序表元素查找(根据元素查找下标)
int Find(List L, ElemType x) {int i = 0;//遍历数组,直至找到目标元素while (i < L->length && L->data[i] != x) {i++;}//查找到表尾都没有该元素,则返回-1,找到了该元素,则返回元素下标if (i >= L->length) {return -1;} else {return i;}
}

全部代码

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100  //顺序表最大容量
typedef int ElemType;//顺序表结构
struct SeqList {ElemType data[MAX_SIZE]; //顺序表元素int length; //顺序表实际长度
};
//定义一个struct SeqList *类型的结构指针,该指针指向SeqList结构体
typedef struct SeqList *List;//创建一个空的顺序表
List Init() {List L; //定义顺序表的指针变量(L指的是SqList *的指针,指向名为SqList的结构体)L = (List)malloc(sizeof(SeqList)); //给顺序表开辟一块sizeof(SeqList)大小的存储空间L->length = 0; //设置顺序表的长度为0,表示顺序表为空return L; //返回顺序表的首地址
}//顺序表长度
int Length(List L) {return L->length;
}//顺序表元素插入
int Insert(List L, int i, ElemType x) {//注意:i是元素插入位置,不是下标,位置是从1开始的,下标是从0开始//如果顺序表满了if (L->length == MAX_SIZE - 1) {return 0; //插入失败}//判断i访问是否合法(插入的有效位置是[1,L->length+1])if (i < 1 || i > L->length + 1) {return 0;}//将第i个元素及之后的元素后移一位for (int j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}//将元素x插入i位置L->data[i - 1] = x;//顺序表长度加1L->length++;return 1;
}//顺序表元素删除
int Delete(List L, int i) {int j;//判断删除的位置是否是有效位置(删除的有效位置是[1,L->length])if (i < 1 || i > L->length) {printf("位序%d不存在元素", i);return 0;}将第i个元素之后的元素前移一位for (j = i; j < L->length; j++) {L->data[j - 1] = L->data[j];}//数组长度减1L->length--;return 1;
}//顺序表元素查找(根据元素查找下标)
int Find(List L, ElemType x) {int i = 0;//遍历数组,直至找到目标元素while (i < L->length && L->data[i] != x) {i++;}//查找到表尾都没有该元素,则返回-1,找到了该元素,则返回元素下标if (i >= L->length) {return -1;} else {return i;}
}int main() {List L = Init();Insert(L, 1, 50);Insert(L, 2, 55);Insert(L, 3, 60);printf("%d\n", Length(L));Delete(L, 2);printf("%d\n", L->data[1]);printf("%d\n", Find(L, 22));printf("%d\n", Find(L, 60));return 0;
}

顺序表 (数组) 详解相关推荐

  1. 数据结构第二课 | 顺序表(详解)

    前言:Hello!大家好,我是@每天都要敲代码,上次我们讲了数据结构第一课时间复杂度和空间复杂度:不明白的小伙伴可以学习一遍时间复杂度和空间复杂度传送门:今天让我们开始一起学习数据结构第二课啦---- ...

  2. 顺序表(详解)- C++(线性表顺序存储结构)

    问题引入 在数据结构中,线性表是一种很重要的线性结构.线性表分为多种类型,常见的如顺序表.链表等,如果此时此刻你对"顺序表(顺序存储)"感到困惑,那就继续看下去,我们一步一步去剖析 ...

  3. js入门·表单详解一(修改表单属性,修改表单元素值)

    实在javascript入门·Document对象入门讲解(访问表单,创建新页,获取页标题) 一文中,我们已经把表单的一些基本访问等弄清楚了,下面我们深入的学下表单的属性以及对表单元素的简单操作! 演 ...

  4. Discuz3.数据库数据表字典详解(完整版)

    Discuz3.数据库数据表字典详解(完整版) 转自:https://discuzt.cr180.com/discuzcode-db.html pre_common_admincp_cmenu后台菜单 ...

  5. c语言数组详解视频,C语言数组详解

    <C语言数组详解>由会员分享,可在线阅读,更多相关<C语言数组详解(55页珍藏版)>请在人人文库网上搜索. 1.就是一组具有固定数目的.有序的.类型相同的数据的集合.根据数组下 ...

  6. JavaScript数组结构与算法——数组详解(中)

    迭代器方法 在上篇中,我们探讨了很多数组方法,接下来总结一下最后一组方法--迭代器方法.这些方法对数组的每个元素应用一个函数,可以返回一个值.一组值.或者一个新数组. 1.不生成新数组的迭代器方法 以 ...

  7. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  8. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  9. Mysql 多表查询详解

    Mysql 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

最新文章

  1. 安徽师范大学信息计算机学院,安徽师范大学数学计算机科学学院导师介绍:罗永龙...
  2. 阿里云ECS服务器磁盘空间异常,或者爆满
  3. 物体运动到一个点停止_运用SolidWorks运动仿真来做的最速降线及其验证,来看看我的办法...
  4. 职称计算机提前考试试卷,职称计算机考试多项选择考试卷模拟考^试题
  5. Filtering 过滤操作
  6. Kafka Offset Storage
  7. MultiDesk远程桌面连接
  8. html鼠标悬停效果加边框,js实现鼠标悬浮给图片加边框的方法
  9. java eml_java读取eml文件 | 学步园
  10. iphone备忘录删除怎么恢复?分享苹果数据找回办法
  11. shell中计算执行命令所用耗时
  12. 计算机无法超过人类智慧,计算机的智力会超过人类吗?
  13. fluter set get
  14. Typora护眼绿和夜色两种背景
  15. 棋牌游戏代理:如何做好微信公众号的SEO?
  16. Python turtle 学习之画个五角星
  17. Linux bash命令
  18. qemu: PCI 设备模拟
  19. (24)打鸡儿教你Vue.js
  20. JDK 16 昨日正式发布,新特性实践尝鲜来啦!

热门文章

  1. 第一篇:对Adaboost和GBDT的学习
  2. 「雕爷学编程」Arduino动手做(35)——模拟量声音传感器
  3. c++中初始化列表顺序和声明顺序一致
  4. 17.vue移动端项目二
  5. 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)...
  6. POST—GET—两种提交方式的区别
  7. 用递归方法判断字符串是否是回文(Recursion Palindrome Python)
  8. 多系统PE win UBUNTU OSX
  9. Android(Lollipop/5.0) Material Design(六) 使用图像
  10. MVC 配置路由 反复走控制其中的action (int?)