一、基本概念:

线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,……an)。

线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系。

顺序存储表:线性表中的元素依次存放在一组地址连续的存储单元(数组)中。

存储特点:若已知首元素的起始地址a0和每个元素占用的空间m,则计算第i个元素的存储位置:ai = a0 + (i - 1)m。

顺序表的特征:(1)在逻辑上相邻的元素,在物理上也是相邻

(2)知道表中起始元素的地址,线性表中的任一个元素地址都可以确定,因此很容易实现对线性表中的元素的随机访问。

动态顺序表:动态存储分配方式实现

二、代码实现:

1)结构实现(行号是为了阅读和说明代码方便,请复制代码是忽略行号)

  1. typedef int ElemType; //定义一种数据类型
  2. #define INITSIZE 60 //定义一个动态表的初始化大小的值
  3. typedef struct{ //封装了数据类型
  4. ElemType *data;
  5. int len;
  6. int listSiz;
  7. } SqList;

2)抽象数据类型(主要是为了说明定义的结构(本例中是顺序表)支持的运算操作,为了使用上的方便,建议使用头文件加实现的方式来运用,引入了bool变量,包含头文件stdbool.h)

  1. void listInit(SqList *L); //表的初始化
  2. bool listEmpty(SqList L); //判断表是否为空
  3. bool listFull(SqList L); //判断表是否已满
  4. void listCreate(SqList *L); //创建表
  5. void listPrint(SqList L); //输出表的内容
  6. void listDestroy(SqList *L); //表的销毁,涉及内存分配,因此必须free
  7. void listInsert(SqList *L, int i, ElemType e); //在表中i的位置插入元素e
  8. int listLength(SqList L); //获取表的长度
  9. int listSerch(SqList L, ElemType e); //在表中查找元素e,返回其在表中的位置
  10. ElemType listDelete(SqList *L, int i); //删除表中位置为i的元素,并返回删除元素的值
  11. ElemType listVisit(SqList L, int i); //访问表中第i个元素,并返回元素的值

3)头文件实现

将1)和2)中的代码整合后,在第4行加上#ifndef SqList_H,在第42行加上#endif,实际项目中这样作是为了避免重复定义和引用头文件,文件名为SqList.h,完整代码如下:

  1. #include <stdbool.h>
  2. typedef int ElemType;
  3. #ifndef SqList_H
  4. #define SqList_H
  5. #define INITSIZE 60
  6. typedef struct{
  7. ElemType *data;
  8. int len;
  9. int listSiz;
  10. } SqList;
  11. void listInit(SqList *L); //表的初始化
  12. bool listEmpty(SqList L); //判断表是否为空
  13. bool listFull(SqList L); //判断表是否已满
  14. void listCreate(SqList *L); //创建表
  15. void listPrint(SqList L); //输出表的内容
  16. void listDestroy(SqList *L); //表的销毁,涉及内存分配,因此必须free
  17. void listInsert(SqList *L, int i, ElemType e); //在表中i的位置插入元素e
  18. int listLength(SqList L); //获取表的长度
  19. int listSerch(SqList L, ElemType e); //在表中查找元素e,返回其在表中的位置
  20. ElemType listDelete(SqList *L, int i); //删除表中位置为i的元素,并返回删除元素的值
  21. ElemType listVisit(SqList L, int i); //访问表中第i个元素,并返回元素的值
  22. #endif

4)操作算法实现,实现头文件定义的顺序表的操作,文件名为SqList.c(注意头文件和和实现文件名字一模一样,只有后缀名由区别),具体代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "SqList.h"
  4. void listInit(SqList *L){
  5. (*L).data = (ElemType *)malloc(sizeof(ElemType) * INITSIZE);
  6. if(0 == (*L).data){
  7. return;
  8. }
  9. (*L).len = 0;
  10. (*L).listSize = INITSIZE;
  11. }
  12. bool listEmpty(SqList L){
  13. return (0 == L.len);
  14. }
  15. bool listFull(SqList L){
  16. return (listSize == L.len);
  17. }
  18. void listCreate(SqList *L){
  19. printf("please input the lenth of list:");
  20. scanf("%d", &((*L).len));
  21. if((*L).len > (*L).listSize){
  22. (*L).listSize = (*L).len + INITSIZE / 2;
  23. free((*L).data);
  24. (*L).data = (ElemType *)malloc(sizeof(ElemType) * (*L).listSize);
  25. if(0 == (*L).data){
  26. return;
  27. }
  28. }
  29. for(int i = 0; i <= (*L).len; i++){
  30. printf("please input NO%d element: ", i);
  31. scanf("%d", &((*L).data[i]));
  32. }
  33. return;
  34. }
  35. void listPrint(SqList L){
  36. for(int i = 0; i < L.len; i++){
  37. printf("%d\t", L.data[i]);
  38. }
  39. printf("\n");
  40. return;
  41. }
  42. void listDestroy(SqList *L){
  43. free((*L).data);
  44. (*L).data = NULL;
  45. (*L).len = 0;
  46. (*L).listSize = 0;
  47. return;
  48. }
  49. void listInsert(SqList *L, int i, ElemType e){
  50. if(i < 0 || i > (*L).len){
  51. return;
  52. }
  53. if(listFull(*L)){
  54. (*L).listSize = (*L).listSize + INITSIZE / 2;
  55. (*L).data = (ElemType *)realloc(sizeof(ElemType) * (*L).listSize);
  56. if(0 == (*L).data){
  57. return;
  58. }
  59. }
  60. for(int j = (*L).len - 1; j >= i - 1; j--){
  61. (*L).data[j + 1] = (*L).data[j];
  62. }
  63. (*L).data[i - 1] = e;
  64. (*L).len++;
  65. return;
  66. }
  67. int listLength(SqList L){
  68. return L.len;
  69. }
  70. int listSerch(SqList L, ElemType e){
  71. for(int i = 0; i < L.len; i++){
  72. if(e == L.data[i]){
  73. return i;
  74. }
  75. }
  76. return -1;
  77. }
  78. int listDelete(SqList *L, int i){
  79. if(i < 0 || i > (*L).len){
  80. return -1;
  81. }
  82. if(listEmpty(*L)){
  83. return -2;
  84. }
  85. ElemType e = (*L).data[i - 1];
  86. for(int j = i; j < (*L).len; j++){
  87. (*L).data[j - 1] = (*L).data[j]
  88. }
  89. (*L).len--;

老郭带你学数据结构(C语言系列)2-线性表之动态顺序表的更多相关文章

  1. 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表

    在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...

  2. 老段带你学鸟哥Linux视频教程 包含基础班+提高班

    老段带你学鸟哥Linux视频教程 包含基础班+提高班,附带pdf文档. 目录结构如下: 目录:/-老段带你学鸟哥Linux视频教程 [.9G] ┣━━老段带你学鸟哥-服务器篇 [1009.4M] ┃ ...

  3. 数据结构C语言版--动态顺序表的基本功能实现(二)

    /* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...

  4. PHP数据结构之二 线性表中的顺序表的PHP实现

    线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...

  5. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  6. 数据结构C语言版干货------->线性表之顺序表

    一:头文件定义 /*************************************************************************** *项目 数据结构 *概要 逻辑 ...

  7. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...

  8. 《鸟哥Linux私房菜》 全套视频和PDF资料—— 老段带你学鸟哥Linux视频课程

    <鸟哥的Linux私房菜-基础篇-服务器篇(第三版)>学习Linux极为经典的入门资料,但是还是很多同学难以坚持系统的看完整本书,最终以放弃而告终. 为了帮助大家更容易入门Linux,老段 ...

  9. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配

    一.传统数组的缺点: 1.数组的长度必须事先定制,且只能是常整数,不能是变量 int len = 5; int a[len]; //error 2.传统形式定义的数组,该程序的内存程序员无法手动释放 ...

随机推荐

  1. PKI

    公钥基础设施(Public Key Infrastructure,简称PKI)是眼下网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为眼下信息安全领域的热点.本 ...

  2. Node 操作MySql数据库

    1, 需要安装 MySQL 依赖 =>  npm i mysql -D 2, 封装一个工具类 mysql-util.js // 引入 mysql 数据库连接依赖 const mysql = re ...

  3. 其它- in-place

    in-place 刷编程题的时候,经常遇到题目要求do in-place.所以就上网搜了相关概念,简单总结一下.   in-place操作,意思是所有的操作都是”就地“操作,不允许进行移动,或者称作  ...

  4. python之时间处理time模块

    import time import datetime ''' print(time.time()) #返回当前系统时间戳 print(time.ctime()) #返回当前系统时间 print(ti ...

  5. [转]Git for windows 下vim解决中文乱码的有关问题

    Git for windows 下vim解决中文乱码的问题 原文链接:Git for windows 下vim解决中文乱码的有关问题 1.右键打开Git bash: 2.cd ~ 3.vim .vim ...

  6. 申请社交平台appkey详细教程

    申请社交平台appkey详细教程 大部分app都需要实现分享到微信.微博等社交平台的功能,但是在各个平台上申请appkey是一件很繁琐的事情.现在来分享一个申请社交平台appkey详细教程,在开发过程 ...

  7. C#操作XML配置文件

    代码为C#操作xml配置文件的范例类,函数SetValue用于向配置文件写入一个值,GetValue用于根据Key获取相应值。这种方法的配置文件不需要手动创建,程序在运行后会自动处理创建。 注意:1. ...

  8. windows服务安装卸载

    到C盘下找到对应的开发VS的installutil.exe文件,复制到程序的执行文件(*.exe)相同目录下在开始程序中找到VS命令提示工具 转到程序的执行文件(*.exe)目录下 C:\>cd ...

  9. 63、加速android应用(转载)

    本文转自 http://www.devtf.cn/?p=1097 原文链接 : Speed up your app原文作者 : UDI COHEN译文出自 : 开发技术前线 www.devtf.cn. ...

  10. 【Edit Distance】cpp

    题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to w ...