1 #include "stdio.h"
  2 #include "stdlib.h"
  3
  4 typedef int ElemType;        //线性表存储基本类型
  5 typedef int Status;            //基本操作函数类型
  6 #define LIST_INT_SIZE 50    //线性表初始化存储空间分配量
  7 #define LISTINCREMENT 10    //线性表存储空间分配量增值
  8 #define OK 1
  9 #define ERROR 0
 10
 11 typedef struct
 12 {
 13     ElemType *elem;    //存储空间基址
 14     int length;        //当前长度
 15     int listsize;    //当前分配的存储容量(以sizeof(ElemType)为单位)
 16 }SqList;
 17
 18 //构建一个空的线性表
 19 Status InitList(SqList &L)
 20 {
 21     L.elem = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType));
 22     if(!L.elem)                        //如果初始化失败返回ERROR
 23         return ERROR;
 24     L.length = 0;                    //空表长度为0
 25     L.listsize = LIST_INT_SIZE;        //初始存储容量
 26     return OK;
 27 }//InitLise
 28
 29 //销毁线性表L
 30 Status DestroyList(SqList &L)
 31 {
 32     free(L.elem);    //收回空间
 33     L.elem = NULL;    //基址指向NULL
 34     L.length = 0;    //长度变0
 35     L.listsize = 0;    //清除存储容量
 36     return OK;
 37 }//DestroyList
 38
 39 //重置线性表L为空表
 40 bool ClearList(SqList &L)
 41 {
 42     L.length = 0;
 43     return OK;
 44 }//ClearList
 45
 46 //查看线性表是否为空表
 47 Status ListEmpty(SqList L)
 48 {
 49     if(L.length == 0)
 50         return OK;
 51     else
 52         return ERROR;
 53 }//ListEmpty
 54
 55 //查看线性表的元素个数
 56 int ListLength(SqList L)
 57 {
 58     return L.length;    //返回长度
 59 }//ListLength
 60
 61 //用e返回第i个数据元素的值
 62 Status GetElem(SqList L, int i, ElemType &e)
 63 {
 64     if(i < 1 || i > L.length)    //判断i值是否合法
 65         return ERROR;
 66     e = L.elem[i-1];                //赋值第i个元素值
 67     return OK;
 68 }//GetElem
 69
 70 //返回L中第一个与e满足关系compare()的数据元素
 71 //若这样的数据元素不存在则返回0
 72 int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType,ElemType))
 73 {
 74     ElemType *p = L.elem;
 75     int i = 1;
 76     while(i <= L.length && !compare(*p++,e))
 77         ++i;
 78     if(i <= L.length)
 79         return i;
 80     else
 81         return -1;
 82 }//LocateElem
 83
 84 //若cur_e是L的数据元素,且不是第一个,则用pre_e返回他的前驱
 85 //否则操作是啊比,pre_e无定义
 86 Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)
 87 {
 88     int i = 2;
 89     ElemType *p = L.elem+1;
 90     while(i <= L.length && *p != cur_e)
 91     {
 92         p++;
 93         i++;
 94     }
 95     if(i > L.length)
 96         return ERROR;
 97     else
 98     {
 99         pre_e = *--p;
100         return OK;
101     }
102 }//PriorElem
103
104 //若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的后驱
105 //否则操作是啊比,next_e无定义
106 Status NextList(SqList L, ElemType cur_e, ElemType &next_e)
107 {
108     int i = 1;
109     ElemType *p = L.elem;
110     while(i <= L.length && *p != cur_e)
111     {
112         ++p;
113         ++i;
114     }
115     if(i == L.length)
116         return ERROR;
117     else
118     {
119         next_e = *++p;
120         return OK;
121     }
122 }//NextList
123
124 //插入元素
125 Status ListInsert(SqList &L, int i, ElemType e)
126 {
127     if(i < 1 || i > L.length+1)    //判断i值是否合法
128         return ERROR;
129     SqList newbase;        //用于存储新加元素的位置空间
130     if(L.length >= L.listsize)    //当前存储分配已满,增加分配
131     {
132         newbase.elem = (ElemType *)realloc(L.elem,
133             (L.listsize + LISTINCREMENT) * sizeof(ElemType));
134         if(!newbase.elem)    //存储分配失败
135             return ERROR;
136         L.elem = newbase.elem;        //新基址
137         L.listsize += LISTINCREMENT;    //增加存储容量
138     }
139     ElemType *q = &(L.elem[i-1]);    //q指向插入位置
140     for (ElemType *p = &(L.elem[L.length-1]); p >= q; --p)    //p指向表尾
141         *(p+1) = *p;    //插入位置及之后的元素右移
142     *q = e;    //插入元素
143     ++L.length;    //表长加一
144     return OK;
145 }//ListInsert
146
147 //删除第几个元素并返回值
148 Status ListDelete(SqList &L, int i, ElemType &e)
149 {
150     if((i < 1) || (i > L.length))            //判断i值是否合法
151         return ERROR;                        //i值不合法返回失败
152     ElemType *p = &(L.elem[i-1]);            //p指向被删除元素的位置
153     e = *p;                                    //返回被删除元素的值
154     ElemType *q = L.elem + L.length - 1;    //q指向最后一个元素的位置
155     for (++p; p <= q; ++p)                    //被删除元素之后的元素左移
156         *(p-1) = *p;
157     --L.length;                                //当前表长减一
158     return OK;
159 }//ListDelete
160
161 //依次对L的每一个数据元素调用Visit()函数
162 Status ListTraverse(SqList L, void(*Visit)(ElemType*))
163 {
164     ElemType *p = L.elem;
165     int i;
166     for(i = 1; i <= L.length; i++)
167         Visit(p++);
168     printf("\n");
169     return OK;
170 }//ListTraverse
171
172 //ListTraverse()调用函数Visit()
173 //Visit函数在这里做输出链表功能
174 void Visit(ElemType *c)
175 {
176     printf("%d",*c);    //%d随data类型而变
177 }
178
179 //查找元素
180 int ListLocate(SqList L, ElemType e)
181 {
182     int i = 1;
183     while(i <= L.length)
184     {
185         if (L.elem[i-1] == e)
186             break;
187         i++;
188     }
189     if(i <= L.length)            //找到指定元素则返回位置否则返回-1
190         return i;
191     else
192         return -1;
193 }//ListLocate

线性表的顺序表达的13个基本函数。

参考《数据结构(C语言版)》严蔚敏编著

转载于:https://www.cnblogs.com/ABook/p/5370008.html

数据结构-线性表的顺序结构相关推荐

  1. 数据结构——线性表:顺序表、单向链表、循环链表、双向链表

    线性表   是一种数据结构:n个数据元素的有限序列 表示形式: L = (a1,a2...an) a1是线性表的元素,小写. n=0时候为空表 数据元素具有相同特性 相邻元素之间存在序偶关系:即有唯一 ...

  2. 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化

    学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...

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

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

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

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

  5. 数据结构——线性表:顺序表、单链表、双链表(C++)

    内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...

  6. 数据结构-线性表的顺序存储结构逆置

    1.主要的操作是:对顺序存储的线性表进行逆置操作. 2.空表为0时,或超过100个元素时,不执行程序. 自学c语言,有任何问题,还望大佬们指教. 以下是代码: #include <stdio.h ...

  7. 数据结构二:线性表的顺序结构实现

    此程序根据高一凡大神的源程序修改而成. /************************************************************* FileName:c2-1.h F ...

  8. 线性表之顺序结构单链表

    数据结构学习笔记 文章目录 数据结构学习笔记 一.线性表的链式存储结构之单链表 1.单链表存储结构要素 2.实现过程 二.读取操作 1.算法思路 2.算法实现 三.插入操作 1.算法思路 2.算法实现 ...

  9. 数据结构 - 线性表(顺序表)C语言代码实现-处理整型数据(附详细解释)。 _清风明月

    #include <stdio.h> #include <conio.h> //conio是Console Input / Output(控制台输入输出)的简写,其中定义了通过 ...

最新文章

  1. fprintf、printf、sprintf、fscanf、scanf、sscanf 格式化输入输出
  2. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
  3. JVMTOP JVM 监视工具
  4. 教你几个写出原创文章的小方法
  5. python操作文件夹-Python文件操作大全,随机删除文件夹内的任意文件
  6. Windows Server2008下MYSQL外网无法访问问题解决
  7. 群里分享的react的收藏一下!今日周末,改了个表单验证然后无所事事了!
  8. 【离散数学】二元关系的闭包
  9. tf.transpose()函数(转)
  10. java junit 运行_运行Junit方法项目启动不了
  11. php js 交互(js调用PHP代码执行)
  12. 13. Memcache 安装,启动,基本命令,URL
  13. 11.8 scrum report
  14. 跨语言调用模块.TXT
  15. c语言注释部分两侧的分界符号分别是,C语言程序设计基础教程 - 习题答案
  16. steam加速_《盗贼之海》发行之初荣登Steam榜首,UU加速器为您开黑提供保障
  17. 云计算时代IT产业六大发展趋势
  18. 怎样成为优秀的测试工程师
  19. TypeScript简记
  20. vim的使用以及vim插件的配置

热门文章

  1. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
  2. Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)
  3. vim中tab键8空格换4空格
  4. redis 双写一致性 看一篇成高手系列1
  5. debian10 Unable to correct problems, you have held broken packages.
  6. DateGridView列的输出顺序反了
  7. Distilling the Knowledge in a Neural Network 论文笔记蒸馏
  8. 华为八爪鱼自动驾驶云
  9. c++ Factor泛型编程示例
  10. 使用现代C++如何避免bugs(下)