1、顺序表
线性表的顺序表示又称为顺序存储结构或顺序映像。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。 简言之,逻辑上相邻,物理上也相邻
顺序存储方法:用一组地址连续的存储单元依次存储线性表的元素,可通过数组 V[n] 来实现。
1.1 定义
顺序表的类型定义
#define MAXSIZE 100 //最大长度
typedef struct {
ElemType *elem; //指向数据元素的基地址
int length; //线性表的当前长度
}SqList;
ex:
#define MAXSIZE 10000 //图书表可能达到的最大长度
typedef struct //图书信息定义
{
char no[20]; //图书 ISBN
char name[50]; //图书名字
float price; //图书价格
}Book;
typedef struct
{
Book *elem; //存储空间的基地址
int length; //图书表中当前图书个数
}SqList; //图书表的顺序存储结构类型为 SqList
补充:
1、C语言的动态分配函数(<stdlib.h>)
malloc(m):开辟M字节长度的地址空间,并返回这段空间的首地址。
sizeof(x):计算变量X的长度
free(p):释放指针P所指变量的存储空间,即彻底删除一个变量
2、C++的动态存储分配
int *p1 = new int;或int *p1 = new int(10);
(1)new 类型名称 T(初值列表)
功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值
(2)结果值;
成功:T类型的指针,指向新分配的内存
失败:0(NULL)
(3)delete 指针P
delete P;(释放)
3、C++中的参数传递
函数调用时传送给形参的实参必须与形参在类型、个数、顺序上保持一致
参数传递有两种方式:
1、传值方式(参数为整型、实型、字符型等)
2、传地址
参数为指针变量
参数为引用类型:&
(1)传递引用给函数与传递指针的效果是一样的;形参变化,实参也发生变化
(2)引用类型作形参,在内存中并没用产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数传递的时间和空间效率都好。
(3)指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用”*指针变量名“的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用处,必须用变量的地址作为实参。
参数为数组名
1.2 基本操作
1 初始化
初始化线性表 L(参数用引用)
StatusInitList_Sq(SqList&L){ //构造一个空的顺序表 L
L.elem=newElemType[MAXSIZE]; //为顺序表分配空间
if(!L.elem)exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为 0
returnOK;
}
初始化线性表 L (参数用指针)
StatusInitList_Sq(SqList*L){ //构造一个空的顺序表 L
L->elem=newElemType[MAXSIZE]; //为顺序表分配空间
if(!L->elem)exit(OVERFLOW);//存储分配失败
L->length=0; //空表长度为 0
returnOK;
}
销毁
voidDestroyList(SqList&L)
{
if(L.elem)delete[]L.elem;//释放存储空间
}
清空
voidClearList(SqList&L)
{
L.length=0;//将线性表的长度置为 0
}
求表长
intGetLength(SqListL)
{
return(L.length);
}
判空
intIsEmpty(SqListL)
{
if(L.length==0)return1;
elsereturn0;
}
1.3 取值
intGetElem(SqListL,inti,ElemType&e)
{
//判断 i 值是否合理,若不合理,返回 ERROR
if(i<1||i>L.length)returnERROR;
e=L.elem[i-1];//第 i-1 的单元存储着第 i 个数据
returnOK;
}
1.4 查找
intLocateELem(SqListL,ElemTypee)
{
for(i=0;i<L.length;i++)
if(L.elem[i]==e)returni+1;
return0;
}
5插入
算法步骤:
1、判断插入位置i是否合法
2、判断顺序表的存储空间是否已满
3、将第n至第i位的元素依次向后移动一个位置,空出第i个位置
4、将要插入的新元素e放入第i个位置
5、表长加1
6、插入成功返回OK
StatusListInsert_Sq(SqList&L,inti,ElemTypee){
if(i<1||i>L.length+1)returnERROR;//i 值不合法
if(L.length==MAXSIZE)returnERROR;//当前存储空间已满
for(j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];//插入位置及之后的元素后移
L.elem[i-1]=e;//将新元素 e 放入第 i 个位置
++L.length;//表长增 1
returnOK;
}
6 删除
StatusListDelete_Sq(SqList&L,inti){
if((i<1)||(i>L.length))returnERROR;//i 值不合法
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移
--L.length;//表长减 1
returnOK;
}
1.3 优缺点
优点:
存储密度打大
可以随机存取表中任一元素
缺点:
在插入、删除某一元素时,需要移动大量元素
浪费存储空间
属于静态存储形式,数据元素的个数不能自由扩充