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)的更多相关文章

  1. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  2. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  3. hrbust-1545-基础数据结构——顺序表(2)

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...

  4. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  5. python算法与数据结构-算法介绍(31)

    一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...

  6. 数据结构顺序表Java实现

    Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...

  7. python算法与数据结构-什么是数据结构

    一.什么是数据结构 数据结构,直白地理解,就是研究数据的存储方式. 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值 ...

  8. c数据结构 顺序表和链表 相关操作

    编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...

  9. 数据结构顺序表删除所有特定元素x

    顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...

随机推荐

  1. Java-JFrame-swing嵌套浏览器步骤

    Java-JFrame-swing嵌套浏览器步骤 一.使用swing嵌套浏览器要实现的功能: 通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出来,只需 ...

  2. Verilog之语句位置

    1.if语句.case语句必须放在always过程语句块中. 2.verilog的系统函数比如:\(display/\)monitor必须放在initial 过程语句块中.这点尚为理解为何,但必须这样 ...

  3. static关键字所导致的内存泄漏问题

    大家都知道内存泄漏和内存溢出是不一样的,内存泄漏所导致的越来越多的内存得不到回收的失手,最终就有可能导致内存溢出,下面说一下使用staitc属性所导致的内存泄漏的问题. 在dalvik虚拟机中,sta ...

  4. 02 Django模型

    ORM 的作用 ORM 作用示意图 ORM 框架的功能 建立模型类和表之间的对应关系,允许通过面向对象的方式来操作数据库 根据设计的模型类生成数据库中的表格. 通过方便的配置就可以进行数据库的切换 数 ...

  5. HDU - 4027 Can you answer these queries?(线段树)

    给定一个长度为n的序列,m次操作. 每次操作 可以将一个区间内的所有数字变为它的根号. 可以查询一个区间内所有元素的和. 线段树的初级应用. 如果把一个区间内的元素都改为它的根号的话,是需要每个数字都 ...

  6. golang(go语言)调试和查看gc信息,以及gc信息解析

    这里记录一下调试golang gc的方法 启用gc打印: # GODEBUG=gctrace=1 go run ./main.go 程序启动后gc将打印如下信息: gc 65 @16.996s 0%: ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  8. Java中对象方法的调用过程&动态绑定(Dynamic Binding)

    Java面向对象的最重要的一个特点就是多态, 而多态当中涉及到了一个重要的机制是动态绑定(Dynamic binding). 之前只有一个大概的概念, 没有深入去了解动态绑定的机理, 直到很多公司都问 ...

  9. Python 实战一

    列表ID的显示 起初ID显示的是数据库中的id,因为数据库中的id是自增长的,所以删除一条后,这里显示就叉开了,这里使用索引的方式来显示. 这个功能实现的逻辑: 第一:定义一个表格的架构,用id=‘i ...

  10. mantisbt邮件配置

    PHP.INI里面 [mail function]; For Win32 only.#SMTP = 192.168.0.249SMTP = smtp.163.comsmtp_port = 25 ; F ...