顺序表
顺序表,又称线性表,是编程语言中一个很重要的知识点 。基本上 C语言以及其它的编程语言都有涉及这个知识点。
所以,这个知识点一定要弄清楚 。
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
线性表的基本定义格式:
//MAX_SIZE 为插入数据的最大个数
#define MAX_SIZE 10
//DataType插入数据的类型
#define DataType int
typedef struct Seqlist
{
DataType arr[MAX_SIZE];
int size;
}Seqlist,*pSeqlist;
一般的顺序表 ,所包含的基本操作函数有:
//顺序表初始化
void InitSeqlist(pSeqlist pSeq);
//从尾部插入数据
void PushBack(pSeqlist pSeq,DataType data);//DataType 为数据的类型
//从尾部删除数据
void PopBack(pSeqlist pSeq);
//从头部插入数据
void PushFront(pSeqlist pSeq,DataType data);
//从头部删除数据
void PopFront(pSeqlist pSeq);
//按位置插入数据
void Insert(pSeqlist pSeq,int pos,DataType data);//在下表为pos的后面插入
//按位置删除数据
void Erase(pSeqlist pSeq,int pos);//删除pos位置的数据
//查找数据
int Find(pSeqlist pSeq,DataType data);
//按数据删除
void Remove(pSeqlist pSeq,DataType data);
//按数据彻底删除
void RemoveAll(pSeqlist pSeq,DataType data);
//判断线性表是否为空
int IsEmpty(pSeqlist pSeq);
//打印线性表
void PrintSeqlist(pSeqlist pSeq);
函数的实现
初始化
void InitSeqlist(pSeqlist pSeq)
{
assert(pSeq);//先检验参数是否合格
memset(pSeq->arr,0,MAX_SIZE*sizeof(DataType));//初始化顺序表为全零
pSeq->size = 0;//顺序表的当前长度为 0
}
//尾部插入
void PushBack(pSeqlist pSeq,DataType data)
{
assert(pSeq);//先检验参数是否合格
if(pSeq->size >= MAX_SIZE)//判断顺序表是否 已满??
{
printf("Seqlist has been full\n");
return ;
}
pSeq->arr[pSeq->size] =data;//在结尾插入数据
pSeq->size++;//顺序表的当前长度加 1
}
//尾部删除
void PopBack(pSeqlist pSeq)
{
assert(pSeq);//先检验参数是否合格
if(pSeq->size ==0)//判断顺序表是否为空
{
printf("Seqlist has been empty\n");
return ;
}
pSeq->size--;//顺序表当前长度减 1;
}
//头部插入
void PushFront(pSeqlist pSeq,DataType data)
{
int i =0;
assert(pSeq);//先检验参数是否合格
if(pSeq->size >= MAX_SIZE)//判断顺序表是否 已满??
{
printf("Seqlist has been full\n");
return ;
}
for(i = pSeq->size;i>0;--i)//将当前顺序表的数据向后移一位
{
pSeq->arr[i] = pSeq->arr[i-1];
}
pSeq->arr[0] = data;//为头部附上要插入的值;
pSeq->size++; //当前的顺序表长度加 1;
}
//头部删除
void PopFront(pSeqlist pSeq)
{
int i = 0;
assert(pSeq);
if(pSeq->size ==0)//判断顺序表是否为空
{
printf("Seqlist has been empty\n");
return ;
}
pSeq->size--;//当前长度减1;
for(i = 0;i < pSeq->size;++i)//当前顺序表的数据(除了头部)向前移一位
{
pSeq->arr[i] = pSeq->arr[i+1];
}
}
//插入数据
void Insert(pSeqlist pSeq,int pos,DataType data)
{
int i = 0;
assert(pSeq &&(pos>=0)&&(pos<=pSeq->size));//断言参数 ,插入的位置要合法
if(pSeq->size >= MAX_SIZE)//判断顺序表是否已满???
{
printf("Seqlist has been full\n");
return ;
}
for(i = pSeq->size;i > pos;--i)//把插入的位置 之后的数据向后移一位
{
pSeq->arr[i] = pSeq->arr[i-1];
}
pSeq->arr[pos] = data;//为要插入的复制
pSeq->size++;
}
//按位置删除
void Erase(pSeqlist pSeq,int pos)
{
int i = 0 ;
assert(pSeq &&(pos>=0)&&(pos<=pSeq->size));//断言参数 ,删除的位置要合法
if(pSeq->size ==0)//判断顺序表的是否为空
{
printf("Seqlist has been empty\n");
return;
}
pSeq->size--;
for(i = pos ;i < pSeq->size;++i)//将删除的位置 以后的数据全部向前移一位
{
pSeq->arr[i]= pSeq->arr[i+1];
}
}
//查找
int Find(pSeqlist pSeq,DataType data)
{
int i = 0;
assert(pSeq);
if(pSeq->size ==0)//判断顺序表是否为空
{
printf("Seqlist has been empty\n");
return -1;
}
for(i = 0;i < pSeq->size;++i)//判断顺序表中的数据是否存在
{
if(pSeq->arr[i] ==data)
return i;//存在的话 返回下标
}
if(i == pSeq->size)
{
printf("Not find\n");
return -1;
}
}
//按内容删除
void Remove(pSeqlist pSeq,DataType data)
{
int i = 0;
assert(pSeq);
if(pSeq->size ==0)
{
printf("Seqlist has been empty\n");
return ;
}
for(i = 0;i<pSeq->size;++i)
{
if(pSeq->arr[i] ==data)//找到数据
{
int j = 0;
--pSeq->size;//删除数据
for(j =i ;j<pSeq->size;++j)//将之后的数据向前移一位
{
pSeq->arr[j] =pSeq->arr[j +1];
}
return ;
}
}
printf("Seqlist does not the data\n");//,没找到要删除的数
}
//按内容彻底删除
void RemoveAll(pSeqlist pSeq,DataType data)
{
int i = 0;
int temp = 0;
assert(pSeq);
if(pSeq->size ==0)
{
printf("Seqlist has been empty\n");
return ;
}
flag:
for(i = 0;i<pSeq->size;++i)
{
temp = pSeq->size;
if(pSeq->arr[i] ==data)
{
int j = 0;
--pSeq->size;
for(j =i ;j<pSeq->size;++j)
{
pSeq->arr[j] =pSeq->arr[j +1];
}
break;
}
}
if(i != temp)//如果么有删除完 ,回去继续删除
goto flag;
}
//判断线性表是否为空
int IsEmpty(pSeqlist pSeq)// 0为空
{
assert(pSeq);
if(pSeq->size ==0)
{
printf("Seqlist has been empty\n");
return 0;
}
return 1;
}
//打印线性表
void PrintSeqlist(pSeqlist pSeq)
{
int i = 0;
assert(pSeq);
for(i = 0 ;i < pSeq->size;++i)
{
printf("%d ",pSeq->arr[i]);
}
printf("\n");
}