数据结构.线性表(1)——顺序表
数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
线性表定义:
零个或多个数据元素的有限序列。
关键地方:
1.首先它是一个序列:前驱后继
2.线性表强调是有限的
抽象数据类型:
1.插入数据
1)如果插入位置不合理,抛出异常;
2)如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
3)从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
4)将要插入元素填入位置i处;
5)表长加1
2.删除数据
1)如果删除位置不合理,抛出异常
2)取出删除元素
3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
4)表长减1
顺序存储结构:
线性表的顺序存储结构是一种随机存取的存储结构。由于高级程序设计语言(这里主要用指C)中的数组类型也有随即存取的特性,因此,通常用数组来描述数据结构中的顺序存储结构。(适合元素个数不太变化,而更多是存取数据的应用)
1.三个关键点:
1)存储空间的起始位置
2)线性表的最大存储容量
3)线性表的当前长度(与数组长度区分)
2.code
1 ///Name:SqList 2 ///Author:JA 3 ///Date:2015-2-27 4 5 6 7 ///线性表的动态分配顺序存储结构 8 #define LIST_INT_SIZE 100 //初始分配量 9 #define LISTINCREMENT 10 //分配增量 10 typedef int ElemType; 11 typedef int Status; 12 13 typedef struct{ 14 ElemType *elem; //存储空间基地址 15 int length; //当前长度 16 int listsize; //当前分配的存储容量 17 }SqList; 18 19 Status InitList_Sq(SqList *L){ 20 //构造一个空的线性表L 21 (*L).elem = (ElemType*)malloc(LIST_INT_SIZE*sizeof(ElemType)); 22 if (!(*L).elem) exit(OVERFLOW); //存储分配失败 23 (*L).length = 0; //空表长度为0 24 (*L).listsize = LIST_INT_SIZE; //初始存储容量 25 return OK; 26 }//InitList_Sq 27 28 ///在表L中第i个位置前插入新的元素e 29 Status ListInsert_Sq(SqList *L, int i, ElemType e){ 30 ElemType *newbase,*p,*q; 31 if (i<1 || i>(*L).length + 1) return ERROR; //i值不合法 32 if ((*L).length >= (*L).listsize){ //当前存储空间已满,增加分配 33 newbase = (ElemType*)realloc((*L).elem, ((*L).listsize + LISTINCREMENT)*sizeof(ElemType)); 34 if (!newbase) exit(OVERFLOW); 35 (*L).elem = newbase; 36 (*L).listsize += LISTINCREMENT; 37 38 } 39 q = &((*L).elem[i - 1]); //q为插入位置 40 for (p = &((*L).elem[(*L).length - 1]); p >= q; --p) *(p + 1) = *p; //插入位置及之后的元素后移 41 *q = e; 42 ++(*L).length; 43 return OK; 44 }//ListInsert_Sq 45 46 ///在表L中删除第i个元素,并用e返回其值 47 Status ListDelete_Sq(SqList *L, int i, ElemType *e){ 48 ElemType *p, *q; 49 if (i<1 || i>(*L).length + 1) return ERROR; //i值不合法 50 p = &((*L).elem[i - 1]); //p为被删除元素的位置 51 *e = *p; 52 q = (*L).elem + (*L).length - 1; 53 for (++p; p <= q;++p) *(p - 1) = *p; //删除位置及之后的元素前移 54 --(*L).length; 55 return OK; 56 }//ListDelete_Sq