python算法与数据结构-顺序表(37)
1、顺序表介绍
顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入、删除时需要移动大量元素。顺序表可以分配一段连续的存储空间Maxsize,用elem记录基地址,用length记录实际的元素个数,即顺序表的长度,

上图1表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即:Loc(element i) = Loc(e0) + c*i
所以、访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。
如果元素的大小不统一,则须采用图2的元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)。由于每个链接所需的存储量相同,通过上述公式,可以计算出元素链接的存储位置,而后顺着链接找到实际存储的数据元素。注意,图2中的c不再是数据元素的大小,而是存储一个链接地址所需的存储量,这个量通常很小。
图2这样的顺序表也被称为对实际数据的索引,这是最简单的索引结构。
2、顺序表的结构

一个顺序表的完整信息包括两部分,一部分是表中的元素集合,另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息,这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项。
3、顺序表的两种基本实现方式

1为一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。一体式结构整体性强,易于管理。但是由于数据元素存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。
2为分离式结构,表对象里只保存与整个表有关的信息(即容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接与基本表对象关联。
4、元素存储区替换
一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变。
5、元素存储区扩充
采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。只要程序的运行环境(计算机系统)还有空闲存储,这种表结构就不会因为满了而导致操作无法进行。人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。
扩充的两种策略
每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。
特点:节省空间,但是扩充操作频繁,操作次数多。
每次扩充容量加倍,如每次扩充增加一倍存储空间。
特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。
6、顺序表的增删改查操作的Python代码实现
# 创建顺序表
class Sequence_Table(): # 初始化
def __init__(self):
self.date = [None]*100
self.length = 0 # 判断是否已经满了
def isFull(self):
if self.length>100:
print("该顺序表已满,无法添加元素")
return 1
else:
return 0 # 按下表索引查找
def selectByIndex(self,index):
if index>=0 and index<=self.length-1:
return self.date[index]
else:
print("你输入的下标不对,请重新输入\n")
return 0 # 按元素查下标
def selectByNum(self,num):
isContain = 0
for i in range(0,self.length):
if self.date[i] == num:
isContain = 1
print("你要查找的元素下标是%d\n"%i)
if isContain == 0:
print("没有找你你要的数据") # 追加数据
def addNum(self,num):
if self.isFull() == 0:
self.date[self.length] = num
self.length += 1 # 打印顺序表
def printAllNum(self):
for i in range(self.length):
print("a[%s]=%s"%(i,self.date[i]),end=" ")
print("\n") # 按下标插入数据
def insertNumByIndex(self,num,index):
if index<0 or index>self.length:
return 0
self.length += 1
for i in range(self.length-1,index,-1):
temp = self.date[i]
self.date[i] = self.date[i-1]
self.date[i-1] = temp
self.date[index] = num
return 1
# 按下标删除数据
def delectNumByIndex(self,index):
if self.length <= 0:
print("该顺序表内没有数据,不用删除") for i in range(index,self.length-1):
temp = self.date[i]
self.date[i] = self.date[i + 1]
self.date[i + 1] = temp
self.date[self.length-1] = 0
self.length -= 1 def main():
# 创建顺序表对象
seq_t = Sequence_Table() # 插入三个元素
seq_t.addNum(1)
seq_t.addNum(2)
seq_t.addNum(3) # 打印验证
seq_t.printAllNum() # 按照索引查找
num = seq_t.selectByIndex(2)
print("你要查找的数据是%d\n" % num) # 按照索引插入数据
seq_t.insertNumByIndex(4, 1)
seq_t.printAllNum() # 按照数字查下标
seq_t.selectByNum(4) #删除数据
seq_t.delectNumByIndex(1)
seq_t.printAllNum() if __name__ == "__main__":
main()
运行结果为:
a[0]=1 a[1]=2 a[2]=3 你要查找的数据是3 a[0]=1 a[1]=4 a[2]=2 a[3]=3 你要查找的元素下标是1 a[0]=1 a[1]=2 a[2]=3
7、顺序表的增删改查操作的C语言代码实现
#include<stdio.h>
// 1、定义顺序表的储存结构
typedef struct
{
//用数组存储线性表中的元素
int data[];
// 顺序表中的元素个数
int length;
}Sequence_table,*p_Sequence_table; // 2、顺序表的初始化,
void initSequenceTable(p_Sequence_table T)
{
// 判断传过来的表是否为空,为空直接退出
if (T == NULL)
{
return;
}
// 设置默认长度为0
T->length = ;
} // 3、求顺序表的长度
int lengthOfSequenceTable(p_Sequence_table T)
{
if (T==NULL)
{
return ;
}
return T->length;
} // 4、判断顺序表是否已满
int isFull(p_Sequence_table T)
{
if (T->length>=)
{
printf("该顺序表已经装满,无法再添加元素");
return ;
}
return ;
} // 5、按序号查找
int selectSequenceTableByIndex(p_Sequence_table T,int index)
{
if (index>=&&index<=T->length-)
{
return T->data[index];
}
printf("你输入的序号不对,请重新输入\n");
return ;
} // 6、按内容查找是否存在
void selectSequenceTableByNum(p_Sequence_table T,int num)
{
int isContain = ;
for (int i=; i<T->length; i++)
{
if (T->data[i] == num)
{
isContain = ;
printf("你要找的元素的下标是:%d\n",i);
}
}
if (isContain == )
{
printf("没有找到你要的数据\n");
}
} // 7、添加元素(在队尾添加)
void addNumber(p_Sequence_table T,int num)
{
// 顺序表还没有满的时候
if (isFull(T) == )
{
T->data[T->length] = num;
T->length++;
}
} // 8、顺序表的遍历
void printAllNumOfSequenceTable(p_Sequence_table T)
{
for (int i = ; i<T->length; i++)
{
printf("T[%d]=%d ",i,T->data[i]);
}
printf("\n");
} //9、插入操作
int insertNumByIndex(p_Sequence_table T, int num,int index)
{
if (index<||index>T->length)
{
return ;
}
T->length++;
for (int i = T->length-; i>index; i--)
{
int temp = T->data[i];
T->data[i] = T->data[i-];
T->data[i-] = temp;
}
T->data[index] = num;
return ;
} // 10、删除元素
void delectNum(p_Sequence_table T,int index)
{
if (T->length <= )
{
printf("该顺序表中没有数据,不用删除");
}
for (int i = index;i<T->length-; i++)
{
int temp = T->data[i];
T->data[i] = T->data[i+];
T->data[i+] = temp;
}
T->data[T->length-] = ;
T->length--;
} int main(int argc, const char * argv[]) { // 创建顺序表的结构体
Sequence_table seq_t;
// 初始化
initSequenceTable(&seq_t);
// 添加数据
addNumber(&seq_t, );
addNumber(&seq_t, );
addNumber(&seq_t, );
// 打印验证
printAllNumOfSequenceTable(&seq_t);
// 根据索引下标查内容
int num = selectSequenceTableByIndex(&seq_t, );
printf("你查的数据是:%d\n",num);
// 插入
insertNumByIndex(&seq_t, , );
printAllNumOfSequenceTable(&seq_t);
// 根据内容查下标
selectSequenceTableByNum(&seq_t, );
// 根据下标删除数据
delectNum(&seq_t, );
printAllNumOfSequenceTable(&seq_t);
return ;
}
运行结果为:
T[]= T[]= T[]=
你查的数据是:
T[]= T[]= T[]= T[]=
你要找的元素的下标是:
T[]= T[]= T[]=
python算法与数据结构-顺序表(37)的更多相关文章
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- hrbust-1545-基础数据结构——顺序表(2)
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...
- python算法与数据结构-单链表(38)
一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...
- python算法与数据结构-算法介绍(31)
一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...
- 数据结构顺序表Java实现
Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...
- python算法与数据结构-什么是数据结构
一.什么是数据结构 数据结构,直白地理解,就是研究数据的存储方式. 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值 ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- 数据结构顺序表删除所有特定元素x
顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...
随机推荐
- setTimeout,clearTimeout的一些好用法
if(hidden != 1){ $.ui.showMask(); var _aaa = setTimeout(function(){ $.ui.hideMask(); },5000); } //be ...
- 使用jquery.ajax实现省市的二级联动(SSH架构)
首先实现jquery ajax的二级联动 要下载个jquery.js 我在这里就不准备了 自行百度下载 背景介绍:通过部门的ID来查找部门下的所有班级 我实现二级联动的思路是:先查询所有部门 显示在页 ...
- NOIP模拟赛 抓牛
[题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有两种办法 ...
- Spring源码剖析依赖注入实现
Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java 版权声明:本文为博主原 ...
- 理解JWT的使用场景和优劣
理解JWT的使用场景和优劣 淘楼小能手 百家号04-2816:20 经过前面两篇文章<JSON Web Token - 在Web应用间安全地传递信息><八幅漫画理解使用JSON We ...
- salt 模板
http://www.mamicode.com/info-detail-2297406.html
- LeetCode1090. 受标签影响的最大值
问题: 我们有一个项的集合,其中第 i 项的值为 values[i],标签为 labels[i]. 我们从这些项中选出一个子集 S,这样一来: |S| <= num_wanted 对于任意的标签 ...
- linux文件属性之linux文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除.一般来说,每个文件都有2个link计数器:i_count和i_nlink. i_count的 ...
- leetcode-5-basic
解题思路: 设两个变量land和sink,land的值是1的数量,sink表示内部的边.result = land*4-sink*2.按行扫描得到land, 同时得到同一行中内部边的数目:然后按列扫描 ...
- 10个MCU常用的基础知识
转自:http://bbs.21ic.com/icview-2659278-1-1.html 1.MCU有串口外设的话,在加上电平转换芯片,如MAX232.SP3485就是RS232和RS485接口了 ...