1.概念:线性表是由零个或多个数据元素组成的有限数列。
2.线性表的抽象数据类型:
(1)InitList(*L):初始化线性表,建立一个空的线性表L
(2)ListEmpty(*L):判断线性表是否为空表,若为空则返回True,否则返回false
(3)ClearList(*L):将线性表清空
(4)GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e
(5)LocateElem(L,e):在线性表L中查找与给定e值相等的元素,如果查找成功,返回该元素在表中序号表示成功,否则,返回0表示失败。
(6)ListInsert(*L,i,e):在线性表L中第i个位置插入元素e。
(7)ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。
(8)ListLength(L):返回线性表L的元素个数。
3.线性表两种存储结构:顺序存储结构和链式存储结构
顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素。
顺序存储的结构代码:
#define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; //线性表当前长度 }SqList;
Status Initlist_Sq(SqList &L) //构造一个空的线性表L { L.elem = (ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType)); if (!L.elem) { exit(OVERFLOW); //存储分配失败 } L.length = 0; //空表长度为0 L.listsize = LIST_INIT_SIZE; //初始化存储容量 return OK; } //Initlist_Sq
顺序存储结构封装的三个属性:
(1)存储空间的起始位置,数组data,它的存储位置就是线性表的存储空间的存储位置
(2)线性表的最大存储容量:数组的长度MAXSIZE.
(3)线性表的当前长度:length
注:
1.数组的长度与线性表的当前长度需要区分一下:数组的长度是存放线性表的存储空间的总长度,一般是初始化前后不变。而线性表的当前长度是线性表中元素的个数,是会动态变化的。
2.数组下标从0开始,线性表内元素从1开始。
LOC(ai+1) = LOC(a1)+(i-1)*C (C为数据类型所占字节数)
getElem.c
status getElem(SqList L,int i,ElemType *e) { if (L.length == 0|| i< 1||i > L.length) { return Error } *e = L.data[i- 1] return OK }
LocateElem(L,e)
status LocateElem (L,e) { if L.length == 0 { return 0 } for ( i = 0; i < L.length ;i ++ ) { if L.data[i] == e { return i+1 } } return 0 }
ListInsert(*L,i,e)
思路:
(1)判断i的值,是否满足: 1《i《L.length+1,若不满足返回错误。若满足,执行(2)
(2)判断L.length是否已经达到MAXSIZE,若达到了,则可以报错返回,或者增加分配,执行(3)
(3)在第i 个位置插入e,则应该是在L.data[i-1] = e,将原来的l.data[i-1]到最后都向后移动一位。同时表长加一。
status listInsert(*L,i,e) { if( i < 1|| i > L.length+1) { return ERROR } //i的位置不合法,返回 if (L.length >= MAXSIZE) { return ERROR } /*或者也可以增加分配*/ if (L.length >= MAXSIZE) { newbase = (ElemType *)remalloc(L.elem,(MAXSIZE + LISTINCREMENT) *sizeof(ElemType0)); if (!newbase)exit(OVERFLOW); //存储分配失败 L.elem = newbase; //新基址 MAXSIZE += LISTINCREMENT; //增加存储容量 } /*结束*/ if(i < L.length+1) { for(j=L.length;j>i-1;j--) { L.data[j] = L.data[j-1] } } L.data[i-1] = e L.length++; return ok }
ListDelete(*L,i,*e)
status ListDelete(*L,i,*e) { if( L.length == 0 || i < 1 || i > L.length) { return ERROR } *e = L.data[i-1] if(i < L.length) { for(j=i;j<L.length;j++) { L.data[j-1] = L.data[j] } } L.length--; return OK }
线性表的特点: