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

一、基本概念:

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

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

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

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

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

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

二、代码实现:

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

1 typedef int ElemType;                                                 

 2

 3

 4 #define MAX 100

 5 struct sqList{

 6     ElemType data[MAX];

 7     int len;

 8 } ;

说明:第1行是定义一种数据类型,方便以后让线性表的适用范围更广;

第4行是定义表的大小,方便以后修改;

第5-8行是定义一个结构体,其中封装了线性表的存储结构与线性表的大小;

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

10 struct sqList;

11 typedef struct sqList SqList;

12

13 //初始化线性表

14 void ListInit(SqList *list);

15

16 //判断线性表是否为空,为空返回1,不为空返回0

17 int ListEmpty(SqList list);

18

19 //判断线性表是否已满,已满返回1,未满返回0

20 int ListFull(SqList list);

21

22 //创建线性表,根据提示,先输入表的长度,再根据提示依次输入表元素的值,>   成功输出0,不成功输出为-1

23 void ListCreate(SqList *list);

24

25 //求取线性表的长度

26 int ListLength(SqList list);

27

28 //查找指定元素值是否在表中,成功返回下标,不成功则返回0

29 int LocateElem(SqList list, ElemType elem);

30

31 //线性表中插入指定位置,值已知的元素

32 void ListInsert(SqList *list, int i, ElemType elem);

33

34 //删除线性表中的元素,并返回删除位置的值

35 int ListDelete(SqList *list, int i);

36

38 int37 //访问数据元素算法实现

38 int ListVisit(SqList list, int i);

39

40 //输出线性表元素

41 void ListPrint(SqList list);

42 #endif

说明:第10行是声明一个线性表的结构体变量sqList;

第11行使用了typedef的定义,以后可以使用SqList sqList就可以声明一个名称为sqList的结构体;

第13-41行线性表支持的运算操作,每个方法都有注释,参数也比较简单明了,就不再多说

3)头文件实现

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

1 typedef int ElemType;

 2 #ifndef SqList_H

 3

 4 #define MAX 100

 5 typedef struct sqList{

 6     ElemType data[MAX];

 7     int len;

 8 } SqList;

 9

10 struct sqList;

11 typedef struct sqList SqList;

12

13 //初始化线性表

14 void ListInit(SqList *list);

15

16 //判断线性表是否为空,为空返回1,不为空返回0

17 int ListEmpty(SqList list);

18

19 //判断线性表是否已满,已满返回1,未满返回0

20 int ListFull(SqList list);

21

22 //创建线性表,根据提示,先输入表的长度,再根据提示依次输入表元素的值,成功输出0,不成

   功输出为-1

23 void ListCreate(SqList *list);

24

25 //求取线性表的长度

26 int ListLength(SqList list);

27

28 //查找指定元素值是否在表中,成功返回下标,不成功则返回0

29 int LocateElem(SqList list, ElemType elem);

30

31 //线性表中插入指定位置,值已知的元素

32 void ListInsert(SqList *list, int i, ElemType elem);

33

34 //删除线性表中的元素,并返回删除位置的值

35 int ListDelete(SqList *list, int i);

36

37 //访问数据元素算法实现

38 int ListVisit(SqList list, int i);

39

40 //输出线性表元素

41 void ListPrint(SqList list);

42 #endif

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

1 #include <stdio.h>

  2 #include "SqList.h"

  3

  4

  5                                                                                                                                                                                            

  6 //初始化线性表

  7 void ListInit(SqList *list){

  8     (*list).len = 0;

  9 }

 10

 11 //判断线性表是否为空,为空返回1,不为空返回0

 12 int ListEmpty(SqList list){

 13     if(0 == list.len){

 14         return 1;

 15     }

 16

 17     return 0;

 18 }

 19

 20 //判断线性表是否已满,已满返回1,未满返回0

 21 int ListFull(SqList list){

 22     if(MAX == list.len){

 23         return 1;

 24     }

 25

 26     return 0;

 27 }

 28

 29 //创建线性表,根据提示,先输入表的长度,再根据提示依次输入表元素的值,成功输出0,不成功输出为-1

 30 void ListCreate(SqList *list){

 31     int i;

 32     printf("please input the length of the list which you want to create: \n");

 33     scanf("%d", &((*list).len));

 34     if((*list).len > MAX){

 35         return;

 36     }

 37     for(i = 0; i < (*list).len; i++){

 38         printf("please input NO %d element: \n", i);

 39         scanf("%d", &((*list).data[i]));

 40     }

 41 }

 42

 43 //求取线性表的长度

 44 int ListLength(SqList list){

 45

 46     return list.len;

 47 }

 48

 49 //查找指定元素值是否在表中,成功返回下标,不成功则返回0

 50 int LocateElem(SqList list, ElemType elem){

 51     int i;

 52     for(i = 0; i < list.len; i++){

 53         if(list.data[i] == elem){

 54             return i+1;

 55         }

 56     }

 57

 58     return 0;

 59 }

 60

 61 //线性表中插入指定位置,值已知的元素

 62 void ListInsert(SqList *list, int i, ElemType elem){

 63     if(i < 0 || i > MAX){

 64         return;

 65     }

 66     if(1 == ListFull(*list)){

 67         printf("表已满!\n");

 68     }

 69     for(int j = (*list).len; j >= i - 1; j--){

 70         (*list).data[j + 1] = (*list).data[j];

 71     }

 72     (*list).data[i - 1] = elem;

 73     (*list).len++;

 74 }

 75

 76 //删除线性表中的元素,并返回删除位置的值

 77 int ListDelete(SqList *list, int i){

 78     if(i < 0 || i > (*list).len){

 79         return -1;

 80     }

 81     if(ListEmpty(*list)){

 82         return -1;

 83     }

 84     int x = (*list).data[i - 1];

 85     for(int j = i - 1; j < (*list).len; j++){

 86         (*list).data[j] = (*list).data[j + 1 ];

 87     }

 88     (*list).len--;

 89

 90     return x;

 91 }

 92

 93 //访问数据元素算法实现

 94 int ListVisit(SqList list, int i){

 95     if(i < 0 || i > list.len){

 96         return -1;

 97     }

 98

 99     return list.data[i - 1];

100 }

101

102 //输出线性表元素

103 void ListPrint(SqList list){

104     for(int i = 0; i < list.len; i++){

105         printf("%d\t", list.data[i]);

106     }

5)测试代码的实现,实现头文件是实现文件的整合应用,文件名可以随意,建议取得有意义,一般以test为前缀,我的文件名称testSqList.c,具体代码为:

1 #include <stdio.h>                                                                                                                                                                          

 2 #include "SqList.h"

 3

 4

 5

 6 int main(int argc, char *argv)

 7 {

 8     SqList sqlist;

 9

10     ListInit(&sqlist);

11     ListCreate(&sqlist);

12     if(!ListEmpty(sqlist)){

13         printf("表不为空\n");

14     }    

15     ListPrint(sqlist);

16     ListInsert(&sqlist, 3, 9);

17     if(!ListFull(sqlist)){

18         printf("表没有满\n");

19     }

20     ListPrint(sqlist);

21     printf("表的长度为:%d\n", (sqlist).len);

22     int i = ListDelete(&sqlist,3);

23     ListPrint(sqlist);

24     printf("%d\n", i);

25

26     return 0;

27 }

当然也可以自己实现其他的,数据结构代码的三个步骤如下:

1、实现数据结构的逻辑结构与基本数据类型定义,规划合理的抽象数据类型,也就是数据结构支持的操作运算,并使用#ifndef...#endif方式实现头文件;

2、实现抽象数据类型,并予以合理的实现;

3、实现数据结构的测试,测试结构,符合要求,完工,否则继续重复1和2两个步骤,直到成功。

6)补充说明:

对多文件的编译,使用命令gcc testSqList.c SqList.c -o testSqList即可,也就是将多个需要的文件名放置在命令gcc和选项-o之间,后面的就是编译后的文件,可以省略,默认是a.out可执行文件,由于每次都是同一个名字,会相互覆盖,建议取一个由意义的名字

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

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

    一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...

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

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

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

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

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

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

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

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

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

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

  7. 数据结构实验1:C++实现静态顺序表类

    写了3个多小时,还是太慢了.太菜了! 图1 程序运行演示截图1 实验1 1.1 实验目的 熟练掌握线性表的顺序存储结构. 熟练掌握顺序表的有关算法设计. 根据具体问题的需要,设计出合理的表示数据的顺序 ...

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

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

  9. 数据结构C语言版--静态顺序表的基本功能实现(一)

    /* * 功能:创建一个线性表,并输出 * 静态分配内存 */ #include<stdio.h> //stdio.h是C的标准I/O库 //#include<iostream> ...

随机推荐

  1. thinkphp 5数据库操作

    1.原生sql $options=Db::table('__MALL_POST__') ->alias('m') ->join('__MALL_CATEGORY_VALUE__ v','m ...

  2. Net core 轮子

    .net core 使用的人渐渐多了起来,轮子也渐渐多了起来,为了避免重复造轮子,以下列举了一些造好的轮子 1. IP 请求频率限制 git: https://github.com/stefanpro ...

  3. 初学js之qq聊天实例

    实现的功能为上图所示,但是每新发送的消息必须显示在最上面. 我实现了两版,样式有是一样的.我们直接看代码. 版本一: <!DOCTYPE html> <html lang=" ...

  4. python PEP8代码规范及问题

    最近刚刚接触Python,为了养成好习惯,尽量保证自己写的代码符合PEP8代码规范,下面是过程中报出的警告及解决方法,英文有些翻译不太准确见谅,会不断更新: PEP 8: module level i ...

  5. HOJ 13845 Atomic Computer有向无环图的动态规划

    考虑任意一个数字,任何一个都会有奇怪的..性质,就是一个可以保证不重复的方案——直接简单粗暴的最高位加数字..于是,如同上面的那个题:+1.-1.0 但是考虑到65536KB的标准内存限制,会得出一个 ...

  6. Spring---基于Spring IOC的小程序

    实现的功能以及各文件间的关系 IHelloMessage:一个接口,用于定义输出问候信息. HelloWorld.HelloChina:接口的实现类.在这里表示人在不同的地方 Person:一个人物类 ...

  7. poj 3308 Paratroopers(二分图最小点权覆盖)

    Paratroopers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8954   Accepted: 2702 Desc ...

  8. R语言分析朝阳医院数据

    R语言分析朝阳医院数据 本次实践通过分析朝阳医院2016年销售数据,得出“月均消费次数”.“月均消费金额”.“客单价”.“消费趋势”等结果,并据此作出可视化图形. 一.读取数据: library(op ...

  9. C#实现eval 进行四则运算(有码)

    在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版本的eval函数,具体的设计参考了<大 ...

  10. 用python介绍4种常用的单链表翻转的方法

    这里给出了4种4种常用的单链表翻转的方法,分别是: 开辟辅助数组,新建表头反转,就地反转,递归反转 # -*- coding: utf-8 -*- ''' 链表逆序 ''' class ListNod ...