2.1线性表的定义 线性表是一种简单的线性结构,具有如下特征: (1)集合中必须存在唯一的一个第一个元素。 (2)集合中必须存在唯一的一个最后一个元素。 (3)除最后一个元素外均有一个唯一的直接后继。 (4)除第一个元素外,均有唯一的直接前驱。 2.2线性表的存储结构和基本操作的实现 2.2.1顺序存储 用一组连续的存储空间存放线性表中的各个数据元素,用位置相邻的存储空间关系表示线性表中数据元素的前驱和后继的次序关系。
//自定义结构体数据类型 //实用性受限,数组长度固定。 #define MAX 100 typedef struct{ ElemType data[MAX];//直接定义数组,存放数据元素 int listSize; //存放数组容量 int length; //存放实际数据元素个数 }SpList;SqList是一个结构体数据类型,成为线性表。 另一种形式如下:
//具有良好的通用性,在实际使用过程中根据实际来定义数组的长度 #define MAX 100 typedef struct{ ElemType *data; //定义存放数组起始地址的指针变量 int listSize; //存放数组容量 int length; //存放实际数据元素个数 }SpList;顺序存储结构中任意数据元素的地址计算公式:首地址+下标数据元素占用的空间大小。* 2.2.2基于顺序表的基本操作的实现 采用第二种结构体定义方式。 假设有一组学生数据(姓名和总分),用顺序表存放。 (1)定义学生数据的数据类型
typedef struct{ char name[20]; //存放学生姓名 float score; //存放学生分数 }STD;(2)定义顺序表数据类型
typedef struct{ STD *data; int listSize; int length; }SqList;使用:SqList l,*p = &l; //p指向了L 结构体L的三个数据成员访问,既可以使用结构体(L.data[i],L.listSize,L.length),也可以使用指针(p->data[i],p->listSize,p->length)。 1.初始化操作 初始化操作时完成一片连续空间的申请,将空间的起始地址、容量、和数据的个数依次存放到顺序表的三个对应成员中。
//一个参数是能将顺序表类型变量的变化传出去,即顺序表类型指针变量;另一个是接受数组大小的整形变量。 int initSqList(SqList *L,int max){ L->data = (STD *)malloc(max * sizeof(STD)); if(L->data == NULL){ printf("空间申请失败!\n"); return 0; } L->listSize = max; L->length = 0; return 1; }2.插入操作 将学生数据插入到顺序表中指针成员所指向数组的指定位置上,数据个数+1. 插入操作除了在尾部插入外,其他位置上的插入都需要将一组数据元素向后移动。
//第一个参数能够将顺序表类型变量的变化传出去的顺序表类型的指针变量;第二个是接收插入数据元素位置的整型变量;第三个是接收待插入数据元素值的变量。 int insertSqList(SqList *L,int i,STD x){ int k; if(i<1 || i>L->length+1){ printf("插入位置异常\n"); return 0; } if(L->length = L->listSize){ printf("容量不够\n"); return 0; } for(k=L->length;k>=i;k--){ l->data[k] = l->data[k-1]; } L->data[i-1] = x; L->length = L->length+1; return 1; }