数据结构.线性表(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
View Code

 

posted @ 2015-02-27 15:52  J·A  阅读(188)  评论(0编辑  收藏  举报