一、线性表的定义和特点
1、定义:由n(n>=0)个数据元素(结点)组成的有序序列
2、逻辑特征:同一线性表中的元素必须具有相同的特性,数据元素之间的关系为线性。线性表是一种典型的线性结构。
二、线性表的基本定义
1、抽象数据类型的线性表定义如下:
ADT List{
数据对象:D={ai | ai属于Elemset,(i=1,2,....n)}
数据关系:R={<ai-1,ai>,ai-1和ai属于D}
数据操作:InitList(&L)等
}ADT List
2、基本操作:
1)InitList(&L):构造一个新的线性表
2)DestroyList(&L):销毁线性表L
3)ClearList(&L):将线性表L置为空表
4)ListEmpty(L):若线性表L为空表则返回TURE,否则返回FALSE
5)ListLength(L):返回线性表中数据元素的个数
6)GetElem(L,i&e):用e返回线性表L中第i个元素的值
.....等等
三、线性表的线性表示和实现
1、顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
2、所有数据元素的存储单元均可由第一个数据元素的存储对象得到:LOC(ai)=LOC(ai)+(I-1)*L
3、顺序表的特点:任意元素可随意存取。
4、线性表的顺序存储表示
#define LIST INIT SIZE 100 //线性表存储空间的初始分配量
typedef struct{
ElemType elem[LIST_INIT_SIZE]; //线性表中的元素
int length; //当前长度
}SqList;
5、图书表的顺序存储结构类型定义
#define MAXSIZE 1000 /*图书馆表可能达到的最大存储长度*/
typedef struct{ /*图书信息定义*/
char no[10]; /*图书的ISBN*/
char name[50];
float price;
}Book;
typedef struct{
Book *elem; /*存储空间的基地址*/
int length; /*图书馆当前存放的图书个数*/
}SqList; /*图书馆的顺序存储类型为SqList*/
6、线性表的顺序表示和实现
#define MAXSIZE 100
typedef struct{
ElemType elem[MAXSIZE]; /*存储元素的MAXSIZE数组*/
int length; /*线性表的元素个数,即表长*/
}SqList;
typedef struct{
ElemList *elem; /*指向线性表的指针类型*/
int length;
}SqList;
L.elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
/*malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址。
sizeof(x)运算:计算变量x的长度。
free(p)函数:释放指针p所指变量的存储空间,即彻底删除一个变量*/
7、线性表L的初始化
Status InitList Sq(SqList &L){ /*构造一个空的顺序表L*/
L.elem=new ElemType[MAXSIZE]; /*为顺序表分配存储空间,L.elem为首元素地址*/
if(!L.elem) exit(OVERFLOW); /*若存储分配失败*/
L.length=0; /*空表长度为0*/
return OK;
}
8、销毁线性表
void DestroyList(SqList &L){
if(L.elem) delete L.elem; /*释放存储空间*/
}
9、清空线性表
void ClearList(SqList &L){
L.length=0; /*将线性表的长度置为0*/
}
10、求线性表的长度
int GetLength(SqList L){
return (L.length);
}
11、判断线性表L是否为空
int IsLength(SqList L){
if(L.length==0) return 1;
else return 0;
}
12、顺序表的取值,根据位置i获取相应位置元素的内容
int GetElem(SqList L,int i,ElemTyoe &e){
if(i<1||i>L.length)
return ERROR; /*判断想获得的i值是否合理*/
e=L.elem[i-1]; /*第i-1个单元存储着第i个元素*/
return OK;}
13、顺序表的查找
在线性表中查找与定制e相同数据元素的位置,从表的一端开始,一个一个比较查找,找到则返回该元素的位置编号,若未找到,则返回0
int LocateElem(SqList L,ElemType e){
/*在线性表中查找数值为e的数据元素,返回其序号*/
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1; /*查找成功,则返回线性表中的序号*、
return 0; /*查找失败,返回0*/
}
14、顺序表的插入
先判断插入位置i是否合理再将i之后的元素都向后挪一个位置,将元素e放到位置i上,表长加1
Status ListInsert_Sq(SqList &L,int i,ElemType e){ /*status代表函数的返回类型*/
if(i<1||i>L.length+1) return ERROR;
/*i值不合法,i>L.Lengeh+1的意思为可以插入在线性表的最后一个元素后*/
if(L.length==MAXSIZE) return ERROR; /*当前存储空间已满*/
for(j=L.length-1;j>=i-1;j--) /*插入位置后的元素后移*/
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e; /*插入位置赋值e*/
L.length++; /*表长加1*/
return OK;
}