线性表
终于抽出空来写第二篇,在医院每天忙得连翻书的心情都没有,凡事要坚持加油!
线性结构的特点是:
在数据元素的非空有限集中,
⒈存在唯一的一个被称作“第一个”的数据元素;
⒉存在唯一的一个被称作“最后一个”的数据元素;
⒊除第一个之外,集合中的每一个数据元素均只有一个“前驱”;
⒋除最后一个之外,集合中每个数据元素均只有一个“后继”。
线性表的类型和定义
线性表(linear_list) 是最常用,最简单的一种有限序列,是n个数据元素组成的有限序列。
抽象数据类型线性表的定义如下:
ADT List {
数据对象:D={Ai | Ai ∈ ElemSet,i = 1,2,3,...n,n>=0}
数据关系:R1 = {<Ai-1,Ai > | Ai-1,Ai ∈ D,i=2,...n}
基本操作:
InitList (&L) //创建一个空的线性表L
DestroyList(&L) //销毁线性表L
CleartList(&L) //将表L重置为空表
ListEmpty(L) //判空,空则返回true,否则返回false
ListLength(L) //查表L的长度
GetElem(L,i,&e) //用e返回表L中第i个位置的值
LocatElem(L,e,compeare() ) //返回表L中第一个与e满足关系compare()的数据元素的位序
PriorElem(L,cur_e,&pre_e) //若cur_e∈L && cur_e i≠0 则返回它的前驱
NextElem(L,cur_e,&next_e) //若cur_e∈L && cur_e i≠n 则返回它的后继
ListInsert(&L,i,&e) //在表L第i个位置前插入e,L的长度加1
Listdelete(&L,i,&e) //删除表L第i个位置的元素并用e返回其值,L的长度减1
ListTraverse(L,visit() ) //对表L每一个元素调用函数visit()
}ADT List
线性表的顺序表示和实现
线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCTEMENT 10 //线性表存储空间的分配增量
typedef struct {
ElemType *elem; //存储空间基值(int data)
int length; //存储空间长度
int listsize; //当前分配的存储容量
}Sqlist;
注:手动简单书写方式:
int A{maxSize}
int a
Struct InitList Sq (Sqlist &L){
//构造一个空的线性表L
L.elem = (elemtype * ) malloc (LIST_INIT_SIZE * sizeof (elemtype) ) //分配空间
if( ! L.elem) exit (overflow); //判空,如果所分配的基址不为空则失败
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return(OK);
} //initlist_ sq
线性表顺序存储的查找、插入、删除操作的实现
struct ListInsert _sq (sqlist L,int i,elem e){
//在顺序线性表L中第i个位置之前插入新的元素e
if(i<0 || i>L.length+1) return error;
if(L.length >= L.listsize){
newbase = (elemtype *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(elemtype))
if(!newbase) exit(overflow);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i-1]);
for(p= & (L.elem[L.length-1]);p>=q;--p) *(p+1) = *p;
*q = e;
++L.length;
renturn ok;
}//Listinsert_sq