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[] ...
随机推荐
- Python——函数的高级应用
一.函数赋值给变量 函数也是对象,也可以赋值给变量,当把函数赋值给变量后,可以通过变量调用函数. 例: def test(x,y): return x * y # 把函数赋值给变量 a = test ...
- Bootstrap 下拉菜单(dropdown)插件
使用下拉菜单的插件,您可以向任何组件(比如:导航栏,标签页,胶囊式导航,按钮)添加下拉菜单 用法 您可以切换下拉菜单(dropdown)插件隐藏内容 1.通过data属性,向链接或按钮添加data-t ...
- sql server 定时备份 脚本
) DECLARE @date DATETIME SELECT @date = GETDATE() SELECT @filename = 'G:\backup\NewPlulishSQL-' + CA ...
- 如何挂载一个镜像文件(how to mount an image file)
如何挂载一个镜像文件(how to mount an image file) 08/16/2012master 4 Comments 在使用KVM或Xen虚拟化的情况下,经常需要使用镜像文件(imag ...
- vc文件操作汇总—支持wince
一.判断文件及文件夹是否存在 // 判断文件是否存在 BOOL IsFileExist(const CString& csFile) { DWORD dwAttrib = GetFileAtt ...
- crm项目之整体内容(一)
一.项目背景 YW公司是一家电池供应商,目前由于公司内部的需要,需要做一个CRM项目,需要每一个不同角色的员工登陆系统后处理自己的事情.其流程大致如下: 其项目包括三部分内容: 1.权限分配组件(rb ...
- Python中的端口协议之基于UDP协议的通信传输
UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并 ...
- FIFO buffer 和普通buffer区别
1.FIFO可以说一块具体的硬件存储设备,也可以说程序在内存中开辟的一段内存区域.而buffer往往就是一段缓冲的数据区域 2.FIFO的数据是先进先出的,而buffer没有这个限制,可以全局访问 3 ...
- UVA - 11572 Unique Snowflakes 滑动扫描
题目:点击打开题目链接 思路:从左往右扫描,定义扫描左端点L,右端点R,保证每次往几何中添加的都是符合要求的连续的数列中的元素,L和R从0扫到n,复杂度为O(n),使用set维护子数列,set查找删除 ...
- 如何解决border的重叠问题
我现在在做一个ul列表,然后给每个li加上边框,但是加完了之后,相邻列表的边框就会变成2px,比如第一个li的下边框和第二个li的上边框就会重叠在一起,请问这有什么办法解决一下么? 解决方法是: 试试 ...