基本概念

线性表,即线性存储结构

由0个或多个数据元素组成的有限序列。

几个关键点:

  • 线性表是一个序列,元素间有顺序
  • 若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他元素都有且仅有一个前驱和后继
  • 线性表强调是有限的,事实上无论计算机发展到多强大,它所处理的元素都是有限的。

使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致
线性表可分为

  • 顺序存储结构,简称顺序表
  • 链式存储结构,简称链表

线性表的抽象数据类型

这里的抽象数据结构就类似于Java中的接口,并不能直接使用其中的方法,只是给你提供了方法的规范,使用这些方法需要我们自己为方法添加逻辑

结构初始化操作

  • InitList(&L)

    操作结果:构造一个空的线性表L。

结构销毁操作

  • DestroyList(&L)

    初始条件:线性表 L 已存在。 操作结果:销毁线性表 L。
    8

引用型操作

  • ListEmpty(L) (线性表判空) 初始条件:线性表L已存在。 操作结果:若L为空表,则返回TRUE,否则 FALSE。

  • ListLength(L) (求线性表的长度) 初始条件:线性表L已存在。 操作结果:返回L中元素个数。

  • PriorElem(L, cur_e, &pre_e) (求数据元素的 前驱) 初始条件:线性表L已存在。 操作结果:若cur_e是L的元素,但不是第一个 ,则用pre_e 返回它的前驱,否则操作失败, pre_e无定义。

  • NextElem(L, cur_e, &next_e) (求数据元素的 后继) 初始条件:线性表L已存在。 操作结果:若cur_e是L的元素,但不是最后一 个,则用next_e返回它的后继,否则操作失败 ,next_e无定义。

  • GetElem(L, i, &e) (求线性表中某个数据元素) 初始条件:线性表L已存在,且1≤i≤ListLength (L)。 操作结果:用e返回L中第 i 个元素的值。

  • LocateElem(L, e, compare( )) (定位函数) 初始条件:线性表L已存在,e为给定值, compare( )是元素判定函数。 操 作 结 果 :返回L中第1个与e满 足 关 系 compare( )的元素的位序。若这样的元素不存 在,则返回值为0。

  • ListTraverse(L, visit( )) (遍历线性表) 初始条件:线性表L已存在,visit() 为某个访 问函数。 操作结果:依次对L的每个元素调用函数visit( )。一旦visit( )失败,则操作失败。

加工型操作

  • ClearList(&L) (线性表置空)

    初始条件:线性表L已存在。 操作结果:将L重置为空表。

  • PutElem(&L, i, &e ) (改变数据元素的值)

    初始条件:线性表L已存在,且1≤i≤ListLength (L) 。 操作结果:L中第i个元素赋值同e的值。

  • ListInsert(&L, i, e ) (插入数据元素)

    初始条件:线性表L已存在,且1≤i≤ListLength (L)+1 。 操作结果:在L的第i个元素之前插入新的元素 e,L的长度增1。

  • ListDelete(&L, i, &e) (删除数据元素)

    初始条件 : 线 性 表 L 已 存 在 且 非 空 , 1≤i≤ListLength (L)。 操作结果:删除L的第i个元素,并用e返回其 值,L的长度减1。

合并操作的伪代码:

void unionL(){int List1_length, List2_length, i;List1_length = ListLength(*List1);//List1的长度List2_length = ListLength(*List2);//List2的长度//将List2中的数据插入到List1中for (i = 1; i<= List2_length; i++) {//先遍历List2中的数据元素GetElem(List, i, &e);//判断List1中有无该元素,如无,插入if ( !LocateElem(*List1, e ) ) {ListInsert(*List1, ++List1_length, e);}}
}

顺序表

存储结构

顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

注意,线性表的第一个位置是从1开始的

动态分配顺序存储结构

#define LIST_INIT_SIZE 100    //线性表存储空间的初始分配量
#define LISTINCREMENT 10   //线性表存储空间的分配增量typedef int Status;
typedef char ElemType;typedef struct{ElemType *elem;  //存储空间基址int length;             //当前长度int listsize;            //当前分配的存储容量
}SqList;

优点

  • 无须为表示表中元素之家男的逻辑关系而增加额外的存储空间
  • 可以快速的存取表中任意位置的元素

缺点

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 容易造成存储空间的“碎片”
#include <stdio.h>
#include <stdlib.h>#define InitSize 5
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType;
typedef struct{ElemType *data;      //存储空间基址,即动态分配数组的指针int MaxSize;      //顺序表的最大容量int length;           //顺序表的当前长度
}SeqList;               //顺序表的类型定义/*初始化顺序表*/
Status InitList(SeqList &L){L.data=(int *)malloc(InitSize*sizeof(int));        //使用malloc函数申请一片连续的空间if(!L.data){printf("初始化失败!!!");exit(OVERFLOW);}L.length = 0;L.MaxSize = InitSize;return OK;
}/*增加动态数组的长度*/
void IncreaseSize(SeqList &L, int len){int *p = L.data;L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0; i<L.length; i++){L.data[i] = p[i];}L.MaxSize = L.MaxSize+len;free(p);
}/*插入操作,在表L中的第i个位置上插入指定元素e*/
Status ListInsert(SeqList &L, int i, int e){if(i<1 || i>L.length+1){return ERROR;}if(L.length >= L.MaxSize){printf("当前空间不足,正在为其分配空间,请稍后。。。。");IncreaseSize(L,5);printf("分配成功!!!\n");}for(int j=L.length; j>=i; j--){L.data[j] = L.data[j-1];        //将第i个元素及之后的元素后移}L.data[i-1]=e;                        //在位置i处放入e,注意位序数组下标的关系L.length++;return OK;
}/*删除操作,删除L表中第i个位置的元素*/
Status ListDelete(SeqList &L, int i, int &e){if(i<1 || i>L.length){return ERROR;}e = L.data[i-1];                    //将被删除的元素赋给efor(int j=i; j<L.length; j++){L.data[j-1] = L.data[j];       //将第i个位置后的元素前移}L.length--;                          //线性表长度减1return OK;
}/*按位查找操作,获取L表中第i个位置的元素的值*/
ElemType GetElem(SeqList &L, int i){if(i<1 || i>L.length){return ERROR;}return L.data[i-1];
}/*按值查找操作,获取L表中具有给定关键字值的元素返回其下标*/
int LocateElem(SeqList L, ElemType e){for(int i=0; i<L.length; i++){if(L.data[i] == e){return i+1;                 //位序=数组下标+1}}return 0;
}/*获得线性表的相关信息*/
Status GetInfo(SeqList &L){printf("线性表的当前容量: %d\n",L.MaxSize);printf("线性表的当前长度: %d\n",L.length);printf("线性表的当前数据: ");for(int i=1; i<=L.length; i++){//printf("L.data[%d] = %d    ",i,L.data[i]);printf("L.data[%d] = %d    ",i,GetElem(L,i));}printf("\n\n");return OK;
}/*删除最小值并由返回,空出位置由最后一个元素补上*/
ElemType DFMin(){return e;
}int main(){SeqList L;InitList(L);/*****************************/for(int i=1; i<10; i++){ListInsert(L,i,i);       //插入操作}GetInfo(L);printf("L中第5位的元素是:%d\n ",GetElem(L,5));printf("L中元素值是7的下标为:%d \n\n",LocateElem(L,7));/*****************************/int e = -1;                    //用变量e把删除的元素带回来if(ListDelete(L, 3, e)){ //删除操作printf("已删除元素 %d\n",e);}else{printf("删除位置不合法");}GetInfo(L);/*****************************/return 0;
}

链表

经过前面的了解,我们知道线性表的顺序存储结构在插入和删除时需要移动大量元素,因为相邻两元素的存储位置也具有邻居关系,它们在内存中的位置时紧挨着的,中间没有间隙,也就无法快速插入和删除。

所以我们引入了链表。

链表,别名链式存储结构或单链表或线性链表
用于存储逻辑关系为 “一对一” 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。

链表中每个数据的存储都由以下两部分组成:

  • 数据元素本身,其所在的区域称为数据域
  • 指向直接后继元素的指针,所在的区域称为指针域

结点:

上面的结构在链表中称为结点。
链表实际存储的是一个一个的节点,真正的数据元素包含在这些节点中

结点的实现

typedef struct LNode{ElemType data;     //数据域,存放数据struct LNode *next;//指针域,指向直接后继元素
}LNode,*LinkList;
/*LinkList L 的意思是L为单链表的头指针*/

头节点,头指针,首元结点

以线性表中第一个数据元素

C语言数据结构--线性表相关推荐

  1. c语言数据结构线性表LA和LB,数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合?...

    数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合? 数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15 ...

  2. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

  3. Go语言-数据结构-线性表

    目录 1.顺序表-线性表顺序存储结构 1.1顺序表结构体定义 1.2顺序表初始化创建 1.3顺序表查找元素k第一次出现时的下标 1.4顺序表插入元素 1.5顺序表删除元素 1.6最终代码和实现效果 2 ...

  4. C语言数据结构线性表顺序存储结构(插入、删除、获取)

    一.代码 #include<stdio.h> #define MAXSIZE 20 /*存储空间初始分配量*/ #define OK 1 #define ERROR 0//元素数据类型,假 ...

  5. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  6. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)

    [简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT  List { 数据 ...

  7. 数据结构(C语言)——线性表(定义,基本操作)

    数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...

  8. 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表

    文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...

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

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

  10. c语言构造一个空线性表l,数据结构线性表顺序结构的定义与实现C语言-Go语言中文社区...

    大家好,今天给大家总结了一下数据结构里面的线性表的顺序结构,顺序表表示的是用一组地址连续的存储单元依次存储线性表的数据元素,所以顺序结构的实现一般采用数组的方式来实现,存储空间也采用动态分配的方式.在 ...

最新文章

  1. linux 安装删除命令,Linux如何使用命令行卸载安装包
  2. 第一款支持容器和云部署的开源数据库Neo4j 3.0
  3. 计算机视觉经典任务分类
  4. 时间复杂度与空间复杂度分析
  5. Redis学习笔记(八)——持久化
  6. 超级全的 SCI 写作句式模板
  7. 轻松理解—继承成员访问控制机制
  8. python绘制饼状图图例_使用matplotlib的所有饼图的通用图例
  9. python解码函数_Python字符串中的两个解码与解码函数详解
  10. python pandas excel 排序_Pandas 按组汇总和列排序 - python
  11. 问题五十二:怎么用C++实现矩阵运算
  12. 物联网产业链全景图(附另13大电子行业全景图,必收藏)
  13. C语言求素数的简化算法
  14. c语言机器人跑三角形图形,一种三角形物件运输机器人的制作方法
  15. 花费巨资去培训SAP真的值得吗?
  16. 【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )
  17. struts2 超链接a标签执行action
  18. 将QTextEdit右键菜单设置为中文
  19. 我和 JSRUN 网站的一些故事
  20. 使用百度地图Web服务API查询地点的经纬度信息

热门文章

  1. 现代信号处理——参数估计理论(估计量的性能)
  2. Vfloopy仿真虚拟软驱写软盘
  3. 不要经常让别人抄袭你的报告,否则他们会学会Word排版的艺术
  4. matlab legend分栏,word排版技巧
  5. mysql对象资源管理器在哪里_文件资源管理器在哪
  6. Fedora16 安装相关
  7. 简简单单利用字典破解zip文件口令
  8. 百度api申请key
  9. 解决Rocketdock在win7上重启后不能保存设置和图标的问题
  10. 计算机科学导论第5版ppt,计算机科学导论第5讲-1.ppt