c语言数据结构学习心得——线性表
线性表:具有相同数据类型的n(n>0)个数据元素的有限序列。
主要有顺序存储和链式存储。
顺序存储:
特点:地址连续,随机/存取,顺序存储。
建立:首地址/存储空间大小(数组),表长。
方式:静态和动态。
优点:存储密度大;随机存储:快速存取表中任一位置元素。
缺点:插入删除移动大量元素;对存储空间要求高,会产生存储空间的碎片。
1.插入
bool ListInsert(SqList &L,int i,Elemtype e){
if(i<||i>L.length+1) //判断i范围是否有效
return false;
if(L.length>=MaxSize) //当前存储已满,不能插入
return false;
for(int j=L.length;j>=i;j--) //第i个元素后移
L.data [j]=L.data[j-];
L.data[i-]=e; //第i个元素放入e
L.length++; //链表长度加1
return true;
}
最好的情况:表尾插入 只用加一个数据,时间复杂度为o(1);
最坏的情况:表头插入,所有元素后移一位,时间复杂度为o(n);
平均时间复杂度:o(n)。
2.删除
bool ListDelete(SqList &L,int i,Elemtype &e){
if(i<||i>L.length) //判断i范围是否有效
return false;
e=L.data[i-1]; //将被删元素赋给e
for(int j=i;j<L.length;j++) //第i个后元素前移
L.data [j-]=L.data[j];
L.length--; //链表长度减1
return true;
}
时间复杂度如插入,但是具体要分析。
线性表链式存储
通过一组任意的存储单元来存储线性表中的数据元素。为了建立起数据元素之间的线性关系,对每个链表结点,除了自身信息,还存放了一个指向其后继的指针。
单链表:单个指针
typedef struct LNode{ //定义单链表结点类型
Elemtype data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
通常用“头指针”来标识一个单链表,如Linklist L,那么头指针L就代指一个单链表。
单链表第一个结点之前附加一个结点,称为“头结点”。其数据域可不设任何信息,也可记录表长等信息。头结点指针域指向线性表第一个元素结点。
头结点:操作方便:第一元素前插入和删除元素和第一结点操作与其他结点一致;链表无论空或不空,操作也统一。
头指针始终指向链表的第一个结点。
双链表:双指针
typedef struct DNode{ //定义单链表结点类型
Elemtype data; //数据域
struct DNode *prior,*next; //前驱指针和后继指针
}DNode,*DLinkList;
插入:
给插入的前一个元素加辅助指针p,插入元素加辅助指针s
1.s->next=p->next;
2.p->next->prior=s;
3.s->prior=p;
4.p->next=s;;
删除:
删除的前一个元素加一个辅助指针p,删除的指针加一个辅助指针q
1.p->next=q->next;
2.q->next->prior=p;
3.free(q);
循环单链表:
与单链表的区别在于,表中最后一个结点的指针不是NULL,而是改为指向头结点,从而整个链表形成一个环。
从任何一个结点出发都能访问到链表的每一个元素。
1.判断条件:头结点的后继指针是否等于头指针。
2.可对循环单链表不设头指针而仅设尾指针,使效率更高。
循环双链表:区别于双链表是首尾结点构成环。
1.尾结点后继指针指向表头结点,头结点的前驱指针指向尾结点。
2.当为空表时,头结点的prior域和next域都等于L。
静态链表:
借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,此指针是结点的相对地址(数值下标),又称游标。
对插入与删除操作与动态链表(动态分配内存的方式)相同,只需修改指针,而不需移动元素。
c语言数据结构学习心得——线性表的更多相关文章
- C语言数据结构——第二章 线性表
二.线性表 2.1-线性表简介 2.1.1-线性表的定义 线性表是由若干个相同特性的数据元素组成的有限序列.若该线性表不包含任何元素,则称为空表,此时长度为0,当线性表不为空时,表中的元素的个数就是线 ...
- c语言数据结构学习心得——查找
顺序查找(线性查找) 主要用于在线性表中的查找 int Search1(int a[],int n,int key){ ;i<=n;i++){ //注意从1开始 if(a[i]==key)ret ...
- c语言数据结构学习心得——队列
队列 只允许在一端进行插入,在另一端进行删除的线性表 队头(Front):允许删除的一端(队首) 队尾(Rear):允许插入的一端 FIFO:先进先出 不要求从数组首位开始存储队列 #define M ...
- c语言数据结构学习心得——栈
栈(Stack) 只允许在一端进行插入或删除操作的线性表 栈顶(Top):栈中允许进行插入和删除操作的那一端: 栈底(Bottom):固定的,不允许进行插入或删除的另一端 1.栈是受限的线性表,所以自 ...
- 基于c语言数据结构+严蔚敏——线性表章节源码,利用Codeblocks编译通过
白天没屌事,那我们就来玩玩线性表的实现吧,快要失业了,没饭吃了咋整哦 题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B ...
- c语言数据结构学习心得——图
图G由顶点集V和边集E组成,记为G=(V,E) 图不可为空,一定有顶点集不为空 有向图:有向边(弧)的有限集合 无向图:无向边的有限集合 连通:顶点V到顶点V'有路径 连通分量:无向图中的极大连通子图 ...
- c语言数据结构学习心得——树
树 一对多的树型结构,有且只有一个特定的根结点. 结点的度:结点拥有子树的数量{ 度为0:叶子结点/终端结点. 度不为0:非终端结点/分支结点(除去根结点其它称为内部结点).} 树的度:树中所有结点的 ...
- c语言数据结构学习心得——数据结构基本概念
1.数据>数据元素>数据项 数据的基本单位是数据元素,数据元素的基本单位是数据项 2.运算的定义->针对逻辑结构 集合:同属于一个集合,无其他关系.(数学上的集合) 线性结 ...
- c语言数据结构学习心得——二叉树
二叉树 n(n>=0)个结点的有限集合:(五种形态) 1.或者为空二叉树,n=0: 2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成.左子树和右子树又分别是一棵二叉树. 3.每个 ...
随机推荐
- 每天一个Linux命令 - 【groupadd】
[命令]:grouadd [语法]:groupadd [选项] [参数] [功能介绍]:groupadd 命令勇于创建新的工作组,新工作组的信息将被添加的系统文件中. [选项说明]: -g < ...
- MySQL(数据库)
数据库概念: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库在实际应用中会遇到各式各样的数据库如nosql非关系数据库(memcached,redis,mangodb),RDBM ...
- Java中包、类、方法、属性、常量的命名规则
1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名.比如www.baidu.com 对于包名:每个字母都需要小写.比如:com.ba ...
- CSS秘密花园:多边框
今天在查询CSS3动画相关资料时偶然发现这个,感觉有时还是挺方便的.原文链接:http://www.w3cplus.com/css3/css-secrets/multiple-borders.html ...
- android 4.0.4系统下实现apk的静默安装和启动
转 android 4.0.4系统下实现apk的静默安装和启动 分类: Android 2013-02-14 14:13 1762人阅读 评论(10) 收藏 举报 最近在android 4.0.4系统 ...
- 刷题向》DP》关于基础DP(easy)
openjudge 8464 这道题其实很简单,算是DP的基础题,比较适合开拓DP思维. 题目比较有欺骗性,其实稍微想想就可以解决,因为题意说第一次卖出后才能买入,所以我们可以考虑枚举断点,所以题目 ...
- cocos2d-x 在vs2010下的环境配置
cocos2d-x编译完成之后生成了一堆动态库,在window下分别为.dll , .lib ,其中*lib是在编译的时候需要链接的,*.dll是在运行的时候依赖的.所以当我们创建一个cocos2d- ...
- Inception安装
前言: MySQL语句需要审核,这一点每个DBA及开发人员都懂,但介于语句及环境的复杂性,大部分人都是望而却步,对其都是采取妥协的态度,从而每个公司都有自己的方法. 大多数公司基本都是半自动化(脚本+ ...
- pandas dataframe 满足条件的样本提取
pandas 的dataframe 对 数据查询可以通过3种方式 . 预备知识: 1. pandas 的索引和label都是从0开始的计数的 2. 时间切片都是左闭右开的. [5:6,:] 只会输出 ...
- mvc全局过滤器和httpmodule的执行顺序
根据http管线模型,请求先通过httpmodule,再通过httphandler,之后再进入mvc的过滤器 另外参考:MVC如何在Pipeline中接管请求的? http://www.cnblogs ...