• ElemType.h
  • DynaSeqList.h
  • DynaSeqList.cpp
  • ElemType.cpp
  • Lab.cpp
  • 测试结果
  • 注意

ElemType.h

/***
*ElemType.h - ElemType的定义
*
****/#ifndef ELEMTYPE_H
#define ELEMTYPE_Htypedef int ElemType;     //定义数据类型int  compare(ElemType x, ElemType y);   //声明判断函数
void visit(ElemType e);                 //声明打印函数#endif /* ELEMTYPE_H */

DynaSeqList.h

/***
*
DynaSeqList.h - 动态顺序表的定义
*
****/#if !defined(DYNASEQLIST_H)
#define DYNASEQLIST_H#include "ElemType.h"/*------------------------------------------------------------
顺序表结构的定义
------------------------------------------------------------*/typedef struct List
{ElemType *elem;                // 存储空间的基址int length;                   // 顺序表中结点元素的个数int listsize;             // 顺序表的存储空间大小
} SqList;/*------------------------------------------------------------
// 顺序表的基本操作
------------------------------------------------------------*/bool InitList(SqList *L);         //线性表初始化
void DestroyList(SqList *L);        //线性表销毁
bool ListEmpty(SqList L);           //线性表判空
int  ListLength(SqList L);          //线性表长度
bool GetElem(SqList L, int i, ElemType *e);     //获得下标 i 的数据元素
int  LocateElem(SqList L, ElemType e, int (*fp)(ElemType, ElemType));//获得和元素e有关的元素
bool PriorElem(SqList L, ElemType cur_e, ElemType *pre_e);      //获得数据元素的前驱
bool NextElem(SqList L, ElemType cur_e, ElemType *nxt_e);       //获得数据元素的后继
void ListTraverse(SqList L, void (*fp)(ElemType));              //遍历线性表
void ClearList(SqList *L);                                      //清空线性表
bool ListInsert(SqList* L, int i, ElemType e);                  //在 i 位置插入数据元素
void HeadInsert(SqList* L, ElemType e);                         //线性表的头部插入元素
void TailInsert(SqList* L, ElemType e);                         //线性表的尾部插入元素
bool ListDelete(SqList *L, int i, ElemType *e);                 //删除 i 位置的数据元素
void ListDeleteHead(SqList* L,ElemType* e);                     //删除线性表的头部元素
void ListDeleteTail(SqList* L,ElemType* e);                     //删除线性表的尾部元素
void unionList(SqList* La, SqList Lb);                          //求两个线性表的并集
#endif /* DYNASEQLIST_H */

DynaSeqList.cpp

/***
*DynaSeqList.cpp - 动态顺序表,即顺序表的动态数组实现
****/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaSeqList.h"const int LIST_INIT_SIZE = 100;  // 表初始分配的最大长度
const int LISTINCREMENT  = 10; // 分配内存的增量/*------------------------------------------------------------
操作目的:    初始化顺序表
初始条件:    无
操作结果:    构造一个空的线性表
函数参数:SqList *L   待初始化的线性表
返回值:bool     操作是否成功
------------------------------------------------------------*/
bool InitList(SqList *L)
{L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (!L->elem)return false;else{L->length = 0;L->listsize = LIST_INIT_SIZE;return true;}
}/*------------------------------------------------------------
操作目的:    销毁顺序表
初始条件:    线性表L已存在
操作结果:    销毁线性表L
函数参数:SqList *L   待销毁的线性表
返回值:无
------------------------------------------------------------*/
void DestroyList(SqList *L)
{if (L->elem)free(L->elem);L->elem = NULL;
}/*------------------------------------------------------------
操作目的:    判断顺序表是否为空
初始条件:    线性表L已存在
操作结果:    若L为空表,则返回true,否则返回false
函数参数:SqList L    待判断的线性表
返回值:bool     是否为空
------------------------------------------------------------*/
bool ListEmpty(SqList L)
{if (!L.length)return true;elsereturn false;
}/*------------------------------------------------------------
操作目的:    得到顺序表的长度
初始条件:    线性表L已存在
操作结果:    返回L中数据元素的个数
函数参数:SqList L    线性表L
返回值:int          数据元素的个数
------------------------------------------------------------*/
int ListLength(SqList L)
{return L.length;
}/*------------------------------------------------------------
操作目的:    得到顺序表的第i个元素
初始条件:    线性表L已存在,1<=i<=ListLength(L)
操作结果:    用e返回L中第i个数据元素的值
函数参数:SqList L    线性表Lint i       数据元素的位置ElemType *e  第i个数据元素的值
返回值:bool     操作是否成功
------------------------------------------------------------*/
bool GetElem(SqList L, int i, ElemType *e)
{if (i < 1 || i > L.length)return false;else*e = L.elem[i - 1];return true;
}/*------------------------------------------------------------
操作目的:    得到顺序表指定元素的位置
初始条件:    线性表L已存在
操作结果:    返回L中第一个与e满足关系compare()的数据元素的位序。若这样的元素不存在则返回0。
函数参数:SqList L    线性表LElemType e  数据元素eint (*fp)()    用于比较相等的函数指针
返回值:int          与e满足关系compare()的数据元素的位序
------------------------------------------------------------*/
int LocateElem(SqList L, ElemType e, int (*fp)(ElemType, ElemType))
{for (int i = 0; i < L.length; i++){if(!(*fp)(e,L.elem[i]))return i + 1;}return 0;
}/*------------------------------------------------------------
操作目的:    得到顺序表指定元素的前驱
初始条件:    线性表L已存在
操作结果:    若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
函数参数:SqList L        线性表LElemType cur_e  数据元素cur_eElemType *pre_e    前驱数据元素
返回值:bool         操作是否成功
------------------------------------------------------------*/
bool PriorElem(SqList L, ElemType cur_e, ElemType *pre_e)
{int i = LocateElem(L, cur_e, compare);if (i!=0 && i!= 1){*pre_e = L.elem[i - 2];return true;}return false;
}/*------------------------------------------------------------
操作目的:    得到顺序表指定元素的后继
初始条件:    线性表L已存在
操作结果:    若cur_e是L的数据元素,且不是最后一个,则用nxt_e返回它的后继,否则操作失败,nxt_e无定义
函数参数:SqList L        线性表LElemType cur_e  数据元素cur_eElemType *nxt_e    后继数据元素
返回值:bool             操作是否成功
------------------------------------------------------------*/
bool NextElem(SqList L, ElemType cur_e, ElemType *nxt_e)
{int i = LocateElem(L, cur_e, compare);if (i!=0 && i != L.length){*nxt_e = L.elem[i];return true;}return false;
}/*------------------------------------------------------------
操作目的:    遍历顺序表
初始条件:    线性表L已存在
操作结果:    依次对L的每个元素调用函数fp
函数参数:SqList L        线性表Lvoid (*fp)()    访问每个数据元素的函数指针
返回值:无
------------------------------------------------------------*/
void ListTraverse(SqList L, void (*fp)(ElemType))
{for (int i = 0; i < L.length; i++)(*fp)(L.elem[i]);printf("\n");
}/*------------------------------------------------------------
操作目的:    清空顺序表
初始条件:    线性表L已存在
操作结果:    将L置为空表
函数参数:SqList *L   线性表L
返回值:无
------------------------------------------------------------*/
void ClearList(SqList *L)
{L->length = 0;
}/*------------------------------------------------------------
操作目的:    在顺序表的指定位置插入结点,插入位置i表示在第i个元素之前插入
初始条件:    线性表L已存在,1<=i<=ListLength(L) + 1
操作结果:    在L中第i个位置之前插入新的数据元素e,L的长度加1
函数参数:SqList *L   线性表Lint i       插入位置ElemType e  待插入的数据元素
返回值:bool     操作是否成功
------------------------------------------------------------*/
bool ListInsert(SqList *L, int i, ElemType e)
{ElemType* newbase = NULL;if (i < 1 || i>L->length + 1)return false;if (L->length == L->listsize){newbase = (ElemType*)realloc(L->elem, (LIST_INIT_SIZE + LISTINCREMENT) * sizeof(ElemType));if (!newbase)return false;else{L->elem = newbase;L->listsize += LISTINCREMENT;}}for (int j = L->length; j >= i; j--)L->elem[j] = L->elem[j - 1];L->elem[i - 1] = e;++L->length;return true;
}/*------------------------------------------------------------
操作目的:    在顺序表的指定位置插入结点,插入位置i表示在第i个元素之前插入
初始条件:    线性表L已存在,1<=i<=ListLength(L) + 1
操作结果:    在L中第i个位置之前插入新的数据元素e,L的长度加1
函数参数:SqList *L   线性表Lint i       插入位置ElemType e  待插入的数据元素
返回值:bool     操作是否成功
------------------------------------------------------------*/
void HeadInsert(SqList* L, ElemType e)                          //线性表的头插法
{ListInsert(L, 1, e);
}/*------------------------------------------------------------
操作目的:    在顺序表的指定位置插入结点,插入位置i表示在第i个元素之前插入
初始条件:    线性表L已存在,1<=i<=ListLength(L) + 1
操作结果:    在L中第i个位置之前插入新的数据元素e,L的长度加1
函数参数:SqList *L   线性表Lint i       插入位置ElemType e  待插入的数据元素
返回值:bool     操作是否成功
------------------------------------------------------------*/void TailInsert(SqList* L, ElemType e)                        //线性表的尾插法
{ListInsert(L, L->length + 1, e);
}
/*------------------------------------------------------------
操作目的:    删除顺序表的第i个结点
初始条件:    线性表L已存在且非空,1<=i<=ListLength(L)
操作结果:    删除L的第i个数据元素,并用e返回其值,L的长度减1
函数参数:SqList *L   线性表Lint i       删除位置ElemType *e 被删除的数据元素值
返回值:bool     操作是否成功
------------------------------------------------------------*/
bool ListDelete(SqList* L, int i, ElemType* e)
{if (i < 1 || i>L->length)return false;*e = L->elem[i -1];for (int j = i - 1; j < L->length - 1; j++){L->elem[j] = L->elem[j + 1];}--L->length;return true;
}void ListDeleteHead(SqList* L, ElemType* e)                            //线性表的头删法
{ListDelete(L,1, e);
}
void ListDeleteTail(SqList* L, ElemType* e)                         //线性表的尾删法
{ListDelete(L, L->length, e);
}/*------------------------------------------------------------
操作目的:    求两个线性表的并集
初始条件:    两个线性表La 和 Lb 都已存在且非空,1<=i<=ListLength(La)  1<=i<=ListLength(Lb)
操作结果:    打印连接之后的线性表
函数参数:SqList* La, SqList* Lb 求并集的两个线性表
返回值:void 不需要返回值
------------------------------------------------------------*/
void unionList(SqList* La, SqList Lb)
{int La_len = ListLength(*La);int Lb_len = ListLength(Lb);ElemType e = 0;for (int i = 0; i < Lb_len; i++){GetElem(Lb, i, &e);      // 取 Lb 中第 i 个数据元素赋给 e   if (!LocateElem(*La, e, compare)) //如果e和线性表 La 的所有元素都不想等ListInsert(La, La->length, e);      //把 e 插入到La的尾部  elsecontinue;}
}

ElemType.cpp

/***
*ElemType.cpp - ElemType的实现
*
****/#include <stdio.h>
#include "ElemType.h"int compare(ElemType x, ElemType y)
{return(x-y);
}void visit(ElemType e)
{printf("%d\t", e);
}

Lab.cpp

#include <stdio.h>
#include "DynaSeqList.h"int main()
{SqList myList;if (InitList(&myList))printf("初始化成功\n");elseprintf("初始化失败\n");//头插法printf("头插法:\n");for (int i = 0; i < 10; i++){ListInsert(&myList, i, i * 10);}ListTraverse(myList, visit);ElemType x = 0;ElemType data = 0;ListDelete(&myList, 2, &x);printf("删除的是%d\n", x);ListTraverse(myList, visit);printf("在线性表头部插入数据元素值为666\n");HeadInsert(&myList, 666);ListTraverse(myList, visit);printf("在线性表尾部插入数据元素值为258\n");TailInsert(&myList, 258);ListTraverse(myList, visit);ListDeleteHead(&myList, &x);printf("删除线性表的头部数据元素值为%d\n", x);ListTraverse(myList, visit);ListDeleteTail(&myList, &x);printf("删除线性表的尾部数据元素值为%d\n", x);ListTraverse(myList, visit);x = 4;data = 555;if (ListInsert(&myList, x, data))printf("成功在第%d的位置插入元素%d\n", x, data);elseprintf("在第%d的位置插入失败。\n", x);ListTraverse(myList, visit);x = 3;if (ListDelete(&myList, x, &data))printf("成功在第%d的位置删除元素%d\n", x, data);elseprintf("在第%d的位置删除失败。\n", x);ListTraverse(myList, visit);if (ListEmpty(myList))printf("线性表为空\n");elseprintf("线性表非空\n");printf("线性表长度为 %d\n", ListLength(myList));x = 5;if (GetElem(myList, x, &data)){printf("第%d位置的数据元素存在\n", x);}else{printf("%d位置的数据元素不存在\n", x);}printf("获得第%d位置的数据元素为%d\n", x, data);x = 80;printf("线性表中和%d相等的元素为%d\n", x, LocateElem(myList, x, compare));x = 5;if (GetElem(myList, x, &data)){printf("位置为%d的元素存在\n", x);printf("位置为%d的元素下标为%d\n", x, data);}elseprintf("位置为%d的元素不存在\n", x);x = 70;if (PriorElem(myList, x, &data))printf("数据元素%d的前驱元素存在,前驱元素数值为%d\n", x, data);elseprintf("数据元素%d的前驱元素不存在", x);x = 80;if (NextElem(myList, x, &data))printf("数据元素%d的后继元素存在,后继元素数值为%d\n", x, data);elseprintf("数据元素%d的后继元素不存在\n", x);printf("清空线性表:\n");ClearList(&myList);if (!ListLength(myList))printf("线性表清空成功\n");elseprintf("线性表清空失败\n");printf("销毁线性表:\n");DestroyList(&myList);if (NULL ==myList.elem)printf("线性表销毁成功\n");elseprintf("线性表销毁失败\n");return 0;
}

测试结果

注意

上面我们所实现的线性表的基本操作数据类型为 int 类型,我们可以把ElemType设置为任何我们所需要的数据类型或者结构体类型,但是所有的操作都不需要搞定从而体现出来数据结构的灵活性,这是非常重要的一点需要读者去深刻体会。

线性表的动态顺序存储和实现(C语言实现)【线性表】(4)相关推荐

  1. python查询mysql表名字动态日期_Python之路day11作业-MySQL表查询

    #-*- coding: utf-8 -*- __author__ = 'caiqinxiong_cai' #2019/9/25 15:22#多表查询的作业 : https://www.cnblogs ...

  2. 如何在 InfoPath 2003 表单中动态加载数据

    转自微软:http://support.microsoft.com/kb/896451/zh-cn 概要 简介 更多信息 创建新的虚拟目录 设计 Microsoft Office InfoPath 2 ...

  3. 数据结构学习笔记——线性表逻辑结构和顺序存储结构

    2.1线性表的逻辑结构  线性表的数据元素的特点:同一数据类型 一.线性表的逻辑定义 线性表是由n个数据元素(结点)a1,a2,-,an组成的有限序列. 二.线性表的基本运算 2.2线性表的顺序存储结 ...

  4. 线性表的顺序存储 c语言表达,线性表的基本操作顺序存储(C语言).doc

    线性表的基本操作顺序存储(C语言) #include#include#include#define LIST_INIT_SIZE/*线性表存储空间初始分配量*/#define LISTINCREMEN ...

  5. 实验项目3——基本线性表运算(顺序存储方式)

    实验内容 [问题描述] 基本线性表经常进行的运算操作有创建基本线性表.求基本线性表的长度.在基本线性表中查找某个数据元素.在某个位置插入一个新数据元素.在某个线性表中删除某个数据元素以及基本线性表的输 ...

  6. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  7. 线性表(顺序存储结构)C语言

    文章目录 前言 一.线行表的顺序存储结构 二.代码 三.运行结果 前言 最近在学数据结构,想在这里记录一下,也方便以后查找 一.线行表的顺序存储结构 线性表分为两种存储结构,顺序存储与链式存储. 顺序 ...

  8. 线性表的顺序存储结构(C语言讲解)

    目录 1.顺序存储结构定义 线性表顺序储存的结构代码 数组长度与线性表的长度的区别 2.顺序存储结构获得元素操作 3.顺序存储结构插入操作 4.顺序存储结构删除操作 5.完整代码举例 1.顺序存储结构 ...

  9. 【数据结构】线性表的顺序存储结构(c语言实现)

    最近在复习数据结构,参考资料为王道数据结构 /*********************************************************//*Project: sequence ...

最新文章

  1. java 大数据处理一
  2. 什么是你的不可替代性和核心竞争力
  3. Unix/Linux操作系统中如何在sqlplus/rman中使用方向键
  4. 【Swift学习】Swift编程之旅---ARC(二十)
  5. 黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾
  6. textview根据文字行数自动变化大小
  7. 空间三维直线拟合matlab代码
  8. psp记忆棒测试软件,PSP记忆棒有问题?修复软件MS-Format帮你解忧
  9. linux版svn 软件,可以媲美TortoiseSVN的Linux版SVN客户端软件RabbitVCS
  10. 背景颜色、字体等的不透明区别 (opacity、transparent以及rgba的区别)
  11. 培养创造性思维的20个方法
  12. 转载:wps怎么制作半圆形时间轴? wps彩色时间轴的制作方法
  13. linux内存显示少,linux 显示的内存怎么少于我实际的物理内存
  14. NoSQLBooster for MongoDB 5x版本商业版(mac os)
  15. cmake-自动识别新增子模块
  16. 服务器数据盘不显示,云服务器不显示数据盘
  17. RC电路(积分电路,微分电路)
  18. Echart + 百度地图实现区域聚合(Vue版)
  19. 线性关系r范围_一个简单线性回归和多项式回归在R中的实现示例
  20. 吉大软件专硕971-2010

热门文章

  1. 劳动力工资调整模型的探讨——数学建模
  2. 数学建模——灰色预测模型Python代码
  3. Kubernetes中部署Docker registry2.7.1并通过containerd实现拉取镜像到应用Pod的部署
  4. Elasticsearch介绍
  5. 常见的安全应用识别技术有哪些?
  6. CVE-2021-40444 0 day漏洞利用
  7. 网安面试只要掌握这十点技巧,轻轻松松吊打面试官
  8. 带你进入高级测试实验室,
  9. Intel VT学习笔记(七)—— EPT物理地址转换
  10. 1.17 选择排序法