数据结构之顺序表,插入,删除等

来源:互联网 发布:皇家猫粮淘宝假货多吗 编辑:程序博客网 时间:2024/04/28 13:14

大三上半年把较多的精力放在了专业课上,一直也没分配多少时间自己去再关注其他感兴趣的,当你主动去学知识时,它就变的似乎更有趣了,进入正题,这几天开始又学习了数据结构,主要如下:

一数据结构重点研究三方面的内容:

1数据的逻辑结构:指数据元素之间的逻辑关系

它分为两大类 线性结构:经典的线性结构是线性表,线性结构中数据元素存在11的关系

                       b非线性结构:经典的非线性结构是树形结构和图形结构,树形结构中的元素间存在1对多的层次结构,图形结构中的元素间存在着多对多的网状结构

2数据的存储结构:是指数据的逻辑结构到计算机存储器的映射,

常用的实现数据存储的结构的方法有如下几种

A顺序存储

其基本思想是:把逻辑上相邻的数据元素存储在物理位置上相邻的存储单元里,数据元素间的逻辑关系由存储单元的邻接关系来体现

B链式存储:其基本思想是:通过附加指针域来表示数据元素之间的关系,这种存储方式不要求逻辑上相邻的数据元素存储在位置上也相邻,数据元素间的逻辑关系是通过附加指示其他数据元素位置的地址信息(指针)而得到的

C索引存储:

其基本思想是:除了存储数据元素,还要建立一个或若干个附加的索引表来标识数据元素的地址,索引表中的每一项称为索引项,是用来标识一个或一组数据元素的存储位置

D散列存储

其基本思想是:根据数据元素的关键字直接计算出该结点的存储地址,通常称为关键字-地址转换法

3数据的运算:是指对数据元素进行加工和处理

二 算法和程序的区别及相通之处

1)算法时解决特定问题的方法和步骤,是有若干条指令组成的有序序列

算法需要满足有穷性,对于任何一组合法输入值,算法必须是在执行有穷步骤后结束,有限时间完成,但程序可以不满足有穷性的要求

(2)程序中的指令必须是机器可执行的,但算法中的指令没有这个限制

相通之处:

一个算法若用机器可识别的语言来写就是一个程序

三 对算法的定量评价

(1)时间复杂度,也就是一个算法运行时所耗费的系统时间,即一个算法的时间效率(算法的时间复杂度是由嵌套循环中最内层的循环语句的频度决定的)

(2)空间复杂度,也就是算法运行时消耗的存储空间,即算法的空间效率

注意,一般来说,两者不可兼得,要节约算法的执行时间往往要以牺牲存储空间为代价

而为了节省存储空间就要付出更多的系统时间   

四 线性表是最基本最常用的一种数据结构,什么是线性表呢

线性表(Linear List)是据有相同属性的nn>=0)个数据元素的有序序列,数据元素的个数n为线性表的长度,当n=0时称为空表,即表中不含有任何元素,通常将非空的线性表(n>=0)记为:

L=a1,a2,a3,······,ai-1,ai,ai+1,······an

线性表的逻辑特征和线性结构的逻辑特征一样:有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋和一个后继

五 线性表用顺序方式存储就称为顺序表,线性表用链式方式存储就称为链表

六 顺序表存储结构用C语言描述如下:

#define MAXSIZE  1024

typedef  int  DataType;

typedef struct

{

DataType data[MAXSIZE];

int   last;//  一般,线性表的实际元素个数应该小于等于MAXSIZE,因此需要一个变量来记录当前线性表中最后一个元素在数组中的下标,用 last变量

}SeqList;

SeqList SL;

七  线性表的插入运算

线性表的插入是指在表L的第i1<=i<=n+1)个位置插入一个值为x的新元素,插入后使原长度为n的表

a1,a2,a3,······,ai-1,ai,ai+1,······an

成为长度为n+1的表

a1,a2,a3,······,ai-1,x,ai,ai+1,······an

其思想是:

一般情况下,在第i1<=i<=n)个位置插入元素,需要从第n个元素起至第i个元素依次向后移动一个位置到n+1n,·····,i+1上,然后再把新元素x插入到第i个位置上

在编写实现算法的C函数前,应先分析一下该算法中的主要步骤

步骤:由于是插入运算,首先要检查是否有插入位置,即顺序表是否已满,若顺序表已满,则产生溢出错误,返回插入失败

步骤2:在有插入位置的前提下,还要检查插入位置是否合适,即是否满足1<=i<=n+1,若不满足条件,则插入位置错误,返回插入失败

步骤3:在步骤1,2都顺利通过的前提下,实现后移操作

步骤4:插入新结点

步骤5:将表长加1,返回插入成功

插入算法的c函数如下:

Int  insertElem(SeqList *Lint i,  DataType x)

{

Int j;

If(L->last==MAXSIZE-1)

{

Printf(“overflow”);

Return 0;

}

If((i<1)||(i>L->last+2))

{

Printf(“error”);

Return 0;

}

For(j=L->last;j>=i-1;j--)

L->data[i+1]=L->data[j];

L->data[i-1]=x;

L->last++;

Return 1;

}

注意:插入位置的有效范围是1<=i<=n+1,但当n+1<i<MAXSIZE时,在顺序表中有预留的存储单元,是否可以有插入操作?回答是;不可以,因为没有保证元素之间的逻辑关系

八 线性表的删除

是指从线性表中删除中删除第i1<=i<=n)个元素,删除后使原表长度减一

其思想是:

一般情况下,若删除第i1<=i<=n-1)个元素,需要将第i+1至第n个元素依次向前移动一

删除算法的c函数如下

Int deleteElem(SeqList *L,int i)

{

Int j;

If(i<1||i>L->last+1)

{

Printf(“第%d个元素不存在”,i);

Return 0;

}

For(j=i;j<=L->last;j++)

L->data[j-1]=L->data[j];

L->last--;

Return 1;//表示删除成功

}

 

九  线性表的按值查找

是指在线性表中查找与给定的x相等的数据元素,

其思想是:

从第一个元素和x比较,如果找到一个与x相等的元素,则返回它在线性表中的序号,表示查找成功,如果查遍整个表都没有找到和x相等的元素,返回0,表示查找失败

对应的c语言函数如下:

Int LocatElem(SeqList *LDataType x)

{

Int i;

For(i=0;i<=L->last;i++)

If(L->data[i]==x)

Return i+1;//返回的是序号

Return 0;

}

原创粉丝点击