学习书籍《大话数据结构》,自学完后,总结一下,以后也好复习 ,欢迎互相交流。

线性表的基本操作功能如下:

InitList(*L):          初始化操作,建立一个空的线性表L

ListEmpty(L):      若线性表为空,返回true,否则返回false

ClearList(*L):      将线性表清空

GetElem(L,i,*e) : 将线性表L中的第i个位置元素返回给e

LocateElem(L,e) : 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败

ListInsert(*L,i,e):    在线性表L中的第i个位置插入新元素e

ListDelete(*L,i,*e):  删除线性表L中第i个位置元素,并用e返回其值

ListLength(L):          返回线性表L的元素个数

对于不同的应用,线性表的基本操作不同,对于现实中更复杂的操作,完全可以用这些基本操作完成。

例如:要实现两个线性表集合的并,将结果存入集合C中。先将集合A插入集合C中,再循环B集合中的每个元素,判断集合A中是否存在,不存在,则插入C。具体实现本代码的void unionL(SqList *Lc, SqList Lb,SqList La);

要实现两个线性表集合的交,将结果存入集合C中。分析略(和交集类似,就不写了),具体实现本代码void insertction(SqList La, SqList Lb, SqList *Lc);

代码如下(编译软件vs2013):

#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXSIZE 30   /*存储空间初始分配量*/typedef int Status;/*status是函数的类型,其值是函数结果状态代码,如OK等*/
typedef int ElemType;  /*ElemType类型根据实际情况而定,这里假设为int*///输出元素c
Status visit(ElemType c)
{printf("%d ", c);return OK;
}//线性表的顺序存储结构
typedef struct
{ElemType data[MAXSIZE];//数组存储数据元素,最大值为MAXSIZEint length;           //线性表当前长度
}SqList;//初始化顺序线性表
Status InitList(SqList *L)
{L->length = 0;return OK;
}/*初始条件:顺序线性表L存在。操作结果:若L为空表,则返回FALSE,否则返回TRUE*/
Status ListEmpty(SqList L)
{if (L.length == 0)return FALSE;elsereturn TRUE;
}//初始条件:顺序线性表L已存在。操作结果:将L重置为空表
Status ClearList(SqList *L)
{L->length = 0;return OK;
}//初始条件:顺序线性表L已存在。操作结果:返回线性表L元素个数
int ListLength(SqList L)
{return L.length;
}/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始*/
Status GetElem(SqList L, int i, ElemType *e)
{if (L.length == 0 || i<1 || i>L.length)return ERROR;*e = L.data[i - 1];return OK;
}/*初始条件:顺序线性表L已存在操作结果:返回L中第1个与e满足关系的数据元素的位序若这样的数据元素不存在,则返回值为0*/
int LocateElem(SqList L, ElemType e)
{int i;if (L.length)                 //顺序线性表L存在且不为空{for (i = 0; i < L.length;i++)if (L.data[i] == e)return i+1;}return 0;
}/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)操作结果:在L中第i个位置之前插入新的数据元素e,L中的长度加1*/
Status ListInsert(SqList *L, int i, ElemType e)
{int k;if (L->length == MAXSIZE || i < 1 || i>L->length + 1) //L满或i小于1或大于最后一个位置+1return ERROR;else{if (i <= L->length){for (k = L->length; k >= i; k--)L->data[k] = L->data[k - 1];}L->data[i - 1] = e;L->length++;return OK;}
}/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
操作结果:删除L的第i个元素,并用e返回其值,L的长度减1*/
Status ListDelete(SqList *L, int i, ElemType *e)
{int k;if (L->length == MAXSIZE || i < 1 || i>L->length) //L满或i小于1或大于最后一个位置return ERROR;*e = L->data[i - 1];  //用e保存要删除的元素if (i<L->length)for (k = i - 1; k < L->length-1; k++)L->data[k] = L->data[k + 1];L->length--;return OK;
}/*初始条件:顺序线性表L已存在操作结果:依次对L中的每个元素输出*/
Status ListTraverse(SqList L)
{int i;for (i = 0; i < L.length; i++)visit(L.data[i]);printf("\n");return OK;
}//实现两个线性表集合的并集操作
//将所有的线性表中元素不重复的存入Lc中
void unionL(SqList *Lc, SqList Lb,SqList La)
{int La_len, Lb_len,Lc_len, i,j;ElemType e;   //声明La与Lb相同的元素eLa_len = ListLength(La);Lb_len = ListLength(Lb);ClearList(Lc);Lc_len = ListLength(*Lc);for (j = 1; j <= La_len; j++){GetElem(La, j, &e);    //取La中第i个元素赋给eListInsert(Lc, ++Lc_len, e); //插入}for (i = 1; i <= Lb_len; i++){GetElem(Lb, i, &e);    //取Lb中第i个元素赋给eif (!LocateElem(*Lc, e)) //La中不存在和e相同数据元素ListInsert(Lc, ++Lc_len, e); //插入}
}//实现两个集合的交集操作
//将所有的在线性表Lb中且在La中的数据元素插入到Lc中
void insertction(SqList La, SqList Lb, SqList *Lc)
{int La_len, Lb_len, Lc_len, i;ElemType e;La_len = ListLength(La);Lb_len = ListLength(Lb);ClearList(Lc);Lc_len = ListLength(*Lc);for (i = 1; i <= Lb_len; i++){GetElem(Lb, i, &e);if (LocateElem(La,e))  //La中存在和e相同数据元素ListInsert(Lc, ++Lc_len, e); //插入}
}
int main()
{SqList L;ElemType e;Status i;int j, k;i = InitList(&L);printf("初始化L后:L.length=%d\n", L.length);for (j = 0; j < 8; j++)ListInsert(&L, 1, j);printf("L表头依次插入0--7:");ListTraverse(L);printf("L是否为空:(1否0是)%d\n", ListEmpty(L));ClearList(&L);printf("清空线性表L\n");printf("L是否为空:(1否0是)%d\n", ListEmpty(L));for (int j = 1; j <=10; j++){ListInsert(&L, j, j-1);}printf("在L表中1--10位置输入0--9数字:");ListTraverse(L);GetElem(L, 3, &e);printf("输出L中第3个元素:%d\n",e );k = LocateElem(L, 3);if (k)printf("找出L中第一个3所在的位置:%d\n",k);else{printf("L中无此元素\n");}k = ListDelete(&L, 4, &e);if (k)printf("删除L中第4个元素值为: %d\n", e);elseprintf("删除失败\n");printf("输出L中所有的元素:");ListTraverse(L);;SqList Lb;SqList Lc;InitList(&Lc);InitList(&Lb);for (j = 0; j < 7; j++){ListInsert(&Lb, j, j + 5);}printf("输出Lb中所有的元素:");ListTraverse(Lb);unionL(&Lc,L, Lb);printf("输出L和Lb标的并集:");ListTraverse(Lc);insertction(L, Lb, &Lc);printf("输出L和Lb标的交集:");ListTraverse(Lc);system("pause");return 0;
}

结果截图:

插入和删除的平均时间复杂度:O(n)

线性表顺序存储结构的优缺点:
优点: 1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间

2.可以快速地存取表中任一位置的元素

缺点: 1.插入和删除操作需要移动大量元素

2.当线性表长度变化较大时,难以确定存储空间的容量

3.造成存储空间的“碎片”

线性表的顺序存储结构及基本操作相关推荐

  1. 线性表的顺序存储结构的基本操作

    1线性表的定义 线性表是具有相同特性的数据元素的一个有限序列 a1(线性起点),a2,a3......an(线性终点)n为元素总个数(n=0时为空表) 除开第一个元素或最后一个元素外都有一个直接前驱与 ...

  2. python线性表顺序存储实现_数据结构——基于C的线性表的顺序存储结构的基本操作的实现...

    /*** *SeqList.c *Copyright (c) 2015, XZG. All rights reserved. *Purpose: * 线性表顺序存储结构的创建.数据插入.数据获取.获取 ...

  3. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  4. 线性表之顺序存储结构

    第三章 线性表:零个或多个数据元素的有限序列. 若将线性表标记为(a1,a2,...ai-1,ai,ai+1,...,an), 当i=1,2,...n-1时,ai有且仅有一个直接后继, 当i=2,3, ...

  5. 线性表的顺序存储结构——顺序表

    什么是线性表? 线性表简称表,是n(n>=0)个具有相同类型的数据元素的有限序列,线性表中数据元素的个数称为线性表的长度,长度为0的表称为空表. 什么是顺序表? 线性表的顺序存储结构称为顺序表. ...

  6. 实验报告微型计算机拆卸顺序表,实验一线性表的顺序存储结构实验报告页.doc...

    实验一线性表的顺序存储结构实验报告页.doc 1 攀 枝 花 学 院 实 验 报 告 实验课程 数据结构 实验项目线性表的顺序存储 实验日期 系 班级 姓名 学号 同组人 指导老师 成绩 实验目的1. ...

  7. 线性表的顺序存储结构

    一,什么是线性表 零个或多个数据元素的有限序列 说明: 它是一个序列,即,元素之间是有顺序的.(第一个元素无前驱,最后一个元素无后继,其他每个元素有且只有一个前驱和后继) 线性表强调有限. 二,数学语 ...

  8. C++实现线性表的顺序存储结构

    C++实现线性表的顺序存储结构 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表的特点 除 ...

  9. C和C++线性表的顺序存储结构

    C和C++线性表的顺序存储结构 基本概念 设计与实现 优点和缺点 基本概念 设计与实现 插入元素算法 判断线性表是否合法 判断插入位置是否合法 把最后一个元素到插入位置的元素后移一个位置 将新元素插入 ...

最新文章

  1. Tomcat高级部分-使用特定模块和软件反向代理请求到后端tomcat实现负载均衡和session保持...
  2. 1067. [SCOI2007]降雨量【线段树】
  3. python 删除第三方库_python 安装移动复制第三方库操作
  4. HP DL388G5 安装64位linux虚拟系统出错!
  5. Spoken English(015)
  6. KVM虚拟机安装使用教程(Ubantu)
  7. SharePoint 2010中增强的错误跟踪机制
  8. Python量化投资——这个均线择时投资策略,12年只交易24次,比沪深300收益率高700倍
  9. ☀️光天化日学C语言☀️(09)- 算术运算符 | 小学就会了?温故而知新,可以为师矣!
  10. cesium天气(晴、雨、雪、雾)
  11. 玩转MongoDB4.0(MongoDB基础总结)
  12. 考研二战日记-第16天小结
  13. 将SSH密匙添加到云效并下载代码
  14. 林轩田机器学习基石笔记5 - Training versus Testing
  15. Android 优化开机启动
  16. MDCC 2014移动开发者大会 参展商活动的小礼品
  17. Java 线程 基础知识总结
  18. 中国林业产业杂志中国林业产业杂志社中国林业产业编辑部2022年第5期目录
  19. 史上最全前端学习路线图(视频+工具+书籍+资源)
  20. Java学习20天 String 类 常用方法 String、StringBuffer、StringBuilder三者的异同

热门文章

  1. STM32开发笔记108:将STM32CubeIDE设置为中文
  2. 正整数m的百位数字python_求正整数m的百位数字
  3. 关于linux校准时间
  4. Debian设置合上笔记本盖子不休眠
  5. 微信公众平台接口调试工具json格式不对怎么搞_一步步教你打造微信公众号文章爬虫(3)-批量下载...
  6. CVPR 2022|解耦知识蒸馏!旷视提出DKD:让Hinton在7年前提出的方法重回SOTA行列!...
  7. python小白社区_Python小白教学系列| 初识python-Go语言中文社区
  8. 2021年注册土木工程师岩土基础考试历年真题
  9. [Android]从canDrawOverlays权限获取错误说起
  10. Centos文件夹目录中文变英文