数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
线性表定义:
零个或多个数据元素的有限序列。
关键地方:
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:SqListView Code
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