一、线性表的基本概念
线性表的基本概念
线性表是n个元素的有限序列,它们之间的关系可以排成一个线性序列:
a1,a2,…… ,ai,…… ,an
其中n称作表的长度,当n=0时,称作空表。
线性结构特点:在数据元素的非空有限集中
存在唯一的一个被称作“第一个”的数据元素
存在唯一的一个被称作“最后一个”的数据元素
除第一个外,集合中的每个数据元素均只有一个前驱
除最后一个外,集合中的每个数据元素均只有一个后继
线性表注意:
假设n个数够成的线性表,n=0 表示是空表,元素的类型必须一致,并且不能有缺项。
关于元素地址计算的方法:
LOC(ai)=LOC(a1)+(i-1)*L
LOC(ai+1)=LOC(ai)+L
其中:
L— 一个元素占用的存储单元个数
LOC(ai)—线性表第i个元素的地址
二、线性表的的建立
如何建立一个线性表?
线性表:数据区+线性表长度变量
//将int类型重新定义一个新的类型DataType
typedef intDataType;
//定义线性表的长度
#define MAX_SIZE 100
typedef structSeqList{
//定义数据区,用来存放线性表的数据
int data[MAX_SIZE];
//定义线性表的一个长度的变量
int SeqLength;
}SList;
三、线性表的操作
1、线性表的初始化
/**
* 创建并且初始化线性表
*/
SList* Create_SeqList(){
//printf("%d",sizeof(SList));
//申请一个长度为404的内存单元
// malloc返回值是(void*)我们要让list指向这片空间,所以需要强制转换
SList*list = (SList *)malloc(sizeof(SList));
// malloc函数如果执行成功,返回新申请的这片内存单元的首地址
// malloc 函数如果执行失败,返回NULL
//判断内存空间是否申请成功
if(list!=NULL){
printf("线性表创建并初始化成功~\n");
//list->SeqLength = 0;设置线性表为空
list->SeqLength= 0;
returnlist;
}else{
printf("线性表创建成功~\n");
returnNULL;
}
}
2、线性表的打印输出
/*
* 打印输出线性表的内容(其实就是将线性表中的数据域遍历)
* 参数:给出线性表的首地址
* 思路:
*1、判断list是否为空,如果为空说明线性表不存在
*2、判断线性表是否是一个空表(list->SeqLength==0)
* 3、如果线性表不为空,则可以遍历输出线性表的内容
*/
voidPrint_SeqList(SList *list){
//1、判断list是否为空,如果为空说明线性表不存在
if(list!=NULL){
//判断线性表是否为空
if(list->SeqLength>0){
//开始遍历
inti;
for(i=0;i<list->SeqLength;i++){
printf("%d\t",list->data[i]);
}
printf("\n");
}else{
printf("线性表为空~\n");
}
}else{
printf("线性表不存在~\n");
}
}
3、线性表的数据插入
/*
* 功能:插入新的数据到线性表
*返回值:void
* 插入到哪个线性表 位置 数据
*参数:(SList *list,int location,DataType data)
* 思路:
*1、判断list是否为空,如果为空说明线性表不存在
*2、判断线性表是否已满,条件(list->SeqLength==MAX_SIZE)
* 3、判断要插入的位置是否合法
* 4、如果位置合法,要开始执行插入
*5、需要移动 n-i+1次 (i是第i个元素)
*/
voidInsert_SeqList(SList *list,int location,DataType data){
//1、判断list是否为空,如果为空说明线性表不存在
if(list!=NULL){
//判断线性表是否为空
if(list->SeqLength==MAX_SIZE){
printf("线性表已满~\n");
}else{
if(location<0|| location >list->SeqLength){
printf("您要插入的位置不合法~\n");
}else{
//循环移动元素
inti;
//移动n-i+1个元素
for(i=list->SeqLength-1;i>=location;i--){
//向右移动一个元素
list->data[i+1]= list->data[i];
}
//把要插入的值放到location位置
list->data[location]= data;
list->SeqLength++;
}
}
}else{
printf("线性表不存在~\n");
}
}
4、线性表的数据修改
/*
* 功能:修改线性表中的指定位置的数据
*返回值:void
* 修改哪个线性表 位置 数据
*参数:(SList *list,int location,DataType data)
* 思路:
*1、判断list是否为空,如果为空说明线性表不存在
*2、判断要修改的位置是否合法 0<i<list->SeqLength
* 3、如果位置合法,要开始执行修改操作
*/
voidModify_SeqList(SList *list,int location,DataType data){
//1、判断list是否为空,如果为空说明线性表不存在
if(list!=NULL){
if(location<0|| location >list->SeqLength){
printf("您要插入的位置不合法~\n");
}else{
//把要插入的值放到location位置
list->data[location]= data;
}
}else{
printf("线性表不存在~\n");
}
}
5、线性表的删除
/*
* 功能:删除指定位置的数据
*返回值:void
* 删除哪个线性表 位置
*参数:(SList *list,int location)
* 思路:
*1、判断list是否为空,如果为空说明线性表不存在
* 2、判断当前的线性表,是否为空,如果为空,则不能再删除
*3、判断要删除的位置是否合法 0<i<list->SeqLength
* 4、要进行移动
* 5、进行删除操作
*/
voidDelete_SeqList(SList *list,int location){
//1、判断list是否为空,如果为空说明线性表不存在
if(list!=NULL){
//判断线性表是否为空
if(list->SeqLength>0){
//如果不为空个,需要判断位置是否合法
if(location<0|| location >list->SeqLength){
printf("您要删除的位置不合法~\n");
}else{
//移位
inti;
for(i=location;i<list->SeqLength;i++){
list->data[i]= list->data[i+1];
}
//让线性表的长度减1
list->SeqLength --;
}
}else{
printf("当前线性表为空,不能进行删除~\n");
}
}else{
printf("线性表不存在~\n");
}
}
6、线性表的查找(按位置查找)
/*
*功能:根据位置(location)进行查找
*返回值:DataType
* 查找哪个线性表 位置
*参数:(SList *list,int location)
* 思路:
*1、判断list是否为空,如果为空说明线性表不存在
* 2、根据位置,直接获取该位置所对应的值
*/
DataTypeSearchByLocation(SList *list,int location){
//1、判断list是否为空,如果为空说明线性表不存在
if(list!=NULL){
printf("当前线性表中,位置为:%d 的值为:%d\n",location,list->data[location]);
return list->data[location];
}else{
printf("线性表不存在~\n");
return1;
}
}
7、线性表的查找(按值查找)
/*
* 功能:根据给定的值,查找该值所对应的位置
*返回值:int
* 查找哪个线性表 要查找的数据
*参数:(SList *list,DataType data)
* 思路:
*1、判断list是否为空,如果为空说明线性表不存在
* 2、遍历,查找值是否存在,如果查找到了,应该立即停止
*/
intSearchByData(SList *list,DataType data){
//1、判断list是否为空,如果为空说明线性表不存在
if(list!=NULL){
inti;
intseachFlag = 0;
for(i=0;i<list->SeqLength;i++){
//判断线性表中的每一个值是否等于要查找的值
if(list->data[i]==data){
seachFlag= 1;
break;
}
}
if(seachFlag){
printf("您要查找的 %d 在当前线性表中的位置是:%d\n",data,i);
//返回的就是查找到这个值的位置
returni;
}else{
return0;
printf("没有查找到符合的数据~\n");
}
}else{
printf("线性表不存在~\n");
return0;
}
}