数据结构 2-2 线性表的顺序表实现
一、概念
线性表有两种实现方式,顺序表和链表,顺序表作为较简单的实现方式,可以借用数组来实现。顺序表和链表各有各自的优缺点,这是由其性质所决定的,在选择时要根据题目要求,灵活进行选择。
二、定义
以C代码为例,需要定义一个结构体,结构体中包括一个数组、一个变量代表线性表的最大长度,一个变量代表线性表的当前已使用长度。这里需要注意,数组作为存储线性表数据的载体,具有两种分配方式。
王道数据结构上将分配分为动态和静态,所谓静态是指在定义时直接指定确定长度的数组
int data[100];
像这种形式就属于静态分配,一次性划分好所有的位置,也是比较常用的一种,毕竟只要开的足够大就不会出现溢出。动态是通过内存分配函数malloc来实现,在定义结构体时定义一个动态分配数组的指针,然后单独写一个初始化的语句来为这块内存开辟空间,那么开辟的空间就可以根据题目的数据进行自由的分配。当溢出时,可以用malloc函数再分配一个更大的内存空间,将原来空间的内容复制进去再向里面添加。这里补充一下malloc函数,malloc函数用于获取内存上一个连续空间,需要和free配合使用,如果获取了长度为5的空间,函数会在计算机上顺序找一个连续的长度为5的空间来存储数据,这里很有趣的是,如果你在这个数组中存第六个数据,有时是可以存进去的,这取决于分配给你这个数组的连续空间的第六位置是不是空的,如果空是可以存入并读出的。
L.data=(int*)malloc(sizeof(int)*initsize);
但是个人感觉这样区分感知不强,如果说动态分配仅仅是为了方便溢出的处理,那也完全可以不用malloc函数,动态分配溢出时开辟一个新的空间,那按照静态的方法也完全可以在溢出时开一个两倍长的数组,把原来的数据放进去再存入,也是一个道理。个人不太明白这样分配意义何在,实在是徒增功耗。
三、代码实现
线性表作为入门的数据结构,顺序实现只有几个简单的操作:增和删。
对线性表的增加,真的不需要什么难度,唯一的一个点就是位置的移动,将插入位置及其后面的元素全部后移一个位置即可,简而言之就是插队。删除也是一个道理,把删除位置后面的代码全都前移一个位置,可以看作原来在排队的一个人不想排就走了,那后面的人肯定要向前补上。
在一开始初始化线性表时,也可以直接使用增加函数而不用单独写初始化函数,直接从头开始添加数据。增加时需要更新当前长度的变量,一旦长度等于了最大长度,就禁止增加,删除也是一个道理。增加时如果要插入的位置超过了现在的长度就禁止插入,删除如果目标位置上没有数据也禁止删除。
上手撸代码,很久没敲数据结构了,手很生,可能会有错,而且为了演示性加了很多文字提示,有些臃肿。
#include<bits/stdc++.h>
using namespace std;
int initsize=10;
struct List{int *data;int length;int size;
};
struct List l;
void init()
{l.data=(int*)malloc(sizeof(int)*initsize);l.size=initsize;l.length=0;
}
bool insert(int tar,int num)
{if(tar>l.length||l.length==l.size){/*//动态调整线性表长度 int *temp=(int*)malloc(sizeof(int)*(tar+1));for(int i=0;i<l.length;i++)temp[i]=l.data[i];l.data=temp;l.size=tar; */return false;}for(int i=l.length;i>=tar;i--)l.data[i]=l.data[i-1];l.data[tar]=num;l.length++;return true;
}
bool del(int tar)
{if(tar>=l.length||l.length==0)return false;for(int i=tar;i<l.length;i++)l.data[i]=l.data[i+1];l.data[l.length]=0;l.length--;return true;
}
void print()
{for(int i=0;i<l.length;i++)printf("%d ",l.data[i]);printf("\n");
}
void delmode()
{ int deltar;printf("Input the location you want to delete:");scanf("%d",&deltar);if(del(deltar-1))printf("Delete succeed\n");elseprintf("ERROR!\n");
}
void insmode()
{int tar,num;printf("input the location and the number you want to insert:");scanf("%d %d",&tar,&num);if(insert(tar-1,num))printf("Insert succeed!\n");elseprintf("ERROR\n");
}int main()
{ init();int len,temp,choice=-1;printf("Input the length of the list :");scanf("%d",&len);printf("Input %d numbers:",len);for(int i=0;i<len;i++){scanf("%d",&temp);if(!insert(i,temp))printf("ERRPR!\n");}print();while(choice!=0){printf("1-delete\n");printf("2-insert\n");printf("3-show\n");printf("0-exit\n");printf("Choice the function you want:");scanf("%d",&choice);switch(choice){case 1:delmode();break;case 2:insmode();break;case 3:print();break;case 0:break;default:printf("input error!");break;} }free(l.data);return 0;}
四、优缺点分析
这种线性表的实现,好处时随机取用,可以直接访问线性表里面有数据的任何一个部分,而使用链表就只能从头一点一点移动到目的位置,缺点也很明显,删除和增加需要的时间很大,毕竟需要大量的移动数据,删除和增加的时间复杂度都是O(n)。另外顺序表实现存储密度大,因为链表实现时每个节点都需要一个指向下一个节点的指针,双向链表更是需要两个,而顺序表则不用,一个结构体里面直接用数组存放,不需要这些花里胡哨的东西。
数据结构 2-2 线性表的顺序表实现相关推荐
- 数据结构与算法(一) 线性表之顺序表
线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表. 顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...
- Java数据结构与算法_线性表_顺序表与链表
文章目录 线性表 顺序表 顺序表API设计 顺序表的代码实现 链表 单向链表 双向链表 总结 线性表 概述 线性表是最基本.最简单.也是最常用的一种数据结构. 一个线性表是n个具有相同特性的数据元素的 ...
- 数据结构——线性表:顺序表、单链表、双链表(C++)
内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...
- 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化
学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...
- mysql 线性表_数据结构-线性表之顺序表
线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...
- 数据结构-线性表之顺序表
线性表包括顺序表和链表(单链表.双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现. 线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表 ...
- 线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法
线性表基本概念 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串 线性表在逻辑上是线性结构 ...
- 线性表之顺序表与单链表的区别及优缺点
这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 1.What 什么是顺序表和单链表 ①顺序表: 顺序表是在计算机内存中以数 ...
- 线性表、顺序表和链表,你还分不清?
摘要:其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系! 本文分享自华为云社区<程序员必会自己设计线性表(顺序表.链表)>,原文作者:bigsai. 前言 其实说实话 ...
- 数据结构个人笔记 第三课 顺序表和单链表
数据结构个人笔记 第三课 顺序表和单链表 顺序表的基本操作 插入元素 删除元素 顺序表查找元素 顺序表更改元素 本节总结代码 单链表 链表的节点 头节点.头指针和首元结点 链表的创建(初始化) 本节总 ...
最新文章
- mysql 表空间监控shell_一种通过zabbix监控mysql表空间的方法
- 远程访问,文件的压缩,ip地址的设置(9,11,12unit)
- torch.cat同时连接多个tensor
- DCMTK:测试程序中定义的功能和类 ofmem.h(OF shared_ptr)
- eclipse打包项目为aar_eclipse中将项目打包成jar的两种方法,及其问题与解决方法...
- php ldap支付,php – 实现LDAP合规性
- 苹果市场占有率_三星、华为、苹果位列前三!外媒公布2020年Q2全球智能手机销量排行榜...
- python实现冒泡排序视频_Python实现冒泡排序
- ASP.NET File.Delete只读文件引起的访问被拒绝,设置文件属性为Normal
- matlab 格式化文件,Matlab 文件格式化/Matlab Source File Formator
- C++引用(作为函数参数和返回值)
- java天猫精灵_教你玩转天猫精灵:把设备接入天猫精灵
- 运维工程师种种尴尬的瞬间情景,你有无?
- 给女朋友写一个微信小程序
- JavaWeb之02_tomcat
- 解决ijkplayer和阿里云播放器冲突的解决
- 理解sklearn.processing.scale中使用有偏总体标准差
- mysql 判断时间是否当天_MySQL 获取当天日期
- 虚拟服务器ip怎么配,怎么配置基于IP地址的虚拟主机
- oTree学习教程(二)Models