热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构之线性表的顺序表示和实现

一、存储结构线性表的顺序存储结构可以采用一维数组来表示:#defineMAXSIZE100typedefintElemType;typedefstruct{ElemTypedata[MAXS

一、存储结构

线性表的顺序存储结构可以采用一维数组来表示:

#define MAXSIZE100
typedef int ElemType;

typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;

二、基本操作

1、初始化

void InitList(SqList &L)
{
L.length = 0;
}

2、清空

void ClearList(SqList &L)
{
L.length = 0;
}

3、指定位置插入元素

//在第i个元素位置 1<=i<=L.length+1 前,插入元素e
int ListInsert(SqList &L, int i, ElemType e)
{
int k;
if (i <1 || i > L.length+1 || L.length == MAXSIZE)//位置不对、表已满
return 0;
for (k = L.length-1; k >= i-1; k--)//后移
L.data[k+1] = L.data[k];
L.data[i-1] = e;//插入
L.length++;//表长增1
return 1;
}

在第i(1<=i<=n+1)个元素之前插入一个元素时,需要将第n至第i(共n-i+1)个元素向后移动一个位置.平均移动n/2个元素

4、指定位置删除元素

//删除第i个位置 1<=i<=L.length 的元素,用e返回其值
int ListDelete(SqList &L, int i, ElemType &e)
{
int k;
if (i <1 || i > L.length)//位置不对
return 0;
e = L.data[i-1];//待删除
for (k = i; k L.data[k-1] = L.data[k];
L.length--;//表长减1
return 1;
}

删除第i(1<=i<=n)个元素时,需要将第i+1至第n(共n-i)个元素向前移动一个位置。平均移动(n-1)/2个元素


5、获取线性表指定位置的值

int GetElem(SqList L, int i, ElemType &e)
{
if (i <1 || i > L.length)
return 0;
e = L.data[i-1];
return 1;
}

6、查找某数在线性表中的位置

int LocateElem(SqList L, ElemType e)
{
int i;

for (i = 0; i {
if (L.data[i] == e)
break;
}
if(i >= L.length)
return 0;
return i+1;
}

7、线性表遍历

void ListTraverse(SqList &L)
{
int i;
for (i = 0; i printf("%d ", L.data[i]);
putchar('\n');
}
三、与线性表相关的算法

1、合并两个线性表

//La、Lb的值按非递减排列,归并La,Lb中的元素到Lc中,使Lc中的元素仍按非递减排列
void MergeList(SqList La, SqList Lb, SqList &Lc)
{
int ia=1, ib=1, ik = 0;
ElemType ea, eb;
while (ia <= La.length && ib <= Lb.length)
{
GetElem(La, ia,ea);
GetElem(Lb, ib,eb);
if(ea <= eb)
{
ia++;
ListInsert(Lc, ++ik, ea);
}
else
{
ib++;
ListInsert(Lc, ++ik, eb);
}
}
while(ia <= La.length)
{
GetElem(La, ia++, ea);
ListInsert(Lc, ++ik, ea);
}
while(ib <= Lb.length)
{
GetElem(Lb, ib++, eb);
ListInsert(Lc, ++ik, eb);
}
}
时间复杂度为O(Length(La) + Length(Lb));

2、线性表合并,A=A∪B

//将Lb中不属于La的元素取出放在La中
void UnionList(SqList &La, SqList Lb)
{
int ia, ib;
ElemType e;
for (ib = 1; ib <= Lb.length; ib++)
{
GetElem(Lb, ib, e);
if(!LocateElem(La, e))//判断Lb中的每一个元素是否在La中
ListInsert(La, La.length+1, e);//不在就插入到La的末尾位置
}
}
时间复杂度为O(Length(La) x Length(Lb));


注:1、基本操作中所有以数组下标进行的操作均可以用指针完成;2、若以线性表表示集合并进行集合的各种运算,应先对表中的元素进行排序。

网络上一个分篇写得很细的连接:http://www.nowamagic.net/librarys/veda/detail/2198

本文的全部完整测试代码详见:http://download.csdn.net/detail/u013071074/7413169



推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
foreverfda
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有